Behavior.st
author claus
Thu, 02 Jun 1994 13:18:37 +0200
changeset 82 0147b4f725ae
parent 81 e02c66a7296f
child 88 81dacba7a63a
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#Behavior
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    14
       instanceVariableNames:'superclass otherSuperclasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    15
                              selectors methods
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
                              instSize flags'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
       category:'Kernel-Classes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
Behavior comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    24
COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    27
NOTICE: layout known by compiler and runtime system; be careful when changing
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    28
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
    29
$Header: /cvs/stx/stx/libbasic/Behavior.st,v 1.15 1994-06-02 11:18:37 claus Exp $
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    30
written Dec 88 by claus
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    31
'!
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    32
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    33
!Behavior class methodsFor:'documentation'!
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    34
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    35
documentation
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    36
"
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    37
    Every class in the system inherits from Behavior (via Class, ClassDescription);
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    38
    so here is where most of the class messages end up being implemented.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    39
    (to answer a FAQ: 'Point basicNew' will be done here :-)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    40
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    41
    Beginners should keep in mind, that all classes are instances of Behavior
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    42
    thus, you will find the above mentioned 'basicNew:' method under the 'instance'-
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    43
    methods of Behavior - NOT under the class methods ('Behavior new' will create
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    44
    a new class).
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    45
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    46
    Behavior provides minimum support for all classes - additional stuff is
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    47
    found in ClassDescription and Class. Behaviors provides all mechanisms needed
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    48
    to create instances, and send messages to those. However, Behavior does not provide 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    49
    all the (symbolic) information needed to compile methods for a class or to get
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    50
    useful information in inspectors.
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    51
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    52
    In contrast to other ST implementations, the methods have been separated
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    53
    from the selectors (there is no Dictionary, but two separate Arrays)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    54
    - this avoids the need for knowledge about Dictionaries in the runtime library (VM)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    55
    (lookup and search in these is seldom anyway, so the added benefit from using a 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    56
     hashed dictionary is almost void).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    58
    Instance variables:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    60
        superclass        <Class>           the receivers superclass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    61
        otherSuperclasses <Array of Class>  experimental: other superclasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    62
        selectors         <Array of Symbol> the selectors for which inst-methods are defined here
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    63
        methods           <Array of Method> the inst-methods corresponding to the selectors
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    64
        instSize          <SmallInteger>    the number of instance variables
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    65
        flags             <SmallInteger>    special flag bits coded in a number
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
    67
    flag bits (see stc.h):
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    68
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    69
    NOTICE: layout known by compiler and runtime system; be careful when changing
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    70
"
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    71
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    73
!Behavior class methodsFor:'queries'!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    74
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    75
isBuiltInClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    76
    "this class is known by the run-time-system"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    77
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    78
    ^ true
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    79
! !
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    80
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
!Behavior class methodsFor:'creating new classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
    "creates and return a new class"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
    |newClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
    newClass := self basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
    newClass setSuperclass:Object
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
                 selectors:(Array new:0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
                   methods:(Array new:0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
                  instSize:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
                     flags:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
!Behavior methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
    "to catch initialize for classes which do not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
reinitialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
    "to catch reinitialize for classes which do not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   111
!Behavior methodsFor:'copying'!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   112
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   113
deepCopy
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   114
    "return a deep copy of the receiver
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   115
     - return the receiver here - time will show if this is ok"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   116
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   117
    ^ self
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   118
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   119
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   120
deepCopyUsing:aDictionary
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   121
    "return a deep copy of the receiver
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   122
     - return the receiver here - time will show if this is ok"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   123
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   124
    ^ self
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   125
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   126
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   127
simpleDeepCopy
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   128
    "return a deep copy of the receiver
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   129
     - return the receiver here - time will show if this is ok"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   130
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   131
    ^ self
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   132
! !
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   133
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
!Behavior methodsFor:'creating an instance of myself'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
uninitializedNew
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   137
    "same as new - only redefined in ByteArray"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    ^ self basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
uninitializedNew:anInteger
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   143
    "same as new:anInteger - only redefined in ByteArray"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
    "return an instance of myself without indexed variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
    ^ self basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
new:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    "return an instance of myself with anInteger indexed variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
basicNew
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   161
    "return an instance of myself without indexed variables.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
     If the receiver-class has indexed instvars, the new object will have
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   163
     a basicSize of zero - i.e. 'aClass basicNew' is equivalent to 'aClass basicNew:0'.
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   164
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
     ** Do not redefine this method in any class **"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   169
    OBJ new();
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   170
    REGISTER OBJ newobj;
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   171
    REGISTER char *nextPtr;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    int instsize;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
    REGISTER int nInstVars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   175
    /*
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   176
     * the following ugly code is nothing more than a new() followed
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   177
     * by a nilling of the new instance.
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   178
     * unrolled for a bit more speed since this is one of the central object allocation
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   179
     * methods in the system
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   180
     */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
    nInstVars = _intVal(_INST(instSize));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   183
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   184
    newobj = (OBJ) newNextPtr;
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   185
    nextPtr = ((char *)newobj) + instsize;
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   186
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   187
    /*
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   188
     * dont argue about the goto and the arrangement below - it saves 
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   189
     * an extra nil-compare and branch in the common case ...
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   190
     */
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   191
    if (nextPtr < newEndPtr) {
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   192
        _objPtr(newobj)->o_size = instsize;
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   193
        /* o_allFlags(newobj) = 0;		*/
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   194
        /* _objPtr(newobj)->o_space = newSpace; */
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   195
        o_setAllFlags(newobj, newSpace);
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   196
        if (instsize & (ALIGN-1)) {
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   197
            newNextPtr = (char *)newobj + (instsize & ~(ALIGN-1)) + ALIGN;
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   198
        } else {
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   199
            newNextPtr = nextPtr;
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   200
        }
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   201
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   202
ok:
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   203
        _InstPtr(newobj)->o_class = self;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   204
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   205
        if (nInstVars) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   206
#if defined(memset4)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   207
            memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   208
#else
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   209
# if !defined(NEGATIVE_ADDRESSES)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   210
            REGISTER OBJ *op;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   211
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   212
            op = _InstPtr(newobj)->i_instvars;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   213
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   214
            /*
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   215
             * knowing that nil is 0
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   216
             */
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   217
#  if defined(FAST_MEMSET_DOUBLES_UNROLLED)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   218
	    if (nInstVars > 4) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   219
                *op++ = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   220
	        nInstVars--;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   221
	        while (nInstVars >= 8) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   222
		    *(double *)op = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   223
		    ((double *)op)[1] = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   224
		    ((double *)op)[2] = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   225
		    ((double *)op)[3] = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   226
		    op = (OBJ *)(((char *)op) + (sizeof(double)*4));
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   227
		    nInstVars -= 8;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   228
	        }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   229
	    }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   230
	    while (nInstVars) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   231
	        *op++ = 0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   232
	        nInstVars--;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   233
	    }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   234
#  else
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   235
#   if defined(FAST_MEMSET_WORDS_UNROLLED)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   236
            while (nInstVars >= 8) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   237
                *op = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   238
                *(op+1) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   239
                *(op+2) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   240
                *(op+3) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   241
                *(op+4) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   242
                *(op+5) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   243
                *(op+6) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   244
                *(op+7) = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   245
                op += 8;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   246
                nInstVars -= 8;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   247
            }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   248
	    while (nInstVars) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   249
	        *op++ = 0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   250
	        nInstVars--;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   251
	    }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   252
#   else
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   253
#    if defined(FAST_MEMSET)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   254
            memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   255
#    else
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   256
            do {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   257
                *op++ = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   258
            } while (--nInstVars);
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   259
#    endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   260
#   endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   261
#  endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   262
# else /* nil could be ~~ 0 */
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   263
            REGISTER OBJ *op;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   264
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   265
            op = _InstPtr(newobj)->i_instvars;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   266
    
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   267
            do {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   268
                *op++ = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   269
            } while (--nInstVars);
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   270
# endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   271
#endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   272
        }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   273
        RETURN ( newobj );
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   274
    }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   275
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   276
    PROTECT_CONTEXT
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   277
    newobj = new(instsize, SENDER);
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   278
    UNPROTECT_CONTEXT
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   279
    if (newobj != nil) goto ok;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
%}
2
claus
parents: 1
diff changeset
   281
.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   282
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   283
     memory allocation failed.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   284
     When we arrive here, there was no memory, even after
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   285
     a garbage collect. This means, that the VM wanted to
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   286
     get some more memory from the Operatingsystem, which
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   287
     was not kind enough to give some
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   288
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   289
    ObjectMemory allocationFailureSignal raise.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   290
    ^ nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
    "return an instance of myself with anInteger indexed variables.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
     If the receiver-class has no indexed instvars, this is only allowed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
     if the argument, anInteger is zero.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
     ** Do not redefine this method in any class **"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
    OBJ newobj;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
    INT instsize, nInstVars, nindexedinstvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
    INT flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
#if ! defined(FAST_MEMSET) || defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    REGISTER char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
    short *sp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
    long *lp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
    REGISTER OBJ *op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
    float *fp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
    double *dp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
    extern OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
    if (_isSmallInteger(anInteger)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
        nindexedinstvars = _intVal(anInteger);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
        if (nindexedinstvars >= 0) {
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   317
            PROTECT_CONTEXT
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
            nInstVars = _intVal(_INST(instSize));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
            flags = _intVal(_INST(flags)) & ARRAYMASK;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
            switch (flags) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
                case BYTEARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(char);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
                    _qNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   324
                    UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   325
                    if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   326
                        break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   327
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
#if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
                    cp = (char *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
                    while (nindexedinstvars >= sizeof(long)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
                        *(long *)cp = 0;
2
claus
parents: 1
diff changeset
   341
                        cp += sizeof(long);
claus
parents: 1
diff changeset
   342
                        nindexedinstvars -= sizeof(long);
claus
parents: 1
diff changeset
   343
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
                        *cp++ = '\0';
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
                case WORDARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(short);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
                    _qNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   353
                    UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   354
                    if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   355
                        break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   356
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
#if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
                    sp = (short *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
                        *sp++ = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
               case LONGARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(long);
2
claus
parents: 1
diff changeset
   376
                    _qAlignedNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   377
                    UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   378
                    if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   379
                        break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   380
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
#if defined(memset4) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
                    memset4(_InstPtr(newobj)->i_instvars, 0, nInstVars + nindexedinstvars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
                    lp = (long *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
                        *lp++ = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
               case FLOATARRAY:
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   406
                    instsize = sizeof(struct floatArray) + 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   407
                               nInstVars * sizeof(OBJ) + 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   408
                               (nindexedinstvars - 1) * sizeof(float);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   409
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
                    _qNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   411
                    UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   412
                    if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   413
                        break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   414
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
                    fp = (float *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
                        *fp++ = 0.0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
               case DOUBLEARRAY:
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   426
                    instsize = sizeof(struct doubleArray) + 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   427
                               nInstVars * sizeof(OBJ) + 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   428
                               (nindexedinstvars - 1) * sizeof(double);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   429
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   430
                    _qAlignedNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   431
                    UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   432
                    if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   433
                        break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   434
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
                        *op++ = nil;
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   439
#ifdef NEED_DOUBLE_ALIGN
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   440
                    /*
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   441
                     * care for double alignment
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   442
                     */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   443
                    if ((INT)op & (ALIGN-1)) {
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   444
                        *op++ = nil;
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   445
                    }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   446
#endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
                    dp = (double *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
                        *dp++ = 0.0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
                case WKPOINTERARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
                case POINTERARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
                    nInstVars += nindexedinstvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
                    _qAlignedNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   458
                    UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   459
                    if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   460
                        break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   461
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
#if defined(memset4)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
                    memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
#else
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   466
# if !defined(NEGATIVE_ADDRESSES)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
                     */
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   470
#  if defined(FAST_MEMSET_DOUBLES_UNROLLED)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   471
                    op = _InstPtr(newobj)->i_instvars;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   472
                    if (nInstVars > 4) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   473
                        *op++ = nil;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   474
                        nInstVars--;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   475
                        while (nInstVars >= 8) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   476
                            *(double *)op = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   477
                            ((double *)op)[1] = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   478
                            ((double *)op)[2] = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   479
                            ((double *)op)[3] = 0.0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   480
                            op = (OBJ *)(((char *)op) + (sizeof(double)*4));
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   481
                            nInstVars -= 8;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   482
                        }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   483
                    }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   484
                    while (nInstVars) {
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   485
                        *op++ = 0;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   486
                        nInstVars--;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   487
                    }
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   488
#  else
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   489
#   if defined(FAST_MEMSET)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   491
#   else
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
                        *op++ = nil;
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   495
#   endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   496
#  endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   497
# else
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   498
                    op = _InstPtr(newobj)->i_instvars;
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   499
		    while (nInstVars--)
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   500
			*op++ = nil;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
                default:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
                     * new:n for non-variable classes only allowed if
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
                     * n == 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
                    if (nindexedinstvars == 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
                        instsize = OHDR_SIZE + nInstVars * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
                        _qAlignedNew(newobj, instsize, SENDER);
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
   514
                        UNPROTECT_CONTEXT
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   515
                        if (newobj == nil) {
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   516
                            break;
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   517
                        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
                        _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
                        if (nInstVars) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
#if defined(memset4)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
                            memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
                            /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
                             * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
                             */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
                            memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
                            op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
                            do {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
                                *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
                            } while (--nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
                        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
                        RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
                    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
    }
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   542
%}.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   543
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   544
     arrive here if something went wrong ...
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   545
     figure out what it was
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   546
    "
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   547
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
    (anInteger isMemberOf:SmallInteger) ifFalse:[
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   549
        self error:'argument to new: must be Integer'.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   550
        ^ nil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   551
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   552
    (anInteger < 0) ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   553
        self error:'bad (negative) argument to new:'.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   554
        ^ nil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   555
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   556
    self isVariable ifFalse:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   557
        self error:'class has no indexed instvars - cannot create with new:'.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   558
        ^ nil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   559
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   560
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   561
     memory allocation failed.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   562
     When we arrive here, there was no memory, even after
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   563
     a garbage collect. This means, that the VM wanted to
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   564
     get some more memory from the Operatingsystem, which
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   565
     was not kind enough to give some
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   566
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   567
    ObjectMemory allocationFailureSignal raise.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   568
    ^ nil
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   569
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   570
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   571
readFrom:aStream
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
   572
    "read an objects printed representation from the argument, aStream 
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
   573
     and return it. 
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   574
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   575
     The read object must be a kind of myself 
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
   576
     - to get any object, use 'Object readFrom:...',
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
   577
       to get any number, use 'Number readFrom:...' and so on.
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   578
     This is the reverse operation to 'storeOn:'.
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
   579
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   580
     WARNING: storeOn: does not handle circular references and multiple 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   581
              references to the same object - use #storeBinary: for this."
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   582
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   583
    |newObject|
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   584
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   585
    newObject := self compiler evaluate:aStream.
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   586
    (newObject isKindOf:self) ifFalse:[
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   587
        self error:('expected ' , self name)
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   588
    ].
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   589
    ^ newObject
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   590
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   591
    "|s|
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   592
     s := WriteStream on:String new.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   593
     #(1 2 3 4) storeOn:s.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   594
     Object readFrom:(ReadStream on:s contents)  
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   595
    "
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   596
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   597
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   598
readFromString:aString
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   599
    "create an object from its printed representation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   600
     (i.e. recreate what was stored using storeOn: or storeString).
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   601
     See warning in Behavior>>readFrom:"
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   602
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   603
    ^ self readFrom:(ReadStream on:aString)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
10
claus
parents: 5
diff changeset
   606
!Behavior methodsFor:'autoload check'!
claus
parents: 5
diff changeset
   607
claus
parents: 5
diff changeset
   608
isLoaded
claus
parents: 5
diff changeset
   609
    "return true, if the class has been loaded; 
claus
parents: 5
diff changeset
   610
     redefined in Autoload; see comment there"
claus
parents: 5
diff changeset
   611
claus
parents: 5
diff changeset
   612
    ^ true
claus
parents: 5
diff changeset
   613
!
claus
parents: 5
diff changeset
   614
claus
parents: 5
diff changeset
   615
autoload
claus
parents: 5
diff changeset
   616
    "force autoloading - do nothing here; 
claus
parents: 5
diff changeset
   617
     redefined in Autoload; see comment there"
claus
parents: 5
diff changeset
   618
claus
parents: 5
diff changeset
   619
    ^ self
claus
parents: 5
diff changeset
   620
! !
claus
parents: 5
diff changeset
   621
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   622
!Behavior class methodsFor:'flag bit constants'!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   623
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   624
flagNotIndexed
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   625
    "return the flag code for non-indexed instances"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   626
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   627
    ^ 0
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   628
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   629
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   630
flagBytes
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   631
    "return the flag code for byte-valued indexed instances"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   632
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   633
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   634
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   635
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   636
    RETURN ( _MKSMALLINT( BYTEARRAY ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   637
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   638
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   639
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   640
flagWords
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   641
    "return the flag code for word-valued indexed instances (i.e. 2-byte)"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   642
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   643
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   644
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   645
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   646
    RETURN ( _MKSMALLINT( WORDARRAY ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   647
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   648
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   649
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   650
flagLongs
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   651
    "return the flag code for long-valued indexed instances (i.e. 4-byte)"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   652
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   653
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   654
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   655
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   656
    RETURN ( _MKSMALLINT( LONGARRAY ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   657
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   658
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   659
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   660
flagFloats
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   661
    "return the flag code for float-valued indexed instances (i.e. 4-byte reals)"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   662
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   663
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   664
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   665
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   666
    RETURN ( _MKSMALLINT( FLOATARRAY ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   667
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   668
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   669
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   670
flagDoubles
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   671
    "return the flag code for double-valued indexed instances (i.e. 8-byte reals)"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   672
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   673
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   674
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   675
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   676
    RETURN ( _MKSMALLINT( DOUBLEARRAY ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   677
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   678
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   679
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   680
flagPointers
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   681
    "return the flag code for pointer indexed instances (i.e. Array of object)"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   682
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   683
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   684
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   685
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   686
    RETURN ( _MKSMALLINT( POINTERARRAY ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   687
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   688
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   689
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   690
maskIndexType
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   691
    "return a mask to extract all index-type bits"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   692
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   693
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   694
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   695
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   696
    RETURN ( _MKSMALLINT( ARRAYMASK ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   697
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   698
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   699
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   700
flagBlock
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   701
    "return the flag code which marks Block-type instances"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   702
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   703
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   704
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   705
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   706
    RETURN ( _MKSMALLINT( BLOCK_INSTS ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   707
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   708
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   709
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   710
flagMethod
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   711
    "return the flag code which marks Method-type instances"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   712
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   713
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   714
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   715
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   716
    RETURN ( _MKSMALLINT( METHOD_INSTS ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   717
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   718
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   719
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   720
flagContext
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   721
    "return the flag code which marks Context-type instances"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   722
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   723
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   724
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   725
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   726
    RETURN ( _MKSMALLINT( CONTEXT_INSTS ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   727
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   728
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   729
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   730
flagBlockContext
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   731
    "return the flag code which marks BlockContext-type instances"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   732
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   733
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   734
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   735
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   736
    RETURN ( _MKSMALLINT( BCONTEXT_INSTS ) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   737
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   738
! !
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   739
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
!Behavior methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   741
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
    "return the receivers superclass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
a27a279701f8 Initial revision
claus
parents:
diff changeset
   745
    ^ superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   748
selectorArray 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   749
    "return the receivers selector array.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   750
     Notice: this is not compatible with ST-80."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
a27a279701f8 Initial revision
claus
parents:
diff changeset
   752
    ^ selectors
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   755
methodArray
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   756
    "return the receivers method array.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   757
     Notice: this is not compatible with ST-80."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
    ^ methods
a27a279701f8 Initial revision
claus
parents:
diff changeset
   760
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
methodDictionary
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   763
    "return the receivers method dictionary. 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   764
     Since no dictionary is actually present, create one for ST-80 compatibility."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   765
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   766
    |dict|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   768
    dict := IdentityDictionary new.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   769
    1 to:selectors size do:[:index |
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   770
        dict at:(selectors at:index) put:(methods at:index)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   771
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   772
    ^ dict
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
instSize
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   776
    "return the number of instance variables of the receiver.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   777
     This includes all superclass instance variables."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
    ^ instSize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
flags
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
    "return the receivers flag bits"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
    ^ flags
a27a279701f8 Initial revision
claus
parents:
diff changeset
   786
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
isVariable
a27a279701f8 Initial revision
claus
parents:
diff changeset
   789
    "return true, if instances have indexed instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   791
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   792
        ^ (flags bitAnd:(Behavior maskIndexType)) ~~ 0
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   793
     "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   794
a27a279701f8 Initial revision
claus
parents:
diff changeset
   795
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   796
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   799
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   800
a27a279701f8 Initial revision
claus
parents:
diff changeset
   801
isFixed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   802
    "return true, if instances do not have indexed instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   803
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   804
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   805
        ^ self isVariable not
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   806
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   807
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   808
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   809
a27a279701f8 Initial revision
claus
parents:
diff changeset
   810
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? false : true ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   811
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   812
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   813
a27a279701f8 Initial revision
claus
parents:
diff changeset
   814
isBits
a27a279701f8 Initial revision
claus
parents:
diff changeset
   815
    "return true, if instances have indexed byte or short instance variables.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   816
     Ignore long, float and double arrays, since ST-80 code using isBits are probably
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   817
     not prepared to handle them correctly."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   818
a27a279701f8 Initial revision
claus
parents:
diff changeset
   819
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   820
a27a279701f8 Initial revision
claus
parents:
diff changeset
   821
    REGISTER int flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   822
a27a279701f8 Initial revision
claus
parents:
diff changeset
   823
    RETURN ( (((flags = (_intVal(_INST(flags)) & ARRAYMASK)) == BYTEARRAY)
2
claus
parents: 1
diff changeset
   824
             || (flags == WORDARRAY)) ? true : false ); 
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   825
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   826
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   827
a27a279701f8 Initial revision
claus
parents:
diff changeset
   828
isBytes
a27a279701f8 Initial revision
claus
parents:
diff changeset
   829
    "return true, if instances have indexed byte instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   830
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   831
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   832
        ^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagBytes
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   833
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   834
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   835
a27a279701f8 Initial revision
claus
parents:
diff changeset
   836
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == BYTEARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   837
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   838
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   839
a27a279701f8 Initial revision
claus
parents:
diff changeset
   840
isWords
a27a279701f8 Initial revision
claus
parents:
diff changeset
   841
    "return true, if instances have indexed short instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   842
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   843
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   844
        ^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagWords
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   845
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   846
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   847
a27a279701f8 Initial revision
claus
parents:
diff changeset
   848
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == WORDARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   849
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   850
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   851
a27a279701f8 Initial revision
claus
parents:
diff changeset
   852
isLongs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   853
    "return true, if instances have indexed long instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   854
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   855
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   856
        ^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagLongs
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   857
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   858
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   859
a27a279701f8 Initial revision
claus
parents:
diff changeset
   860
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == LONGARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   861
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   862
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   863
a27a279701f8 Initial revision
claus
parents:
diff changeset
   864
isFloats
a27a279701f8 Initial revision
claus
parents:
diff changeset
   865
    "return true, if instances have indexed float instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   866
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   867
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   868
        ^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagFloats
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   869
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   870
%{  /* NOCONTEXT */
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   871
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   872
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == FLOATARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   873
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   874
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   875
a27a279701f8 Initial revision
claus
parents:
diff changeset
   876
isDoubles
a27a279701f8 Initial revision
claus
parents:
diff changeset
   877
    "return true, if instances have indexed double instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   878
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   879
    "this could be defined as:
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   880
        ^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagDoubles
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   881
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   882
%{  /* NOCONTEXT */
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   883
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   884
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == DOUBLEARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   885
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   886
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   887
a27a279701f8 Initial revision
claus
parents:
diff changeset
   888
isPointers
2
claus
parents: 1
diff changeset
   889
    "return true, if instances have pointer instance variables 
claus
parents: 1
diff changeset
   890
     i.e. are either non-indexed or have indexed pointer variables"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   891
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   892
    "QUESTION: should we ignore WeakPointers ?"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   893
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   894
%{  /* NOCONTEXT */
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   895
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   896
    REGISTER int flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   897
2
claus
parents: 1
diff changeset
   898
    flags = _intVal(_INST(flags)) & ARRAYMASK;
claus
parents: 1
diff changeset
   899
    switch (flags) {
claus
parents: 1
diff changeset
   900
        default:
claus
parents: 1
diff changeset
   901
            /* normal objects */
claus
parents: 1
diff changeset
   902
            RETURN ( true );
claus
parents: 1
diff changeset
   903
claus
parents: 1
diff changeset
   904
        case BYTEARRAY:
claus
parents: 1
diff changeset
   905
        case WORDARRAY:
claus
parents: 1
diff changeset
   906
        case LONGARRAY:
claus
parents: 1
diff changeset
   907
        case FLOATARRAY:
claus
parents: 1
diff changeset
   908
        case DOUBLEARRAY:
claus
parents: 1
diff changeset
   909
            RETURN (false );
claus
parents: 1
diff changeset
   910
claus
parents: 1
diff changeset
   911
        case WKPOINTERARRAY:
claus
parents: 1
diff changeset
   912
            /* what about those ? */
claus
parents: 1
diff changeset
   913
            RETURN (true );
claus
parents: 1
diff changeset
   914
    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   915
%}
2
claus
parents: 1
diff changeset
   916
!
claus
parents: 1
diff changeset
   917
claus
parents: 1
diff changeset
   918
superclass:aClass
claus
parents: 1
diff changeset
   919
    "set the superclass - this actually creates a new class,
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   920
     recompiling all methods for the new one. The receiving class stays
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   921
     around anonymous to allow existing instances some life.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   922
     This may change in the future (adjusting existing instances)"
2
claus
parents: 1
diff changeset
   923
claus
parents: 1
diff changeset
   924
    "must flush caches since lookup chain changes"
claus
parents: 1
diff changeset
   925
    ObjectMemory flushCaches.
10
claus
parents: 5
diff changeset
   926
2
claus
parents: 1
diff changeset
   927
"
claus
parents: 1
diff changeset
   928
    superclass := aClass
claus
parents: 1
diff changeset
   929
"
claus
parents: 1
diff changeset
   930
    "for correct recompilation, just create a new class ..."
claus
parents: 1
diff changeset
   931
claus
parents: 1
diff changeset
   932
    aClass subclass:(self name)
claus
parents: 1
diff changeset
   933
           instanceVariableNames:(self instanceVariableString)
claus
parents: 1
diff changeset
   934
           classVariableNames:(self classVariableString)
claus
parents: 1
diff changeset
   935
           poolDictionaries:''
claus
parents: 1
diff changeset
   936
           category:self category
claus
parents: 1
diff changeset
   937
!
claus
parents: 1
diff changeset
   938
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   939
addSuperclass:aClass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   940
    "EXPERIMENTAL: add aClass to the set of classes, from which instances
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   941
     inherit protocol."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   942
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   943
    "first, check if the class is abstract - 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   944
     allows abstract mixins are allowed in the current implementation"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   945
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   946
    aClass instSize == 0 ifFalse:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   947
        self error:'only abstract mixins allowed'.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   948
        ^ self
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   949
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   950
    otherSuperclasses isNil ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   951
        otherSuperclasses := Array with:aClass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   952
    ] ifFalse:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   953
        otherSuperclasses := otherSuperclasses copyWith:aClass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   954
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   955
    ObjectMemory flushCaches
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   956
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   957
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   958
removeSuperclass:aClass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   959
    "EXPERIMENTAL: add aClass to the set of classes, from which instances
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   960
     inherit protocol."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   961
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   962
    otherSuperclasses notNil ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   963
        otherSuperclasses := otherSuperclasses copyWithout:aClass.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   964
        otherSuperclasses isEmpty ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   965
            otherSuperclasses := nil
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   966
        ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   967
        ObjectMemory flushCaches
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   968
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   969
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   970
2
claus
parents: 1
diff changeset
   971
selectors:selectorArray methods:methodArray
claus
parents: 1
diff changeset
   972
    "set both selector array and method array of the receiver,
claus
parents: 1
diff changeset
   973
     and flush caches"
claus
parents: 1
diff changeset
   974
claus
parents: 1
diff changeset
   975
    ObjectMemory flushCaches.
claus
parents: 1
diff changeset
   976
    selectors := selectorArray.
claus
parents: 1
diff changeset
   977
    methods := methodArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   978
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   979
a27a279701f8 Initial revision
claus
parents:
diff changeset
   980
!Behavior methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   981
a27a279701f8 Initial revision
claus
parents:
diff changeset
   982
isBehavior
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   983
    "return true, if the receiver is describing another objects behavior,
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
   984
     i.e. is a class. Defined to avoid the need to use isKindOf:"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   985
a27a279701f8 Initial revision
claus
parents:
diff changeset
   986
    ^ true
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
   987
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
   988
    "True isBehavior"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
   989
    "true isBehavior"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   990
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   991
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   992
canBeSubclassed
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   993
    "return true, if its allowed to create subclasses of the receiver.
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   994
     This method is redefined in SmallInteger and UndefinedObject, since
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   995
     instances are detected by their pointer-fields, i.e. they do not have
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   996
     a class entry (you dont have to understand this :-)"
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   997
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   998
    ^ true
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   999
!
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1000
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1001
hasMultipleSuperclasses
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1002
    "Return true, if this class inherits from other classes 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1003
     (beside its primary superclass). 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1004
     This method is a preparation for a future multiple inheritance extension 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1005
     - currently it is not supported by the VM"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1006
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1007
    ^ otherSuperclasses notNil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1008
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1009
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1010
superclasses
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1011
    "return a collection of the receivers immediate superclasses.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1012
     This method is a preparation for a future multiple inheritance extension 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1013
     - currently it is not supported by the VM"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1014
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1015
    otherSuperclasses notNil ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1016
        ^ (Array with:superclass) , otherSuperclasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1017
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1018
    ^ Array with:superclass
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1019
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1020
    "String superclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1021
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1022
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1023
allSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1024
    "return a collection of the receivers accumulated superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1025
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1026
    |aCollection theSuperClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1027
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1028
    theSuperClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1029
    theSuperClass notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1030
        aCollection := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1031
        [theSuperClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1032
            aCollection add:theSuperClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1033
            theSuperClass := theSuperClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1034
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1035
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1036
    ^ aCollection
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1037
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1038
    "String allSuperclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1039
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1040
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1041
withAllSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1042
    "return a collection containing the receiver and all
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1043
     of the receivers accumulated superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1044
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1045
    |aCollection theSuperClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1046
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1047
    aCollection := OrderedCollection with:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1048
    theSuperClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1049
    [theSuperClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1050
        aCollection add:theSuperClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1051
        theSuperClass := theSuperClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1052
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1053
    ^ aCollection
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1054
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1055
    "String withAllSuperclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1056
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1057
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1058
subclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1059
    "return a collection of the direct subclasses of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1060
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1061
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1062
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1063
    newColl := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1064
    self subclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1065
        newColl add:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1066
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1067
    ^ newColl
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1068
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1069
    "Collection subclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1070
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1071
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1072
allSubclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1073
    "return a collection of all subclasses (direct AND indirect) of
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1074
     the receiver. There will be no specific order, in which entries
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1075
     are returned."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1076
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1077
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1078
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1079
    newColl := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1080
    self allSubclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1081
        newColl add:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1082
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1083
    ^ newColl
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1084
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1085
    "Collection allSubclasses"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1086
!
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1087
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1088
allSubclassesInOrder
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1089
    "return a collection of all subclasses (direct AND indirect) of
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1090
     the receiver. Higher level subclasses will come before lower ones."
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1091
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1092
    |newColl|
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1093
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1094
    newColl := OrderedCollection new.
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1095
    self allSubclassesInOrderDo:[:aClass |
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1096
        newColl add:aClass
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1097
    ].
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1098
    ^ newColl
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1099
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1100
    "Collection allSubclassesInOrder"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1101
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1102
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1103
withAllSubclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1104
    "return a collection containing the receiver and 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1105
     all subclasses (direct AND indirect) of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1106
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1107
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1108
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1109
    newColl := OrderedCollection with:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1110
    self allSubclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1111
        newColl add:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1112
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1113
    ^ newColl
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1114
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1115
    "Collection withAllSubclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1116
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1117
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1118
isSubclassOf:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1119
    "return true, if I am a subclass of the argument, aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1120
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1121
    |theClass|
2
claus
parents: 1
diff changeset
  1122
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1123
    theClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1124
    [theClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1125
        (theClass == aClass) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1126
        theClass := theClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1127
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1128
    ^ false
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1129
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1130
    "String isSubclassOf:Collection"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1131
    "LinkedList isSubclassOf:Array"
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1132
    "1 isSubclassOf:Number"     "will fail since 1 is no class"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1133
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1134
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1135
allInstances
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1136
    "return a collection of all my instances"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1137
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1138
    |coll|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1139
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1140
    coll := OrderedCollection new.
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1141
    self allInstancesDo:[:anObject |
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1142
        coll add:anObject
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1143
    ].
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1144
    ^ coll 
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1145
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1146
    "ScrollBar allInstances"
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1147
!
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1148
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1149
allDerivedInstances
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1150
    "return a collection of all instances of myself and 
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1151
     instances of all subclasses of myself"
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1152
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1153
    |coll|
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1154
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1155
    coll := OrderedCollection new.
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1156
    self allDerivedInstancesDo:[:anObject |
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1157
        (anObject isKindOf:self) ifTrue:[
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1158
            coll add:anObject
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1159
        ]
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1160
    ].
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1161
    ^ coll 
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1162
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  1163
    "View allDerivedInstances"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1164
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1165
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1166
instanceCount
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1167
    "return the number of instances of myself"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1168
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1169
    |count|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1170
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1171
    count := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1172
    ObjectMemory allObjectsDo:[:anObject |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1173
        (anObject class == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1174
            count := count + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1175
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1176
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1177
    ^ count
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1178
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1179
    "View instanceCount"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1180
!
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1181
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1182
derivedInstanceCount
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1183
    "return the number of instances of myself and of subclasses"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1184
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1185
    |count|
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1186
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1187
    count := 0.
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1188
    ObjectMemory allObjectsDo:[:anObject |
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1189
        (anObject isKindOf:self) ifTrue:[
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1190
            count := count + 1
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1191
        ]
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1192
    ].
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1193
    ^ count
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1194
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1195
    "View derivedInstanceCount"
2
claus
parents: 1
diff changeset
  1196
!
claus
parents: 1
diff changeset
  1197
claus
parents: 1
diff changeset
  1198
selectorIndex:aSelector
claus
parents: 1
diff changeset
  1199
    "return the index in the arrays for given selector aSelector"
claus
parents: 1
diff changeset
  1200
claus
parents: 1
diff changeset
  1201
    ^ selectors identityIndexOf:aSelector startingAt:1
claus
parents: 1
diff changeset
  1202
!
claus
parents: 1
diff changeset
  1203
claus
parents: 1
diff changeset
  1204
compiledMethodAt:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1205
    "return the method for given selector aSelector or nil.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1206
     Only methods in the receiver - not in the superclass chain are tested."
2
claus
parents: 1
diff changeset
  1207
claus
parents: 1
diff changeset
  1208
    |index|
claus
parents: 1
diff changeset
  1209
claus
parents: 1
diff changeset
  1210
    index := selectors identityIndexOf:aSelector startingAt:1.
claus
parents: 1
diff changeset
  1211
    (index == 0) ifTrue:[^ nil].
claus
parents: 1
diff changeset
  1212
    ^ methods at:index
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1213
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1214
    "Object compiledMethodAt:#=="
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1215
    "(Object compiledMethodAt:#==) category"
2
claus
parents: 1
diff changeset
  1216
!
claus
parents: 1
diff changeset
  1217
claus
parents: 1
diff changeset
  1218
sourceCodeAt:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1219
    "return the methods source for given selector aSelector or nil.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1220
     Only methods in the receiver - not in the superclass chain are tested."
2
claus
parents: 1
diff changeset
  1221
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1222
    |method|
2
claus
parents: 1
diff changeset
  1223
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1224
    method := self compiledMethodAt:aSelector.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1225
    method isNil ifTrue:[^ nil].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1226
    ^ method source
2
claus
parents: 1
diff changeset
  1227
claus
parents: 1
diff changeset
  1228
    "True sourceCodeAt:#ifTrue:"
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1229
    "Object sourceCodeAt:#=="
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1230
    "Behavior sourceCodeAt:#sourceCodeAt:"
2
claus
parents: 1
diff changeset
  1231
!
claus
parents: 1
diff changeset
  1232
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1233
lookupMethodFor:aSelector
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1234
    "return the method, which would be executed if aSelector was sent to
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1235
     an instance of the receiver. I.e. the selector arrays of the receiver
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1236
     and all of its superclasses are searched for aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1237
     Return the method, or nil if instances do not understand aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1238
     EXPERIMENTAL: take care of multiple superclasses."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1239
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1240
    |m cls|
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1241
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1242
    cls := self.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1243
    [cls notNil] whileTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1244
        m := cls compiledMethodAt:aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1245
        m notNil ifTrue:[^ m].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1246
        cls hasMultipleSuperclasses ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1247
            cls superclasses do:[:aSuperClass |
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1248
                m := aSuperClass lookupMethodFor:aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1249
                m notNil ifTrue:[^ m].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1250
            ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1251
            ^ nil
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1252
        ] ifFalse:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1253
            cls := cls superclass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1254
        ]
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1255
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1256
    ^ nil
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1257
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1258
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1259
cachedLookupMethodFor:aSelector
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1260
    "return the method, which would be executed if aSelector was sent to
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1261
     an instance of the receiver. I.e. the selector arrays of the receiver
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1262
     and all of its superclasses are searched for aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1263
     Return the method, or nil if instances do not understand aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1264
     This interface provides exactly the same information as #lookupMethodFor:,
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1265
     but uses the lookup-cache in the VM for faster search. 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1266
     However, keep in mind, that doing a lookup through the cache also adds new
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1267
     entries and can thus slow down the system by polluting the cache with 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1268
     irrelevant entries. (do NOT loop over all objects calling this method).
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1269
     Does NOT (currently) handle MI"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1270
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1271
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1272
    extern OBJ lookup();
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1273
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1274
    RETURN ( lookup(self, aSelector, SENDER) );
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1275
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1276
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1277
    "String cachedLookupMethodFor:#="
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1278
    "String cachedLookupMethodFor:#asOrderedCollection"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1279
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1280
2
claus
parents: 1
diff changeset
  1281
hasMethods
claus
parents: 1
diff changeset
  1282
    "return true, if there are any (local) methods in this class"
claus
parents: 1
diff changeset
  1283
claus
parents: 1
diff changeset
  1284
    ^ (methods size ~~ 0)
10
claus
parents: 5
diff changeset
  1285
claus
parents: 5
diff changeset
  1286
    "True hasMethods"
claus
parents: 5
diff changeset
  1287
    "True class hasMethods"
2
claus
parents: 1
diff changeset
  1288
!
claus
parents: 1
diff changeset
  1289
claus
parents: 1
diff changeset
  1290
implements:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1291
    "return true, if the receiver implements aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1292
     (i.e. implemented in THIS class - NOT in a superclass).
10
claus
parents: 5
diff changeset
  1293
     Dont use this method to check if someone responds to a message -
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1294
     use #canUnderstand: on the class or #respondsTo: on the instance
10
claus
parents: 5
diff changeset
  1295
     to do this."
2
claus
parents: 1
diff changeset
  1296
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
  1297
    ^ (selectors identityIndexOf:aSelector startingAt:1) ~~ 0
2
claus
parents: 1
diff changeset
  1298
claus
parents: 1
diff changeset
  1299
    "True implements:#ifTrue:"
claus
parents: 1
diff changeset
  1300
    "True implements:#=="
claus
parents: 1
diff changeset
  1301
!
claus
parents: 1
diff changeset
  1302
claus
parents: 1
diff changeset
  1303
canUnderstand:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1304
    "return true, if the receiver or one of its superclasses implements aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1305
     (i.e. true if my instances understand aSelector)"
2
claus
parents: 1
diff changeset
  1306
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1307
    ^ (self lookupMethodFor:aSelector) notNil
10
claus
parents: 5
diff changeset
  1308
claus
parents: 5
diff changeset
  1309
    "True canUnderstand:#ifTrue:"
claus
parents: 5
diff changeset
  1310
    "True canUnderstand:#=="
claus
parents: 5
diff changeset
  1311
    "True canUnderstand:#do:"
2
claus
parents: 1
diff changeset
  1312
!
claus
parents: 1
diff changeset
  1313
claus
parents: 1
diff changeset
  1314
whichClassImplements:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1315
    "return the class in the inheritance chain, which implements the method
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1316
     for aSelector; return nil if none.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1317
     EXPERIMENTAL: handle multiple superclasses"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1318
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1319
    |cls|
2
claus
parents: 1
diff changeset
  1320
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1321
    cls := self.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1322
    [cls notNil] whileTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1323
        (cls implements:aSelector) ifTrue:[^ cls].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1324
        cls hasMultipleSuperclasses ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1325
            cls superclasses do:[:aSuperClass |
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1326
                |implementingClass|
2
claus
parents: 1
diff changeset
  1327
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1328
                implementingClass := aSuperClass whichClassImplements:aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1329
                implementingClass notNil ifTrue:[^ implementingClass].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1330
            ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1331
            ^ nil
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1332
        ] ifFalse:[
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1333
            cls := cls superclass
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1334
        ]
2
claus
parents: 1
diff changeset
  1335
    ].
claus
parents: 1
diff changeset
  1336
    ^ nil
claus
parents: 1
diff changeset
  1337
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1338
    "String whichClassImplements:#=="
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1339
    "String whichClassImplements:#collect:"
2
claus
parents: 1
diff changeset
  1340
!
claus
parents: 1
diff changeset
  1341
claus
parents: 1
diff changeset
  1342
inheritsFrom:aClass
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1343
    "return true, if the receiver inherits methods from aClass"
2
claus
parents: 1
diff changeset
  1344
claus
parents: 1
diff changeset
  1345
    ^ self isSubclassOf:aClass
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1346
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1347
    "True inheritsFrom:Object"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1348
    "LinkedList inheritsFrom:Array"
2
claus
parents: 1
diff changeset
  1349
!
claus
parents: 1
diff changeset
  1350
claus
parents: 1
diff changeset
  1351
selectorForMethod:aMethod
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1352
    "Return the selector for given method aMethod."
2
claus
parents: 1
diff changeset
  1353
claus
parents: 1
diff changeset
  1354
    |index|
claus
parents: 1
diff changeset
  1355
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
  1356
    index := methods identityIndexOf:aMethod startingAt:1.
2
claus
parents: 1
diff changeset
  1357
    (index == 0) ifTrue:[^ nil].
claus
parents: 1
diff changeset
  1358
    ^ selectors at:index
claus
parents: 1
diff changeset
  1359
!
claus
parents: 1
diff changeset
  1360
claus
parents: 1
diff changeset
  1361
containsMethod:aMethod
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1362
    "Return true, if the argument, aMethod is a method of myself"
2
claus
parents: 1
diff changeset
  1363
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
  1364
    ^ (methods identityIndexOf:aMethod startingAt:1) ~~ 0
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1365
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1366
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1367
!Behavior methodsFor:'private accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1368
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1369
setSuperclass:sup selectors:sels methods:m instSize:i flags:f
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1370
    "set some inst vars. 
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1371
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1372
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1373
     Do NOT use it."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1374
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1375
    superclass := sup.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1376
    selectors := sels.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1377
    methods := m.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1378
    instSize := i.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1379
    flags := f
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1380
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1381
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1382
setSuperclass:aClass
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1383
    "set the superclass of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1384
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1385
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1386
     Do NOT use it."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1387
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1388
    superclass := aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1389
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1390
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1391
setOtherSuperclasses:anArrayOfClasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1392
    "EXPERIMENTAL: set the other superclasses of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1393
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1394
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1395
     Do NOT use it."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1396
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1397
    otherSuperclasses := anArrayOfClasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1398
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1399
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1400
instSize:aNumber
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1401
    "set the instance size.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1402
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1403
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1404
     Do NOT use it."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1405
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1406
    instSize := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1407
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1408
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1409
flags:aNumber
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1410
    "set the flags.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1411
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1412
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1413
     Do NOT use it."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1414
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1415
    flags := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1416
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1417
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1418
setSelectorArray:anArray
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1419
    "set the selector array of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1420
     this method is for special uses only - there will be no recompilation
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1421
     and no change record written here.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1422
     NOT for general use."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1423
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1424
    selectors := anArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1425
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1426
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1427
setMethodArray:anArray
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1428
    "set the method array of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1429
     this method is for special uses only - there will be no recompilation
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1430
     and no change record written here.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1431
     NOT for general use."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1432
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1433
    methods := anArray
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1434
!
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1435
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1436
setMethodDictionary:aDictionary
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1437
    "set the receivers method dictionary. 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1438
     Since no dictionary is actually used, decompose into selector- and
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1439
     method arrays and set those. For ST-80 compatibility.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1440
     NOT for general use."
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1441
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1442
    |n selArray methodArray idx|
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1443
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1444
    n := aDictionary size.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1445
    selArray := Array new:n.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1446
    methodArray := Array new:n.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1447
    idx := 1.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1448
    aDictionary keysAndValuesDo:[:sel :method |
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1449
        selArray at:idx put:sel.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1450
        methodArray at:idx put:method.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1451
        idx := idx + 1
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1452
    ].
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1453
    selectors := selArray.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1454
    methods := methodArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1455
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1456
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1457
!Behavior methodsFor:'compiler interface'!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1458
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1459
compiler
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1460
    "return the compiler to use for this class - 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1461
     this can be redefined in special classes, to get classes with
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1462
     Lisp, Prolog, ASN1, Basic :-) or whatever syntax."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1463
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1464
    ^ Compiler
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1465
! !
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1466
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1467
!Behavior methodsFor:'enumeration'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1468
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1469
allInstancesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1470
    "evaluate aBlock for all of my instances"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1471
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1472
    ObjectMemory allObjectsDo:[:anObject |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1473
        (anObject class == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1474
            aBlock value:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1475
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1476
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1477
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1478
    "StandardSystemView allInstancesDo:[:v | Transcript showCr:(v name)]"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1479
!
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1480
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1481
allDerivedInstancesDo:aBlock
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1482
    "evaluate aBlock for all of my instances and all instances of subclasses"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1483
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1484
    ObjectMemory allObjectsDo:[:anObject |
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1485
        (anObject isKindOf:self) ifTrue:[
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1486
            aBlock value:anObject
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1487
        ]
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1488
    ]
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1489
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1490
    "StandardSystemView allDerivedInstancesDo:[:v | Transcript showCr:(v name)]"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1491
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1492
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1493
subclassesDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1494
    "evaluate the argument, aBlock for all immediate subclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1495
2
claus
parents: 1
diff changeset
  1496
    Smalltalk allBehaviorsDo:[:aClass |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1497
        (aClass superclass == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1498
            aBlock value:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1499
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1500
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1501
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1502
    "Collection subclassesDo:[:c | Transcript showCr:(c name)]"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1503
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1504
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1505
allSubclassesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1506
    "evaluate aBlock for all of my subclasses.
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1507
     There is no specific order, in which the entries are enumerated."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1508
2
claus
parents: 1
diff changeset
  1509
    Smalltalk allBehaviorsDo:[:aClass |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1510
        (aClass isSubclassOf:self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1511
            aBlock value:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1512
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1513
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1514
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1515
    "Collection allSubclassesDo:[:c | Transcript showCr:(c name)]"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1516
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1517
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1518
allSubclassesInOrderDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1519
    "evaluate aBlock for all of my subclasses.
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1520
     Higher level subclasses will be enumerated before the deeper ones"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1521
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1522
    self subclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1523
        aBlock value:aClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1524
        aClass allSubclassesInOrderDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1525
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1526
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1527
    "Collection allSubclassesInOrderDo:[:c | Transcript showCr:(c name)]"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1528
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1529
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1530
allSuperclassesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1531
    "evaluate aBlock for all of my superclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1532
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1533
    |theClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1534
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1535
    theClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1536
    [theClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1537
        aBlock value:theClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1538
        theClass := theClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1539
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1540
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1541
    "String allSuperclassesDo:[:c | Transcript showCr:(c name)]"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1542
! !
2
claus
parents: 1
diff changeset
  1543
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1544
!Behavior methodsFor:'binary storage'!
2
claus
parents: 1
diff changeset
  1545
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1546
readBinaryFrom:aStream
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1547
    "read an objects binary representation from the argument,
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1548
     aStream and return it. 
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1549
     The read object must be a kind of myself 
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1550
     - to get any object, use 'Object readBinaryFrom:...',
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1551
       to get any number, use 'Number readBinaryFrom:...' and so on.
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1552
     This is the reverse operation to 'storeBinaryOn:'. "
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1553
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1554
    |newObject|
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1555
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1556
    newObject := (BinaryInputManager new:1024) readFrom:aStream.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1557
    (newObject isKindOf:self) ifFalse:[
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1558
        self error:('expected ' , self name)
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1559
    ].
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1560
    ^ newObject
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1561
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1562
    "|s|
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1563
     s := WriteStream on:ByteArray new.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1564
     #(1 2 3 4) storeBinaryOn:s.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1565
     Object readBinaryFrom:(ReadStream on:s contents)  
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1566
    "
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1567
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1568
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1569
storeBinaryDefinitionOn: stream manager: manager
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1570
    "classes will store the name only and restore by looking for
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1571
     that name in the Smalltalk dictionary."
2
claus
parents: 1
diff changeset
  1572
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1573
    | myName |
2
claus
parents: 1
diff changeset
  1574
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1575
    myName := self name.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1576
    stream nextNumber:4 put:self signature.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1577
    stream nextNumber:2 put:myName size.
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1578
    myName do:[:c| 
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1579
        stream nextPut:c asciiValue
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1580
    ]
2
claus
parents: 1
diff changeset
  1581
!
claus
parents: 1
diff changeset
  1582
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1583
binaryDefinitionFrom:stream manager:manager
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1584
    "read the definition on an empty instance (of my class) from stream.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1585
     All pointer instances are left nil, while all bits are read in here.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1586
     return the new object."
2
claus
parents: 1
diff changeset
  1587
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1588
    |obj t
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1589
     basicSize "{ Class: SmallInteger }" |
2
claus
parents: 1
diff changeset
  1590
claus
parents: 1
diff changeset
  1591
    self isPointers ifTrue: [
claus
parents: 1
diff changeset
  1592
        stream next. "skip instSize"
claus
parents: 1
diff changeset
  1593
        self isVariable ifTrue: [
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1594
            ^ self basicNew:(stream nextNumber:3)
2
claus
parents: 1
diff changeset
  1595
        ].
claus
parents: 1
diff changeset
  1596
        ^ self basicNew
claus
parents: 1
diff changeset
  1597
    ].
claus
parents: 1
diff changeset
  1598
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1599
    basicSize := stream nextNumber:4.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1600
    obj := self basicNew:basicSize.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1601
2
claus
parents: 1
diff changeset
  1602
    self isBytes ifTrue: [
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1603
        stream nextBytes:basicSize into:obj
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1604
"
2
claus
parents: 1
diff changeset
  1605
        1 to:basicSize do:[:i |
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1606
            obj basicAt:i put:stream next
2
claus
parents: 1
diff changeset
  1607
        ]
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1608
"
2
claus
parents: 1
diff changeset
  1609
    ] ifFalse: [
claus
parents: 1
diff changeset
  1610
        self isWords ifTrue: [
claus
parents: 1
diff changeset
  1611
            1 to:basicSize do:[:i |
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1612
                obj basicAt:i put: stream nextNumber:2
2
claus
parents: 1
diff changeset
  1613
            ]
claus
parents: 1
diff changeset
  1614
        ] ifFalse:[
claus
parents: 1
diff changeset
  1615
            self isLongs ifTrue: [
claus
parents: 1
diff changeset
  1616
                1 to:basicSize do:[:i |
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1617
                    obj basicAt:i put: stream nextNumber:4
2
claus
parents: 1
diff changeset
  1618
                ]
claus
parents: 1
diff changeset
  1619
            ] ifFalse:[
claus
parents: 1
diff changeset
  1620
                self isFloats ifTrue: [
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1621
                    "could do it in one big read on machines which use IEEE floats ..."
2
claus
parents: 1
diff changeset
  1622
                    1 to:basicSize do:[:i |
claus
parents: 1
diff changeset
  1623
                        t := Float basicNew.
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1624
                        Float readBinaryIEEESingleFrom:stream into:t.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1625
                        obj basicAt:i put: t
2
claus
parents: 1
diff changeset
  1626
                    ]
claus
parents: 1
diff changeset
  1627
                ] ifFalse:[
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1628
                    self isDoubles ifTrue: [
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1629
                        "could do it in one big read on machines which use IEEE doubles ..."
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1630
                        1 to:basicSize do:[:i |
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1631
                            t := Float basicNew.
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1632
                            Float readBinaryIEEEDoubleFrom:stream into:t.
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1633
                            obj basicAt:i put: t
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1634
                        ]
2
claus
parents: 1
diff changeset
  1635
                    ]
claus
parents: 1
diff changeset
  1636
                ]
claus
parents: 1
diff changeset
  1637
            ]
claus
parents: 1
diff changeset
  1638
        ]
claus
parents: 1
diff changeset
  1639
    ].
claus
parents: 1
diff changeset
  1640
    ^obj
claus
parents: 1
diff changeset
  1641
! !