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