Behavior.st
author claus
Fri, 16 Jul 1993 11:39:45 +0200
changeset 1 a27a279701f8
child 2 6526dde5f3ac
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1988-93 by Claus Gittinger
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
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'superclass selectors methods
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
                              instSize flags'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
       category:'Kernel-Classes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
Behavior comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
COPYRIGHT (c) 1988-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
this class provides minimum support for all classes - additional stuff is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
found in Class; Behaviors stuff has been extracted to make generation of
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
compact binaries possible.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
(these do not need all of the functionality in Class)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
Instance variables:
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
superclass  <Class>           the classes superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
selectors   <Array>           the selectors for which inst-methods are defined here
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
methods     <Array>           the inst-methods corresponding to the selectors
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
instSize    <SmallInteger>    the number of instance variables
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
flags       <SmallInteger>    special flag bits coded in a number
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
NOTICE: layout known by compiler and runtime system; be careful when changing
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
%W% %E%
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
written Dec 88 by claus
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
!Behavior class methodsFor:'creating new classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
    "creates and return a new class"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
    |newClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
    newClass := self basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
    newClass setSuperclass:Object
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
                 selectors:(Array new:0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
                   methods:(Array new:0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
                  instSize:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
                     flags:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
!Behavior methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
    "to catch initialize for classes which do not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
reinitialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
    "to catch reinitialize for classes which do not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
!Behavior methodsFor:'creating an instance of myself'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
uninitializedNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
    "same as new"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
    ^ self basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
uninitializedNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
    "same as new:anInteger"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
    "return an instance of myself without indexed variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
    ^ self basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
new:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
    "return an instance of myself with anInteger indexed variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    "return an instance of myself without indexed variables
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
     If the receiver-class has indexed instvars, the new object will have
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
     a basicSize of zero.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
     ** Do not redefine this method in any class **"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
    extern char *newNextPtr, *newEndPtr;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
    OBJ newobj;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
    int instsize;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
    REGISTER int nInstVars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
#if !defined(memset4)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
# if !defined(FAST_MEMSET) || defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
    REGISTER OBJ *op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
    nInstVars = _intVal(_INST(instSize));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
    _qAlignedNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
    if (nInstVars) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
#if defined(memset4)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
        memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
        /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
         * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
         */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
        memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
        op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
        do {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
            *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
        } while (--nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
    "return an instance of myself with anInteger indexed variables.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
     If the receiver-class has no indexed instvars, this is only allowed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
     if the argument, anInteger is zero.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
     ** Do not redefine this method in any class **"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    OBJ newobj;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    INT instsize, nInstVars, nindexedinstvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
    INT flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
#if ! defined(FAST_MEMSET) || defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
    REGISTER char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    short *sp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    long *lp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
    REGISTER OBJ *op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    float *fp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    double *dp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
    extern OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    if (_isSmallInteger(anInteger)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
        nindexedinstvars = _intVal(anInteger);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
        if (nindexedinstvars >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
            nInstVars = _intVal(_INST(instSize));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
            flags = _intVal(_INST(flags)) & ARRAYMASK;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
            switch (flags) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
                case BYTEARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(char);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
		    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
                    _qNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
		    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
#if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
                    cp = (char *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
                    while (nindexedinstvars >= sizeof(long)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
                        *(long *)cp = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
			cp += sizeof(long);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
			nindexedinstvars -= sizeof(long);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
		    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
                        *cp++ = '\0';
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
                case WORDARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(short);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
		    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
                    _qNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
		    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
#if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
                    sp = (short *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
                        *sp++ = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
               case LONGARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(long);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
		    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
                    _qNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
		    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
#if defined(memset4) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
                    memset4(_InstPtr(newobj)->i_instvars, 0, nInstVars + nindexedinstvars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
                    lp = (long *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
                        *lp++ = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
               case FLOATARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(float);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
		    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
                    _qNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
		    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
                    fp = (float *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
                        *fp++ = 0.0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
               case DOUBLEARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(double);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
		    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
                    _qNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
		    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
                    dp = (double *)op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
                    while (nindexedinstvars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
                        *dp++ = 0.0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
                case WKPOINTERARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
                case POINTERARRAY:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
                    nInstVars += nindexedinstvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
                    instsize = OHDR_SIZE + nInstVars * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
		    PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
                    _qAlignedNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
		    UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
                    _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
#if defined(memset4)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
                    memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
                     * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
                    op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
                    while (nInstVars--)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
                        *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
                    RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
                default:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
                    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
                     * new:n for non-variable classes only allowed if
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
                     * n == 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
                     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
                    if (nindexedinstvars == 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
                        instsize = OHDR_SIZE + nInstVars * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
		        PROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
                        _qAlignedNew(newobj, instsize, SENDER);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
		        UNPROTECT(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
                        _InstPtr(newobj)->o_class = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
                        if (nInstVars) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
#if defined(memset4)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
                            memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
                            /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
                             * knowing that nil is 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
                             */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
                            memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
# else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
                            op = _InstPtr(newobj)->i_instvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
                            do {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
                                *op++ = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
                            } while (--nInstVars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
                        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
                        RETURN ( newobj );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
                    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
                    break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
    (anInteger isMemberOf:SmallInteger) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
        self error:'argument to new: must be Integer'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
    ] ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
        (anInteger >= 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
            "sorry but this class has no indexed instvars - need 'new' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
            self error:'not indexed - cannot create with new:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
            self error:'bad argument'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
!Behavior methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
    "return the receivers superclass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
    ^ superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
selectors
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    "return the receivers selector array"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    ^ selectors
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
methods
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
    "return the receivers method array"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
    ^ methods
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
methodDictionary
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
    "return the receivers method dictionary - since no dictionary is
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
     used (for now) just return the method array"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
    ^ methods
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
instSize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
    "return the number of instance variables of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
    ^ instSize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
flags
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
    "return the receivers flag bits"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
    ^ flags
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
isVariable
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
    "return true, if instances have indexed instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
    "this used to be defined as:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
        ^ (flags bitAnd:16r0F) ~~ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
     but then, changes in stc.h would not affect us here. Therefore:"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
    /* this is defined as a primitive to get defines from stc.h */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
isFixed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
    "return true, if instances do not have indexed instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
    /* this is defined as a primitive to get defines from stc.h */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? false : true ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
isBits
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
    "return true, if instances have indexed byte or short instance variables.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
     Ignore long, float and double arrays, since classes using isBits are probably
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
     not prepared to handle them correctly."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    /* this is defined as a primitive to get defines from stc.h */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    REGISTER int flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
    RETURN ( (((flags = (_intVal(_INST(flags)) & ARRAYMASK)) == BYTEARRAY)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
	     || (flags == WORDARRAY)) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
isBytes
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    "return true, if instances have indexed byte instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    /* this is defined as a primitive to get defines from stc.h */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == BYTEARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
isWords
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    "return true, if instances have indexed short instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
    /* this is defined as a primitive to get defines from stc.h */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == WORDARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
isLongs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
    "return true, if instances have indexed long instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
    /* this is defined as a primitive to get defines from stc.h */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == LONGARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
isFloats
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
    "return true, if instances have indexed float instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == FLOATARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
isDoubles
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
    "return true, if instances have indexed double instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == DOUBLEARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
isPointers
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
    "return true, if instances have pointer instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
    "question: should we ignore WeakPointers ?"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
    REGISTER int flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
    RETURN ( (((flags = (_intVal(_INST(flags)) & ARRAYMASK)) == POINTERARRAY)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
	     || (flags == WKPOINTERARRAY)) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
!Behavior methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
isBehavior
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
    "return true, if the receiver describing another objecs behavior
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
     i.e. is a class."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
hasMultipleSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
    "NO multiple inheritance in this system"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
superclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
    "return a collection of the receivers immediate superclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
     - since we have NO multiple inheritance, there is only one"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
    ^ Array with:superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
allSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
    "return a collection of the receivers accumulated superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
    |aCollection theSuperClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
    theSuperClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
    theSuperClass notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
        aCollection := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
        [theSuperClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
            aCollection add:theSuperClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
            theSuperClass := theSuperClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
    ^ aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
withAllSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    "return a collection containing the receiver and all
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
     of the receivers accumulated superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
    |aCollection theSuperClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
    aCollection := OrderedCollection with:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
    theSuperClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
    [theSuperClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
        aCollection add:theSuperClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
        theSuperClass := theSuperClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
    ^ aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
subclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
    "return a collection of the direct subclasses of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
    newColl := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
    self subclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
        newColl add:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    ^ newColl
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
allSubclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
    "return a collection of all subclasses (direct AND indirect) of
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
     the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
    newColl := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
    self allSubclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
        newColl add:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
    ^ newColl
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
withAllSubclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
    "return a collection containing the receiver and 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
     all subclasses (direct AND indirect) of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
    newColl := OrderedCollection with:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
    self allSubclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
        newColl add:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
    ^ newColl
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
isSubclassOf:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
    "return true, if I am a subclass of the argument, aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
    |theClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
    theClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    [theClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
        (theClass == aClass) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
        theClass := theClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
allInstances
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
    "return a collection of all my instances"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
    |coll|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
    coll := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
    ObjectMemory allObjectsDo:[:anObject |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
        (anObject class == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
            coll add:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
    ^ coll asArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
instanceCount
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
    "return the number of instances of myself"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
    |count|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
    count := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
    ObjectMemory allObjectsDo:[:anObject |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
        (anObject class == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
            count := count + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
    ^ count
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
!Behavior methodsFor:'private accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
setSuperclass:sup selectors:sels methods:m instSize:i flags:f
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
    "set some inst vars (private use only)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
    superclass := sup.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
    selectors := sels.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
    methods := m.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
    instSize := i.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
    flags := f
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
setSuperclass:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
    "set the superclass of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
    superclass := aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
instSize:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
    "set the instance size"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
    instSize := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
flags:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
    "set the flags"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
    flags := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
setSelectors:anArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
    "set the selector array of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
    selectors := anArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
setMethodDictionary:anArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
    "set the method array of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
    methods := anArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
superclass:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
    "set the superclass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
    "must flush caches since lookup chain changes"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    ObjectMemory flushCaches.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
    superclass := aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
selectors:selectorArray methods:methodArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
    "set both selector array and method array of the receiver,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
     and flush caches"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
    ObjectMemory flushCaches.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
    selectors := selectorArray.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
    methods := methodArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
!Behavior methodsFor:'enumeration'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
allInstancesDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    "evaluate a block for all of my instances"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
    ObjectMemory allObjectsDo:[:anObject |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
        (anObject class == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
            aBlock value:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
subclassesDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
    "evaluate the argument, aBlock for all immediate subclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
a27a279701f8 Initial revision
claus
parents:
diff changeset
   696
    Smalltalk allClassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   697
        (aClass superclass == self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   698
            aBlock value:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   701
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
allSubclassesDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   704
    "evaluate a block for all of my subclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
a27a279701f8 Initial revision
claus
parents:
diff changeset
   706
    Smalltalk allClassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   707
        (aClass isSubclassOf:self) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
            aBlock value:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   711
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
allSubclassesInOrderDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
    "evaluate a block for all of my subclasses where superclasses come
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
     first"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
    self subclassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
        aBlock value:aClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
        aClass allSubclassesInOrderDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
allSuperclassesDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
    "evaluate a block for all of my superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
a27a279701f8 Initial revision
claus
parents:
diff changeset
   726
    |theClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
    theClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
    [theClass notNil] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
        aBlock value:theClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
        theClass := theClass superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
! !