Behavior.st
author claus
Tue, 08 Aug 1995 02:49:43 +0200
changeset 375 e5019c22f40e
parent 369 730e0f5d2404
child 379 5b5a130ccd09
permissions -rw-r--r--
.
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
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
     3
	      All Rights Reserved
1
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
357
claus
parents: 356
diff changeset
    14
       instanceVariableNames:'superclass flags selectorArray methodArray
claus
parents: 356
diff changeset
    15
			      otherSuperclasses instSize'
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
    16
       classVariableNames:'SubclassInfo'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
       category:'Kernel-Classes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
Behavior comment:'
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1988 by Claus Gittinger
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    23
	      All Rights Reserved
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
    24
375
claus
parents: 369
diff changeset
    25
$Header: /cvs/stx/stx/libbasic/Behavior.st,v 1.45 1995-08-08 00:45:54 claus Exp $
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    26
'!
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    27
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    28
!Behavior class methodsFor:'documentation'!
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    29
88
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    30
copyright
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    31
"
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    32
 COPYRIGHT (c) 1988 by Claus Gittinger
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    33
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    34
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    35
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    36
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    37
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    38
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    39
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    40
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    41
"
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    42
!
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    43
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    44
version
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    45
"
375
claus
parents: 369
diff changeset
    46
$Header: /cvs/stx/stx/libbasic/Behavior.st,v 1.45 1995-08-08 00:45:54 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    47
"
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    48
!
81dacba7a63a *** empty log message ***
claus
parents: 82
diff changeset
    49
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    50
documentation
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    51
"
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    52
    Every class in the system inherits from Behavior (via Class, ClassDescription);
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    53
    so here is where most of the class messages end up being implemented.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    54
    (to answer a FAQ: 'Point basicNew' will be done here :-)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    55
356
claus
parents: 345
diff changeset
    56
    Beginners should keep in mind, that all classes are instances (of subclasses)
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
    57
    of Behavior, therefore you will find the above mentioned 'basicNew:' method 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
    58
    under the 'instance'-methods of Behavior - NOT under the class methods 
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    59
    ('Behavior new' will create and return a new class, while sending 'new' to 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    60
    any instance of Behavior (i.e. any class) will return an instance of that class).
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    61
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    62
    Behavior provides minimum support for all classes - additional stuff is
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    63
    found in ClassDescription and Class. Behaviors provides all mechanisms needed
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    64
    to create instances, and send messages to those. However, Behavior does not provide 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    65
    all the (symbolic) information needed to compile methods for a class or to get
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
    66
    useful information in inspectors.
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    67
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    68
    In contrast to other ST implementations, the methods have been separated
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    69
    from the selectors (there is no Dictionary, but two separate Arrays)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    70
    - this avoids the need for knowledge about Dictionaries in the runtime library (VM)
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    71
    (lookup and search in these is seldom anyway, so the added benefit from using a 
356
claus
parents: 345
diff changeset
    72
     hashed dictionary is almost void). 
claus
parents: 345
diff changeset
    73
    For ST-80 compatibility, this will be replaced by a single instance of
362
claus
parents: 360
diff changeset
    74
    MethodDictionary (which will NOT be a true dictionary, but an Array with
356
claus
parents: 345
diff changeset
    75
    alternating selector/method entries).
claus
parents: 345
diff changeset
    76
    To be prepared for this change, please do NOT directly use the methodArray 
claus
parents: 345
diff changeset
    77
    and selectorArray instVars.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    79
    Instance variables:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    81
	superclass        <Class>           the receivers superclass
356
claus
parents: 345
diff changeset
    82
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    83
	otherSuperclasses <Array of Class>  experimental: other superclasses
356
claus
parents: 345
diff changeset
    84
					    a hook for experimental multiple inheritance
claus
parents: 345
diff changeset
    85
					    implementations
claus
parents: 345
diff changeset
    86
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    87
	selectorArray     <Array of Symbol> the selectors for which inst-methods are defined here
356
claus
parents: 345
diff changeset
    88
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    89
	methodArray       <Array of Method> the inst-methods corresponding to the selectors
356
claus
parents: 345
diff changeset
    90
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    91
	instSize          <SmallInteger>    the number of instance variables
356
claus
parents: 345
diff changeset
    92
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
    93
	flags             <SmallInteger>    special flag bits coded in a number
356
claus
parents: 345
diff changeset
    94
					    not for application use
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
    96
    flag bits (see stc.h):
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    97
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
    98
    NOTICE: layout known by compiler and runtime system; be careful when changing
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
    99
"
356
claus
parents: 345
diff changeset
   100
!
claus
parents: 345
diff changeset
   101
claus
parents: 345
diff changeset
   102
virtualMachineRelationship 
claus
parents: 345
diff changeset
   103
"
357
claus
parents: 356
diff changeset
   104
    NOTICE: 
claus
parents: 356
diff changeset
   105
	the stuff described below may not be available on other
claus
parents: 356
diff changeset
   106
	Smalltalk implementations; be aware that these error mechanisms
claus
parents: 356
diff changeset
   107
	are ST/X specials and applications using these (tricks) may
claus
parents: 356
diff changeset
   108
	not be portable to other systems.
claus
parents: 356
diff changeset
   109
claus
parents: 356
diff changeset
   110
    WARNING: 
claus
parents: 356
diff changeset
   111
	do not try the examples below on (some) other smalltalk systems;
claus
parents: 356
diff changeset
   112
	it has been reported, that some crash badly when doing this .... ;-)
claus
parents: 356
diff changeset
   113
356
claus
parents: 345
diff changeset
   114
    Instances of Behavior and subclasses (i.e. in sloppy words: classes)
claus
parents: 345
diff changeset
   115
    play a special role w.r.t. the VM. Only objects whose class-slot is marked
claus
parents: 345
diff changeset
   116
    as being behaviorLike (in the flag-instvar) are considered to be classLike
claus
parents: 345
diff changeset
   117
    and a message lookup will be done for it in the well known way.
claus
parents: 345
diff changeset
   118
    Thus, if an object has a class for which its class does NOT have
362
claus
parents: 360
diff changeset
   119
    this flag bit set, the VM will trigger an error on a message send.
356
claus
parents: 345
diff changeset
   120
claus
parents: 345
diff changeset
   121
    Why is this so:
claus
parents: 345
diff changeset
   122
claus
parents: 345
diff changeset
   123
    the above lets every object play the role of a class,
claus
parents: 345
diff changeset
   124
    which has been flagged as behaviorLike in its class's flag.
claus
parents: 345
diff changeset
   125
    Thus, you can create arbitrary new classLike objects and have the VM 
claus
parents: 345
diff changeset
   126
    play with them.
claus
parents: 345
diff changeset
   127
    This may offer the flexibility to create a totally different object scheme
362
claus
parents: 360
diff changeset
   128
    on top of ST/X (for example: Self like objects) where any object can play
claus
parents: 360
diff changeset
   129
    a classRole for another object.
356
claus
parents: 345
diff changeset
   130
357
claus
parents: 356
diff changeset
   131
    However, the VM trusts the isBehaviorLike flag - if it is set for some
362
claus
parents: 360
diff changeset
   132
    object, it expects the object selector and methodDictionaries to be found
claus
parents: 360
diff changeset
   133
    at the instance positions as defined here.
claus
parents: 360
diff changeset
   134
    (i.e. instanceVariables with contents and semantic corresponding to
claus
parents: 360
diff changeset
   135
	superclass flags selectorArray methodArray
claus
parents: 360
diff changeset
   136
     must be present and have the same instVar-index as here).
claus
parents: 360
diff changeset
   137
356
claus
parents: 345
diff changeset
   138
    The VM (and the system) may crash badly, if this is not the case.
362
claus
parents: 360
diff changeset
   139
356
claus
parents: 345
diff changeset
   140
    Since every class in the system derives from Behavior, the flag setting
357
claus
parents: 356
diff changeset
   141
    (and instance variable layout) is correct for all 'normal' classes.
claus
parents: 356
diff changeset
   142
    If you experiment by creating new behaviorLike objects, please take
claus
parents: 356
diff changeset
   143
    care of this flag. If you want to use the VM's lookup function, the
claus
parents: 356
diff changeset
   144
    instVars  'superclass', 'selectorArray' and 'methodArray' are required
claus
parents: 356
diff changeset
   145
    and have to be at the same instVar index.
362
claus
parents: 360
diff changeset
   146
    (we suggest, you subclass Behavior, to make certain)
357
claus
parents: 356
diff changeset
   147
claus
parents: 356
diff changeset
   148
    You do not have to care about the above details if you are a 'normal'
claus
parents: 356
diff changeset
   149
    ST-programmer, though.
claus
parents: 356
diff changeset
   150
356
claus
parents: 345
diff changeset
   151
claus
parents: 345
diff changeset
   152
    Examples (only of theoretical interrest):
claus
parents: 345
diff changeset
   153
	take away the behaviorLike-flag from a class.
claus
parents: 345
diff changeset
   154
	-> The instances will not understand any messages, since the VM will
claus
parents: 345
diff changeset
   155
	   not recognize its class as being a class ...
claus
parents: 345
diff changeset
   156
claus
parents: 345
diff changeset
   157
	|newMeta notRecognizedAsClass someInstance|
claus
parents: 345
diff changeset
   158
claus
parents: 345
diff changeset
   159
	newMeta := Metaclass new.
claus
parents: 345
diff changeset
   160
	newMeta flags:0.
claus
parents: 345
diff changeset
   161
claus
parents: 345
diff changeset
   162
	notRecognizedAsClass := newMeta new.
claus
parents: 345
diff changeset
   163
claus
parents: 345
diff changeset
   164
	someInstance := notRecognizedAsClass new.
claus
parents: 345
diff changeset
   165
	someInstance perform:#isNil
claus
parents: 345
diff changeset
   166
357
claus
parents: 356
diff changeset
   167
claus
parents: 356
diff changeset
   168
    Of course, this is an exception which can be handled ...:
claus
parents: 356
diff changeset
   169
    Example:
claus
parents: 356
diff changeset
   170
claus
parents: 356
diff changeset
   171
	|newMeta notRecognizedAsClass someInstance|
claus
parents: 356
diff changeset
   172
claus
parents: 356
diff changeset
   173
	newMeta := Metaclass new.
claus
parents: 356
diff changeset
   174
	newMeta flags:0.
claus
parents: 356
diff changeset
   175
claus
parents: 356
diff changeset
   176
	notRecognizedAsClass := newMeta new.
claus
parents: 356
diff changeset
   177
claus
parents: 356
diff changeset
   178
	someInstance := notRecognizedAsClass new.
claus
parents: 356
diff changeset
   179
	Object errorSignal handle:[:ex |
claus
parents: 356
diff changeset
   180
	    ex return
claus
parents: 356
diff changeset
   181
	] do:[
claus
parents: 356
diff changeset
   182
	    someInstance perform:#isNil
claus
parents: 356
diff changeset
   183
	]
claus
parents: 356
diff changeset
   184
claus
parents: 356
diff changeset
   185
claus
parents: 356
diff changeset
   186
    likewise, a doesNotUnderstand-notUnderstood can be handled:
claus
parents: 356
diff changeset
   187
    Example:
claus
parents: 356
diff changeset
   188
claus
parents: 356
diff changeset
   189
	|newMeta funnyClass someInstance|
claus
parents: 356
diff changeset
   190
claus
parents: 356
diff changeset
   191
	newMeta := Metaclass new.
claus
parents: 356
diff changeset
   192
claus
parents: 356
diff changeset
   193
	funnyClass := newMeta new.
claus
parents: 356
diff changeset
   194
	funnyClass setSuperclass:nil.
claus
parents: 356
diff changeset
   195
claus
parents: 356
diff changeset
   196
	someInstance := funnyClass new.
claus
parents: 356
diff changeset
   197
	Object errorSignal handle:[:ex |
claus
parents: 356
diff changeset
   198
	     ex return
claus
parents: 356
diff changeset
   199
	] do:[
claus
parents: 356
diff changeset
   200
	    someInstance perform:#isNil
claus
parents: 356
diff changeset
   201
	]
claus
parents: 356
diff changeset
   202
claus
parents: 356
diff changeset
   203
362
claus
parents: 360
diff changeset
   204
    more examples, which try to trick the VM ;-):
357
claus
parents: 356
diff changeset
   205
	badly playing around with a classes internals ...
claus
parents: 356
diff changeset
   206
claus
parents: 356
diff changeset
   207
	|newClass someInstance|
claus
parents: 356
diff changeset
   208
claus
parents: 356
diff changeset
   209
	newClass := Class new.
claus
parents: 356
diff changeset
   210
	newClass setSelectorArray:nil.
claus
parents: 356
diff changeset
   211
	someInstance := newClass new.
claus
parents: 356
diff changeset
   212
	someInstance inspect
claus
parents: 356
diff changeset
   213
claus
parents: 356
diff changeset
   214
claus
parents: 356
diff changeset
   215
	|newClass someInstance|
claus
parents: 356
diff changeset
   216
claus
parents: 356
diff changeset
   217
	newClass := Class new.
claus
parents: 356
diff changeset
   218
	newClass setSuperclass:nil.
claus
parents: 356
diff changeset
   219
	someInstance := newClass new.
claus
parents: 356
diff changeset
   220
	someInstance inspect
claus
parents: 356
diff changeset
   221
claus
parents: 356
diff changeset
   222
claus
parents: 356
diff changeset
   223
	|newClass someInstance|
claus
parents: 356
diff changeset
   224
claus
parents: 356
diff changeset
   225
	newClass := Class new.
claus
parents: 356
diff changeset
   226
	newClass setSuperclass:newClass.
claus
parents: 356
diff changeset
   227
	someInstance := newClass new.
claus
parents: 356
diff changeset
   228
	someInstance inspect
claus
parents: 356
diff changeset
   229
claus
parents: 356
diff changeset
   230
claus
parents: 356
diff changeset
   231
	|newClass someInstance|
claus
parents: 356
diff changeset
   232
claus
parents: 356
diff changeset
   233
	newClass := Class new.
claus
parents: 356
diff changeset
   234
	newClass setSuperclass:1.
claus
parents: 356
diff changeset
   235
	someInstance := newClass new.
claus
parents: 356
diff changeset
   236
	someInstance inspect
claus
parents: 356
diff changeset
   237
claus
parents: 356
diff changeset
   238
356
claus
parents: 345
diff changeset
   239
    Example:
claus
parents: 345
diff changeset
   240
	creating totally anonymous classes:
claus
parents: 345
diff changeset
   241
claus
parents: 345
diff changeset
   242
	|newClass someInstance|
claus
parents: 345
diff changeset
   243
claus
parents: 345
diff changeset
   244
	newClass := Class new.
claus
parents: 345
diff changeset
   245
	someInstance := newClass new.
claus
parents: 345
diff changeset
   246
	someInstance inspect
claus
parents: 345
diff changeset
   247
357
claus
parents: 356
diff changeset
   248
356
claus
parents: 345
diff changeset
   249
    Example:
357
claus
parents: 356
diff changeset
   250
	creating totally anonymous metaclasses:
356
claus
parents: 345
diff changeset
   251
claus
parents: 345
diff changeset
   252
	|newMeta newClass someInstance|
claus
parents: 345
diff changeset
   253
claus
parents: 345
diff changeset
   254
	newMeta := Metaclass new.
claus
parents: 345
diff changeset
   255
	newClass := newMeta new.
claus
parents: 345
diff changeset
   256
	someInstance := newClass new.
claus
parents: 345
diff changeset
   257
	someInstance inspect
357
claus
parents: 356
diff changeset
   258
claus
parents: 356
diff changeset
   259
    PS: if you experiment with new behaviorLike objects, you may want 
claus
parents: 356
diff changeset
   260
	to turn off the VM's debugPrintouts
claus
parents: 356
diff changeset
   261
	with: 
claus
parents: 356
diff changeset
   262
		'Smalltalk debugPrinting:false'
claus
parents: 356
diff changeset
   263
	and: 
claus
parents: 356
diff changeset
   264
		'Smalltalk infoPrinting:false'
356
claus
parents: 345
diff changeset
   265
"
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
   266
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   268
!Behavior class methodsFor:'queries'!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   269
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   270
isBuiltInClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   271
    "this class is known by the run-time-system"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   272
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   273
    ^ true
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   274
! !
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   275
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
!Behavior class methodsFor:'creating new classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
new
356
claus
parents: 345
diff changeset
   279
    "creates and return a new behavior (which is like a class,
claus
parents: 345
diff changeset
   280
     but without the symbolic & name information).
claus
parents: 345
diff changeset
   281
     Not for normal applications.
claus
parents: 345
diff changeset
   282
     Sending the returned behavior the #new message gives you
claus
parents: 345
diff changeset
   283
     an instance if it.
claus
parents: 345
diff changeset
   284
claus
parents: 345
diff changeset
   285
     Notice: the returned class is given a superclass of Object;
claus
parents: 345
diff changeset
   286
     this allows for its new instances to be inspected and the like."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
    |newClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
    newClass := self basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
    newClass setSuperclass:Object
345
claus
parents: 343
diff changeset
   292
		 selectors:#() "/ (Array new:0)
claus
parents: 343
diff changeset
   293
		   methods:#() "/ (Array new:0)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   294
		  instSize:0
345
claus
parents: 343
diff changeset
   295
		     flags:(self flagBehavior).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
    ^ newClass
356
claus
parents: 345
diff changeset
   297
claus
parents: 345
diff changeset
   298
    "
claus
parents: 345
diff changeset
   299
     Behavior new               <- a new behavior
claus
parents: 345
diff changeset
   300
     Behavior new new           <- an instance of it
claus
parents: 345
diff changeset
   301
     ClassDescription new       <- a new classDescription
claus
parents: 345
diff changeset
   302
     ClassDescription new new   <- an instance of it
claus
parents: 345
diff changeset
   303
     Class new                  <- a new class
claus
parents: 345
diff changeset
   304
     Class new new              <- an instance of it
claus
parents: 345
diff changeset
   305
     Metaclass new              <- a new metaclass
claus
parents: 345
diff changeset
   306
     Metaclass new new          <- an instance (i.e. a class) of it
claus
parents: 345
diff changeset
   307
     Metaclass new new new      <- an instance of this new class
claus
parents: 345
diff changeset
   308
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   311
!Behavior class methodsFor:'private '!
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   312
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   313
subclassInfo
357
claus
parents: 356
diff changeset
   314
    |d|
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   315
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   316
    SubclassInfo notNil ifTrue:[^ SubclassInfo].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   317
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   318
    d := IdentityDictionary new.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   319
    Smalltalk allClassesDo:[:aClass |
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   320
	|superCls|
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   321
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   322
	aClass isMeta not ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   323
	    superCls := aClass superclass.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   324
	    superCls notNil ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   325
		(d includesKey: superCls) ifFalse:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   326
		    d at:superCls put:(Set with:aClass).
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   327
		] ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   328
		    (d at:superCls ) add:aClass
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   329
		]
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   330
	    ]
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   331
	].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   332
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   333
    SubclassInfo := d.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   334
    ^ d
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   335
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   336
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   337
     Class subclassInfo
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   338
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   339
!
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   340
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   341
flushSubclassInfo
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   342
    SubclassInfo := nil.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   343
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   344
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   345
     Class flushSubclassInfo
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   346
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   347
! !
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   348
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
!Behavior methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
    "to catch initialize for classes which do not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
328
claus
parents: 325
diff changeset
   357
postAutoload
claus
parents: 325
diff changeset
   358
    "for autoloaded classes, gives them a second chance"
claus
parents: 325
diff changeset
   359
claus
parents: 325
diff changeset
   360
    ^ self
claus
parents: 325
diff changeset
   361
!
claus
parents: 325
diff changeset
   362
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
reinitialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    "to catch reinitialize for classes which do not"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   369
!Behavior methodsFor:'copying'!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   370
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   371
deepCopy
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   372
    "return a deep copy of the receiver
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   373
     - return the receiver here - time will show if this is ok"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   374
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   375
    ^ self
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   376
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   377
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   378
deepCopyUsing:aDictionary
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   379
    "return a deep copy of the receiver
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   380
     - return the receiver here - time will show if this is ok"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   381
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   382
    ^ self
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   383
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   384
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   385
simpleDeepCopy
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   386
    "return a deep copy of the receiver
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   387
     - return the receiver here - time will show if this is ok"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   388
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   389
    ^ self
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   390
! !
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   391
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
!Behavior methodsFor:'creating an instance of myself'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
uninitializedNew
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   395
    "create an instance of myself with uninitialized contents.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   396
     For all classes except ByteArray, this is the same as new."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
    ^ self basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
uninitializedNew:anInteger
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   402
    "create an instance of myself with uninitialized contents.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
   403
     For all classes except ByteArray, this is the same as new."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   408
niceBasicNew:anInteger
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   409
    "same as basicNew:anInteger, but tries to avoid long pauses
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   410
     due to garbage collection. This method checks to see if
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   411
     allocation is possible without a pause, and does a background
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   412
     incremental garbage collect first if there is not enough memory
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   413
     available at the moment for fast allocation. 
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   414
     This is useful in low-priority background processes which like to 
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   415
     avoid disturbing any higher priority foreground process while allocating
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   416
     big amounts of memory. Of course, using this method only makes
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   417
     sense for big or huge objects (say > 200k).
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   418
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   419
     EXPERIMENTAL: this is a non-standard interface and should only 
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   420
     be used for special applications. There is no guarantee, that this
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   421
     method will be available in future ST/X releases."
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   422
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   423
    |size|
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   424
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   425
    size := self sizeOfInst:anInteger.
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   426
    (ObjectMemory checkForFastNew:size) ifFalse:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   427
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   428
	 incrementally collect garbage
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   429
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   430
	ObjectMemory incrementalGC.
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   431
    ].
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   432
    ^ self basicNew:anInteger
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   433
!
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   434
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
    "return an instance of myself without indexed variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
    ^ self basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
new:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    "return an instance of myself with anInteger indexed variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
basicNew
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   448
    "return an instance of myself without indexed variables.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
     If the receiver-class has indexed instvars, the new object will have
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   450
     a basicSize of zero - 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   451
     i.e. 'aClass basicNew' is equivalent to 'aClass basicNew:0'.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   452
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
     ** Do not redefine this method in any class **"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
%{  /* NOCONTEXT */
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   456
    REGISTER OBJ newobj;
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   457
    REGISTER char *nextPtr;
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   458
    unsigned int instsize;
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   459
    REGISTER unsigned int nInstVars;
369
claus
parents: 362
diff changeset
   460
    extern OBJ __new();
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   462
    /*
369
claus
parents: 362
diff changeset
   463
     * the following ugly code is nothing more than a __new() followed
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   464
     * by a nilling of the new instance.
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   465
     * Unrolled for a bit more speed since this is one of the central object 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   466
     * allocation methods in the system
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   467
     */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
    nInstVars = _intVal(_INST(instSize));
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   469
    instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   470
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   471
    newobj = (OBJ) newNextPtr;
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   472
    nextPtr = ((char *)newobj) + instsize;
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   473
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   474
    /*
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   475
     * dont argue about the goto and the arrangement below - it saves 
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   476
     * an extra nil-compare and branch in the common case ...
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   477
     * (i.e. if no GC is needed, we fall through without a branch)
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   478
     */
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   479
    if (nextPtr < newEndPtr) {
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   480
	_objPtr(newobj)->o_size = instsize;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   481
	/* o_allFlags(newobj) = 0;              */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   482
	/* _objPtr(newobj)->o_space = newSpace; */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   483
	o_setAllFlags(newobj, newSpace);
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   484
#ifdef ALIGN4
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   485
	newNextPtr = nextPtr;
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   486
#else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   487
	if (instsize & (ALIGN-1)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   488
	    newNextPtr = (char *)newobj + (instsize & ~(ALIGN-1)) + ALIGN;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   489
	} else {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   490
	    newNextPtr = nextPtr;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   491
	}
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   492
#endif
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   493
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   494
ok:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   495
	_InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   496
	__qSTORE(newobj, self);
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   497
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   498
	if (nInstVars) {
357
claus
parents: 356
diff changeset
   499
#if defined(FAST_OBJECT_MEMSET4) || defined(FAST_MEMSET4)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   500
	    memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   501
#else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   502
	    REGISTER OBJ *op;
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   503
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   504
	    op = _InstPtr(newobj)->i_instvars;
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   505
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   506
# if !defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   507
	    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   508
	     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   509
	     */
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   510
#  if defined(FAST_OBJECT_MEMSET_DOUBLES_UNROLLED)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   511
	    if (nInstVars > 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   512
		*op++ = nil;    /* for alignment */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   513
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   514
		while (nInstVars >= 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   515
		    *(double *)op = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   516
		    ((double *)op)[1] = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   517
		    ((double *)op)[2] = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   518
		    ((double *)op)[3] = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   519
		    op += 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   520
		    nInstVars -= 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   521
		}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   522
	    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   523
	    while (nInstVars != 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   524
		*op++ = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   525
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   526
	    }
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   527
#  else
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   528
#   if defined(FAST_OBJECT_MEMSET_LONGLONG_UNROLLED)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   529
	    if (nInstVars > 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   530
		*op++ = nil;    /* for alignment */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   531
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   532
		while (nInstVars >= 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   533
		    *(long long *)op = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   534
		    ((long long *)op)[1] = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   535
		    ((long long *)op)[2] = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   536
		    ((long long *)op)[3] = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   537
		    op += 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   538
		    nInstVars -= 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   539
		}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   540
	    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   541
	    while (nInstVars != 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   542
		*op++ = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   543
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   544
	    }
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   545
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   546
#   else
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   547
#    if defined(FAST_OBJECT_MEMSET_WORDS_UNROLLED)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   548
	    while (nInstVars >= 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   549
		*op = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   550
		*(op+1) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   551
		*(op+2) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   552
		*(op+3) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   553
		*(op+4) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   554
		*(op+5) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   555
		*(op+6) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   556
		*(op+7) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   557
		op += 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   558
		nInstVars -= 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   559
	    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   560
	    while (nInstVars != 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   561
		*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   562
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   563
	    }
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   564
#    else
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   565
#     if defined(FAST_MEMSET)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   566
	    memset(_InstPtr(newobj)->i_instvars, 0, instsize-OHDR_SIZE);
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   567
#     else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   568
	    do {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   569
		*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   570
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   571
	    } while (nInstVars != 0);
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   572
#     endif
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   573
#    endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   574
#   endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   575
#  endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   576
# else /* nil could be ~~ 0 */
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   577
	    while (nInstVars >= 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   578
		*op = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   579
		*(op+1) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   580
		*(op+2) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   581
		*(op+3) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   582
		*(op+4) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   583
		*(op+5) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   584
		*(op+6) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   585
		*(op+7) = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   586
		op += 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   587
		nInstVars -= 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   588
	    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   589
	    while (nInstVars != 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   590
		*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   591
		nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   592
	    }
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   593
# endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   594
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   595
	}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   596
	RETURN ( newobj );
81
e02c66a7296f *** empty log message ***
claus
parents: 77
diff changeset
   597
    }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   598
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   599
    /*
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   600
     * the slow case - a GC will occur
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   601
     */
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   602
    PROTECT_CONTEXT
369
claus
parents: 362
diff changeset
   603
    newobj = __new(instsize);
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   604
    UNPROTECT_CONTEXT
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   605
    if (newobj != nil) goto ok;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
%}
2
claus
parents: 1
diff changeset
   607
.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   608
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   609
     memory allocation failed.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   610
     When we arrive here, there was no memory, even after
165
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   611
     a garbage collect. 
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   612
     This means, that the VM wanted to get some more memory from the 
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   613
     Operatingsystem, which was not kind enough to give it.
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   614
     Bad luck - you should increase the swap space on your machine.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   615
    "
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   616
    ^ ObjectMemory allocationFailureSignal raise.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
    "return an instance of myself with anInteger indexed variables.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
     If the receiver-class has no indexed instvars, this is only allowed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
     if the argument, anInteger is zero.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
     ** Do not redefine this method in any class **"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
    OBJ newobj;
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   628
    unsigned INT instsize, nInstVars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   629
    INT nindexedinstvars;
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   630
    unsigned INT flags;
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   631
#if ! defined(FAST_ARRAY_MEMSET) || defined(NEGATIVE_ADDRESSES)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
    REGISTER char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
    short *sp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
    long *lp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
    REGISTER OBJ *op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
    float *fp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
    double *dp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
249
claus
parents: 216
diff changeset
   640
    if (__isSmallInteger(anInteger)) {
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   641
	nindexedinstvars = _intVal(anInteger);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   642
	if (nindexedinstvars >= 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   643
	    nInstVars = _intVal(_INST(instSize));
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   644
	    flags = _intVal(_INST(flags)) & ARRAYMASK;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   645
	    switch (flags) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   646
		case BYTEARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   647
		    instsize = OHDR_SIZE + nindexedinstvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   648
		    if (nInstVars == 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   649
			if (_CanDoQuickNew(instsize)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   650
			    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   651
			     * the most common case
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   652
			     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   653
			    _qCheckedNew(newobj, instsize);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   654
			    _InstPtr(newobj)->o_class = self;
357
claus
parents: 356
diff changeset
   655
#if defined(FAST_ARRAY_MEMSET4) || defined(FAST_MEMSET4)
359
claus
parents: 357
diff changeset
   656
			    nInstVars = nindexedinstvars >> 2;
claus
parents: 357
diff changeset
   657
			    if (nindexedinstvars & 3) nInstVars++;
claus
parents: 357
diff changeset
   658
			    memset4(_InstPtr(newobj)->i_instvars, 0, nInstVars);
357
claus
parents: 356
diff changeset
   659
#else
claus
parents: 356
diff changeset
   660
# if defined(FAST_ARRAY_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   661
			    memset(_InstPtr(newobj)->i_instvars, 0, nindexedinstvars);
357
claus
parents: 356
diff changeset
   662
# else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   663
			    cp = (char *)_InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   664
			    while (nindexedinstvars >= sizeof(long)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   665
				*(long *)cp = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   666
				cp += sizeof(long);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   667
				nindexedinstvars -= sizeof(long);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   668
			    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   669
			    while (nindexedinstvars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   670
				*cp++ = '\0';
357
claus
parents: 356
diff changeset
   671
# endif
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   672
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   673
			    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   674
			}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   675
		    } else {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   676
			instsize += __OBJS2BYTES__(nInstVars);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   677
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   678
		    PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   679
		    _qNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   680
		    UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   681
		    if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   682
			break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   683
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   684
		    _InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   685
		    __qSTORE(newobj, self);
claus
parents: 362
diff changeset
   686
357
claus
parents: 356
diff changeset
   687
#if defined(FAST_ARRAY_MEMSET4) || defined(FAST_MEMSET4)
claus
parents: 356
diff changeset
   688
		    nInstVars = (instsize-OHDR_SIZE) >> 2;
claus
parents: 356
diff changeset
   689
		    if (instsize & 3) nInstVars++;
claus
parents: 356
diff changeset
   690
		    memset4(_InstPtr(newobj)->i_instvars, 0, nInstVars);
claus
parents: 356
diff changeset
   691
#else
claus
parents: 356
diff changeset
   692
# if defined(FAST_ARRAY_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   693
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   694
		     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   695
		     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   696
		    memset(_InstPtr(newobj)->i_instvars, 0, instsize-OHDR_SIZE);
357
claus
parents: 356
diff changeset
   697
# else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   698
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   699
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   700
			*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   701
		    cp = (char *)op;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   702
		    while (nindexedinstvars >= sizeof(long)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   703
			*(long *)cp = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   704
			cp += sizeof(long);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   705
			nindexedinstvars -= sizeof(long);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   706
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   707
		    while (nindexedinstvars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   708
			*cp++ = '\0';
357
claus
parents: 356
diff changeset
   709
# endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   711
		    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   712
		    break;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   714
		case WORDARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   715
		    instsize = OHDR_SIZE + 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   716
			       __OBJS2BYTES__(nInstVars) + 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   717
			       nindexedinstvars * sizeof(short);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   718
		    PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   719
		    _qNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   720
		    UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   721
		    if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   722
			break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   723
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   724
		    _InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   725
		    __qSTORE(newobj, self);
claus
parents: 362
diff changeset
   726
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   727
#if defined(FAST_ARRAY_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   728
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   729
		     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   730
		     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   731
		    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
#else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   733
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   734
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   735
			*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   736
		    sp = (short *)op;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   737
		    while (nindexedinstvars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   738
			*sp++ = 0;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   740
		    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   741
		    break;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   743
	       case LONGARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   744
		    instsize = OHDR_SIZE + 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   745
			       __OBJS2BYTES__(nInstVars) + 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   746
			       nindexedinstvars * sizeof(long);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   747
		    PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   748
		    _qAlignedNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   749
		    UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   750
		    if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   751
			break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   752
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   753
		    _InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   754
		    __qSTORE(newobj, self);
claus
parents: 362
diff changeset
   755
357
claus
parents: 356
diff changeset
   756
#if defined(FAST_ARRAY_MEMSET4) || defined(FAST_MEMSET4)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   757
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   758
		     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   759
		     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   760
		    memset4(_InstPtr(newobj)->i_instvars, 0, nInstVars + nindexedinstvars);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
#else
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   762
# if defined(FAST_ARRAY_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   763
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   764
		     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   765
		     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   766
		    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
# else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   768
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   769
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   770
			*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   771
		    lp = (long *)op;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   772
		    while (nindexedinstvars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   773
			*lp++ = 0;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   776
		    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   777
		    break;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   779
	       case FLOATARRAY:
325
claus
parents: 323
diff changeset
   780
		    instsize = sizeof(struct __floatArray) + 
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   781
			       __OBJS2BYTES__(nInstVars) + 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   782
			       (nindexedinstvars - 1) * sizeof(float);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   783
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   784
		    PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   785
		    _qNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   786
		    UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   787
		    if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   788
			break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   789
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   790
		    _InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   791
		    __qSTORE(newobj, self);
claus
parents: 362
diff changeset
   792
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   793
		    op = _InstPtr(newobj)->i_instvars;
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   794
# if defined(mips) /* knowin that float 0.0 is all-zeros */
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   795
		    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   796
# else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   797
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   798
			*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   799
		    fp = (float *)op;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   800
		    while (nindexedinstvars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   801
			*fp++ = 0.0;
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   802
# endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   803
		    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   804
		    break;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   805
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   806
	       case DOUBLEARRAY:
325
claus
parents: 323
diff changeset
   807
		    instsize = sizeof(struct __doubleArray) + 
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   808
			       __OBJS2BYTES__(nInstVars) + 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   809
			       (nindexedinstvars - 1) * sizeof(double);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   810
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   811
		    PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   812
		    _qAlignedNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   813
		    UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   814
		    if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   815
			break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   816
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   817
		    _InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   818
		    __qSTORE(newobj, self);
claus
parents: 362
diff changeset
   819
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   820
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   821
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   822
			*op++ = nil;
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   823
#ifdef NEED_DOUBLE_ALIGN
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   824
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   825
		     * care for double alignment
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   826
		     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   827
		    if ((INT)op & (ALIGN-1)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   828
			*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   829
		    }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 47
diff changeset
   830
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   831
		    dp = (double *)op;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   832
		    while (nindexedinstvars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   833
			*dp++ = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   834
		    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   835
		    break;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   836
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   837
		case WKPOINTERARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   838
		case POINTERARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   839
		    nInstVars += nindexedinstvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   840
		    instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   841
		    PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   842
		    _qAlignedNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   843
		    UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   844
		    if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   845
			break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   846
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   847
		    _InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   848
		    __qSTORE(newobj, self);
claus
parents: 362
diff changeset
   849
357
claus
parents: 356
diff changeset
   850
#if defined(FAST_ARRAY_MEMSET4) || defined(FAST_MEMSET4)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   851
		    memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   852
#else
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   853
# if !defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   854
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   855
		     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   856
		     */
360
claus
parents: 359
diff changeset
   857
#ifdef XXmips
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   858
# undef FAST_ARRAY_MEMSET_DOUBLES_UNROLLED
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   859
# undef FAST_ARRAY_MEMSET_LONGLONG_UNROLLED
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
   860
/* seems to be slightly faster */
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   861
# define FAST_ARRAY_MEMSET
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   862
#endif
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   863
#ifdef sparc
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   864
# define FAST_ARRAY_MEMSET_DOUBLES_UNROLLED
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   865
#endif
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
   866
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   867
#  if defined(FAST_ARRAY_MEMSET_DOUBLES_UNROLLED)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   868
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   869
		    if (nInstVars > 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   870
			*op++ = nil;    /* for alignment */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   871
			nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   872
			while (nInstVars >= 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   873
			    *(double *)op = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   874
			    ((double *)op)[1] = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   875
			    ((double *)op)[2] = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   876
			    ((double *)op)[3] = 0.0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   877
			    op += 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   878
			    nInstVars -= 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   879
			}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   880
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   881
		    while (nInstVars) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   882
			*op++ = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   883
			nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   884
		    }
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   885
#  else
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   886
#   if defined(FAST_ARRAY_MEMSET_LONGLONG_UNROLLED)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   887
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   888
		    if (nInstVars > 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   889
			*op++ = nil;    /* for alignment */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   890
			nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   891
			while (nInstVars >= 8) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   892
			    *(long long *)op = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   893
			    ((long long *)op)[1] = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   894
			    ((long long *)op)[2] = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   895
			    ((long long *)op)[3] = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   896
			    op += 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   897
			    nInstVars -= 8;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   898
			}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   899
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   900
		    while (nInstVars) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   901
			*op++ = 0;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   902
			nInstVars--;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   903
		    }
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   904
#   else
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   905
#    if defined(FAST_ARRAY_MEMSET)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   906
		    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   907
#    else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   908
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   909
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   910
			*op++ = nil;
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
   911
#    endif
82
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   912
#   endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   913
#  endif
0147b4f725ae *** empty log message ***
claus
parents: 81
diff changeset
   914
# else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   915
		    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   916
		    while (nInstVars--)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   917
			*op++ = nil;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   918
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   919
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   920
		    RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   921
		    break;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   922
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   923
		default:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   924
		    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   925
		     * new:n for non-variable classes only allowed if
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   926
		     * n == 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   927
		     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   928
		    if (nindexedinstvars == 0) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   929
			instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   930
			PROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   931
			_qAlignedNew(newobj, instsize, SENDER);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   932
			UNPROTECT_CONTEXT
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   933
			if (newobj == nil) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   934
			    break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   935
			}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   936
			_InstPtr(newobj)->o_class = self;
369
claus
parents: 362
diff changeset
   937
			__qSTORE(newobj, self);
claus
parents: 362
diff changeset
   938
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   939
			if (nInstVars) {
357
claus
parents: 356
diff changeset
   940
#if defined(FAST_OBJECT_MEMSET4) || defined(FAST_MEMSET4)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   941
			    memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   942
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   943
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   944
			    /*
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   945
			     * knowing that nil is 0
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   946
			     */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   947
			    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   948
# else
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   949
			    op = _InstPtr(newobj)->i_instvars;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   950
			    do {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   951
				*op++ = nil;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   952
			    } while (--nInstVars);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   953
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   954
#endif
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   955
			}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   956
			RETURN ( newobj );
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   957
		    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   958
		    break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   959
	    }
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   960
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   961
    }
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   962
%}.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   963
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   964
     arrive here if something went wrong ...
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   965
     figure out what it was
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   966
    "
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   967
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   968
    (anInteger isMemberOf:SmallInteger) ifFalse:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   969
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   970
	 the argument is either not an integer,
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   971
	 or a LargeInteger (which means that its definitely too big)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   972
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   973
	self error:'argument to new: must be Integer'.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   974
	^ nil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   975
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   976
    (anInteger < 0) ifTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   977
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   978
	 the argument is negative,
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   979
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   980
	self error:'bad (negative) argument to new:'.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   981
	^ nil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   982
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   983
    self isVariable ifFalse:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   984
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   985
	 this class does not have any indexed instance variables
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   986
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   987
	self error:'class has no indexed instvars - cannot create with new:'.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
   988
	^ nil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   989
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   990
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   991
     memory allocation failed.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   992
     When we arrive here, there was no memory, even after
165
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   993
     a garbage collect. 
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   994
     This means, that the VM wanted to get some more memory from the 
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   995
     Operatingsystem, which was not kind enough to give it.
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
   996
     Bad luck - you should increase the swap space on your machine.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
   997
    "
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
   998
    ^ ObjectMemory allocationFailureSignal raise.
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   999
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1000
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1001
readFrom:aStream
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1002
    "read an objects printed representation from the argument, aStream 
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1003
     and return it. 
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1004
     The read object must be a kind of myself if its not, an error is raised.
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1005
     This is the reverse operation to 'storeOn:'.
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  1006
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1007
     WARNING: storeOn: does not handle circular references and multiple 
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1008
	      references to the same object.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1009
	      Use #storeBinary:/readBinaryFrom: for this."
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1010
345
claus
parents: 343
diff changeset
  1011
    ^ self readFrom:aStream onError:[self error:'expected: ' , self name]
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1012
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1013
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1014
     |s|
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1015
     s := WriteStream on:String new.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1016
     #(1 2 3 4) storeOn:s.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1017
     Object readFrom:(ReadStream on:s contents)  
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1018
    "
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1019
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1020
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1021
readFrom:aStream onError:exceptionBlock
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1022
    "read an objects printed representation from the argument, aStream 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1023
     and return it (i.e. the stream should contain some representation of
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1024
     the object which was created using #storeOn:). 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1025
     The read object must be a kind of myself if its not, the value of
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1026
     exceptionBlock is returned.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1027
     To get any object, use 'Object readFrom:...',
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1028
     To get any number, use 'Number readFrom:...' and so on.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1029
     This is the reverse operation to 'storeOn:'.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1030
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1031
     WARNING: storeOn: does not handle circular references and multiple 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1032
	      references to the same object.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1033
	      Use #storeBinary:/readBinaryFrom: for this."
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1034
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1035
    |newObject|
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1036
340
claus
parents: 331
diff changeset
  1037
    ErrorSignal handle:[:ex |
claus
parents: 331
diff changeset
  1038
	ex return
claus
parents: 331
diff changeset
  1039
    ] do:[
345
claus
parents: 343
diff changeset
  1040
	newObject := self evaluatorClass evaluate:aStream.
340
claus
parents: 331
diff changeset
  1041
    ].
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1042
    (newObject isKindOf:self) ifFalse:[^ exceptionBlock value].
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1043
    ^ newObject
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1044
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1045
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1046
     |s|
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1047
     s := WriteStream on:String new.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1048
     #(1 2 3 4) storeOn:s.
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1049
     Transcript showCr:(
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1050
	Array readFrom:(ReadStream on:s contents) onError:'not an Array'
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1051
     )
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1052
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1053
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1054
     |s|
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1055
     s := WriteStream on:String new.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1056
     #[1 2 3 4] storeOn:s.
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1057
     Transcript showCr:(
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1058
	 Array readFrom:(ReadStream on:s contents) onError:'not an Array'
345
claus
parents: 343
diff changeset
  1059
     )
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1060
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1061
!
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1062
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1063
readFromString:aString
275
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1064
    "create an object from its printed representation.
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1065
     For most classes, the string is expected to be in a format created by
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1066
     storeOn: or storeString; however, some (Time, Date) expect a user
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1067
     readable string here.
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1068
     See comments in Behavior>>readFromString:onError:,
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1069
     Behavior>>readFrom: and Behavior>>readFrom:onError:"
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1070
345
claus
parents: 343
diff changeset
  1071
    ^ self readFromString:aString onError:[self error:'expected: ' , self name]
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1072
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1073
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1074
     Integer readFromString:'12345678901234567890' 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1075
     Point readFromString:'1@2'  
345
claus
parents: 343
diff changeset
  1076
     Point readFromString:'1'  
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1077
    "
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1078
!
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1079
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1080
readFromString:aString onError:exceptionBlock
275
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1081
    "create an object from its printed representation.
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1082
     Here, the string is expected to be in a format created by
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1083
     storeOn: or storeString; however, some classes (Time, Date) may redefine
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1084
     it to expect a user readable string here.
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1085
     See comments in Behavior>>readFrom: and Behavior>>readFrom:onError:"
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1086
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1087
    ^ self readFrom:(ReadStream on:aString) onError:exceptionBlock
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1088
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1089
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1090
     Integer readFromString:'12345678901234567890' 
275
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1091
     Integer readFromString:'abc' 
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1092
     Integer readFromString:'abc' onError:0
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1093
     Point readFromString:'1@2'  
345
claus
parents: 343
diff changeset
  1094
     Point readFromString:'0'   
275
a76029ddaa98 *** empty log message ***
claus
parents: 249
diff changeset
  1095
     Point readFromString:'0' onError:[0@0]  
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  1096
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1097
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1098
10
claus
parents: 5
diff changeset
  1099
!Behavior methodsFor:'autoload check'!
claus
parents: 5
diff changeset
  1100
claus
parents: 5
diff changeset
  1101
isLoaded
claus
parents: 5
diff changeset
  1102
    "return true, if the class has been loaded; 
claus
parents: 5
diff changeset
  1103
     redefined in Autoload; see comment there"
claus
parents: 5
diff changeset
  1104
claus
parents: 5
diff changeset
  1105
    ^ true
claus
parents: 5
diff changeset
  1106
!
claus
parents: 5
diff changeset
  1107
claus
parents: 5
diff changeset
  1108
autoload
claus
parents: 5
diff changeset
  1109
    "force autoloading - do nothing here; 
claus
parents: 5
diff changeset
  1110
     redefined in Autoload; see comment there"
claus
parents: 5
diff changeset
  1111
claus
parents: 5
diff changeset
  1112
    ^ self
claus
parents: 5
diff changeset
  1113
! !
claus
parents: 5
diff changeset
  1114
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1115
!Behavior methodsFor:'snapshots'!
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1116
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1117
preSnapshot
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1118
    "sent by ObjectMemory, before a snapshot is written.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1119
     Nothing done here."
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1120
!
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1121
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1122
postSnapshot
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1123
    "sent by ObjectMemory, after a snapshot has been written.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1124
     Nothing done here."
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1125
! !
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1126
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1127
!Behavior class methodsFor:'flag bit constants'!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1128
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1129
flagNotIndexed
356
claus
parents: 345
diff changeset
  1130
    "return the flag code for non-indexed instances.
claus
parents: 345
diff changeset
  1131
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1132
     it with flagNotIndexed."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1133
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1134
    ^ 0
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1135
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1136
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1137
flagBytes
356
claus
parents: 345
diff changeset
  1138
    "return the flag code for byte-valued indexed instances.
claus
parents: 345
diff changeset
  1139
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1140
     it with flagBytes."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1141
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1142
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1143
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1144
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1145
    RETURN ( _MKSMALLINT(BYTEARRAY) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1146
%}
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1147
    "
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1148
     Behavior flagBytes    
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1149
    "
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1150
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1151
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1152
flagWords
356
claus
parents: 345
diff changeset
  1153
    "return the flag code for word-valued indexed instances (i.e. 2-byte).
claus
parents: 345
diff changeset
  1154
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1155
     it with flagWords."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1156
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1157
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1158
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1159
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1160
    RETURN ( _MKSMALLINT(WORDARRAY) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1161
%}
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1162
    "
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1163
     Behavior flagWords    
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1164
    "
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1165
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1166
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1167
flagLongs
356
claus
parents: 345
diff changeset
  1168
    "return the flag code for long-valued indexed instances (i.e. 4-byte).
claus
parents: 345
diff changeset
  1169
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1170
     it with flagLongs."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1171
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1172
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1173
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1174
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1175
    RETURN ( _MKSMALLINT(LONGARRAY) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1176
%}
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1177
    "
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1178
     Behavior flagLongs    
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1179
    "
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1180
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1181
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1182
flagFloats
356
claus
parents: 345
diff changeset
  1183
    "return the flag code for float-valued indexed instances (i.e. 4-byte reals).
claus
parents: 345
diff changeset
  1184
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1185
     it with flagFloats."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1186
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1187
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1188
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1189
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1190
    RETURN ( _MKSMALLINT(FLOATARRAY) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1191
%}
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1192
    "
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1193
     Behavior flagFloats    
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1194
    "
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1195
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1196
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1197
flagDoubles
356
claus
parents: 345
diff changeset
  1198
    "return the flag code for double-valued indexed instances (i.e. 8-byte reals).
claus
parents: 345
diff changeset
  1199
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1200
     it with flagDoubles."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1201
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1202
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1203
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1204
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1205
    RETURN ( _MKSMALLINT(DOUBLEARRAY) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1206
%}
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1207
    "
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1208
     Behavior flagDoubles    
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1209
    "
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1210
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1211
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1212
flagPointers
356
claus
parents: 345
diff changeset
  1213
    "return the flag code for pointer indexed instances (i.e. Array of object).
claus
parents: 345
diff changeset
  1214
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1215
     it with flagPointers."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1216
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1217
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1218
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1219
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1220
    RETURN ( _MKSMALLINT(POINTERARRAY) );
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1221
%}
293
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1222
    "
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1223
     Behavior flagPointers    
31df3850e98c *** empty log message ***
claus
parents: 283
diff changeset
  1224
    "
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1225
! 
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1226
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1227
flagWeakPointers
356
claus
parents: 345
diff changeset
  1228
    "return the flag code for weak pointer indexed instances (i.e. WeakArray).
claus
parents: 345
diff changeset
  1229
     You have to mask the flag value with indexMask when comparing
claus
parents: 345
diff changeset
  1230
     it with flagWeakPointers."
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1231
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1232
%{  /* NOCONTEXT */
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1233
    /* this is defined as a primitive to get defines from stc.h */
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1234
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1235
    RETURN ( _MKSMALLINT(WKPOINTERARRAY) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1236
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1237
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1238
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1239
maskIndexType
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1240
    "return a mask to extract all index-type bits"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1241
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1242
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1243
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1244
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1245
    RETURN ( _MKSMALLINT(ARRAYMASK) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1246
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1247
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1248
345
claus
parents: 343
diff changeset
  1249
flagBehavior
356
claus
parents: 345
diff changeset
  1250
    "return the flag code which marks Behavior-like instances.
claus
parents: 345
diff changeset
  1251
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1252
     checking for behaviors."
345
claus
parents: 343
diff changeset
  1253
claus
parents: 343
diff changeset
  1254
%{  /* NOCONTEXT */
claus
parents: 343
diff changeset
  1255
    /* this is defined as a primitive to get defines from stc.h */
claus
parents: 343
diff changeset
  1256
claus
parents: 343
diff changeset
  1257
    RETURN ( _MKSMALLINT(BEHAVIOR_INSTS) );
claus
parents: 343
diff changeset
  1258
%}
356
claus
parents: 345
diff changeset
  1259
claus
parents: 345
diff changeset
  1260
    "consistency check:
claus
parents: 345
diff changeset
  1261
     all class-entries must be behaviors;
claus
parents: 345
diff changeset
  1262
     all behaviors must be flagged so (in its class's flags)
claus
parents: 345
diff changeset
  1263
     (otherwise, VM will bark)
claus
parents: 345
diff changeset
  1264
     all non-behaviors may not be flagged
claus
parents: 345
diff changeset
  1265
claus
parents: 345
diff changeset
  1266
     |bit|
claus
parents: 345
diff changeset
  1267
     bit := Class flagBehavior.
claus
parents: 345
diff changeset
  1268
claus
parents: 345
diff changeset
  1269
     ObjectMemory allObjectsDo:[:o|
claus
parents: 345
diff changeset
  1270
       o isBehavior ifTrue:[
claus
parents: 345
diff changeset
  1271
	 (o class flags bitTest:bit) ifFalse:[
claus
parents: 345
diff changeset
  1272
	     self halt
claus
parents: 345
diff changeset
  1273
	 ].
claus
parents: 345
diff changeset
  1274
       ] ifFalse:[
claus
parents: 345
diff changeset
  1275
	 (o class flags bitTest:bit) ifTrue:[
claus
parents: 345
diff changeset
  1276
	     self halt
claus
parents: 345
diff changeset
  1277
	 ].
claus
parents: 345
diff changeset
  1278
       ].
claus
parents: 345
diff changeset
  1279
       o class isBehavior ifFalse:[
claus
parents: 345
diff changeset
  1280
	 self halt
claus
parents: 345
diff changeset
  1281
       ] ifTrue:[
claus
parents: 345
diff changeset
  1282
	 (o class class flags bitTest:bit) ifFalse:[
claus
parents: 345
diff changeset
  1283
	     self halt
claus
parents: 345
diff changeset
  1284
	 ]
claus
parents: 345
diff changeset
  1285
       ]
claus
parents: 345
diff changeset
  1286
     ]
claus
parents: 345
diff changeset
  1287
    "
345
claus
parents: 343
diff changeset
  1288
! 
claus
parents: 343
diff changeset
  1289
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1290
flagBlock
356
claus
parents: 345
diff changeset
  1291
    "return the flag code which marks Block-like instances.
claus
parents: 345
diff changeset
  1292
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1293
     checking for blocks."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1294
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1295
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1296
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1297
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1298
    RETURN ( _MKSMALLINT(BLOCK_INSTS) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1299
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1300
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1301
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1302
flagMethod
356
claus
parents: 345
diff changeset
  1303
    "return the flag code which marks Method-like instances.
claus
parents: 345
diff changeset
  1304
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1305
     checking for methods."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1306
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1307
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1308
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1309
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1310
    RETURN ( _MKSMALLINT(METHOD_INSTS) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1311
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1312
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1313
357
claus
parents: 356
diff changeset
  1314
flagNonObjectInst
claus
parents: 356
diff changeset
  1315
    "return the flag code which marks instances which have a
362
claus
parents: 360
diff changeset
  1316
     non-object instance variable (in slot 1).
357
claus
parents: 356
diff changeset
  1317
     (these are ignored by the garbage collector)"
claus
parents: 356
diff changeset
  1318
claus
parents: 356
diff changeset
  1319
%{  /* NOCONTEXT */
claus
parents: 356
diff changeset
  1320
    /* this is defined as a primitive to get defines from stc.h */
claus
parents: 356
diff changeset
  1321
claus
parents: 356
diff changeset
  1322
    RETURN ( _MKSMALLINT(NONOBJECT_INSTS) );
claus
parents: 356
diff changeset
  1323
%}
claus
parents: 356
diff changeset
  1324
!
claus
parents: 356
diff changeset
  1325
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1326
flagContext
356
claus
parents: 345
diff changeset
  1327
    "return the flag code which marks Context-like instances.
claus
parents: 345
diff changeset
  1328
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1329
     checking for contexts."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1330
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1331
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1332
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1333
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1334
    RETURN ( _MKSMALLINT(CONTEXT_INSTS) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1335
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1336
! 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1337
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1338
flagBlockContext
356
claus
parents: 345
diff changeset
  1339
    "return the flag code which marks BlockContext-like instances.
claus
parents: 345
diff changeset
  1340
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1341
     checking for blockContexts."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1342
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1343
%{  /* NOCONTEXT */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1344
    /* this is defined as a primitive to get defines from stc.h */
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1345
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1346
    RETURN ( _MKSMALLINT(BCONTEXT_INSTS) );
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1347
%}
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1348
! 
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1349
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1350
flagFloat
356
claus
parents: 345
diff changeset
  1351
    "return the flag code which marks Float-like instances.
claus
parents: 345
diff changeset
  1352
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1353
     checking for floats."
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1354
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1355
%{  /* NOCONTEXT */
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1356
    /* this is defined as a primitive to get defines from stc.h */
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1357
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1358
    RETURN ( _MKSMALLINT(FLOAT_INSTS) );
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1359
%}
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1360
! 
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1361
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1362
flagSymbol
356
claus
parents: 345
diff changeset
  1363
    "return the flag code which marks Symbol-like instances.
claus
parents: 345
diff changeset
  1364
     You have to check this single bit in the flag value when
claus
parents: 345
diff changeset
  1365
     checking for symbols."
92
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1366
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1367
%{  /* NOCONTEXT */
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1368
    /* this is defined as a primitive to get defines from stc.h */
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1369
0c73b48551ac *** empty log message ***
claus
parents: 91
diff changeset
  1370
    RETURN ( _MKSMALLINT(SYMBOL_INSTS) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1371
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1372
! !
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1373
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1374
!Behavior methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1375
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1376
name
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1377
    "although behaviors have no name, we return something
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1378
     useful here - there are many places (inspectors) where
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1379
     a classes name is asked for.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1380
     Implementing this message here allows anonymous classes
151
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  1381
     and instances of them to be inspected."
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1382
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1383
    ^ 'someBehavior'
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1384
!
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1385
356
claus
parents: 345
diff changeset
  1386
displayString
claus
parents: 345
diff changeset
  1387
    "although behaviors have no name, we return something
claus
parents: 345
diff changeset
  1388
     useful here - there are many places (inspectors) where
claus
parents: 345
diff changeset
  1389
     a classes name is asked for.
claus
parents: 345
diff changeset
  1390
     Implementing this message here allows instances of anonymous classes
claus
parents: 345
diff changeset
  1391
     to show a reasonable name."
claus
parents: 345
diff changeset
  1392
claus
parents: 345
diff changeset
  1393
    ^ 'someBehavior'
claus
parents: 345
diff changeset
  1394
!
claus
parents: 345
diff changeset
  1395
claus
parents: 345
diff changeset
  1396
category
claus
parents: 345
diff changeset
  1397
    "return the category of the class. 
claus
parents: 345
diff changeset
  1398
     Returning nil here, since Behavior does not define a category
claus
parents: 345
diff changeset
  1399
     (only ClassDescriptions do)."
claus
parents: 345
diff changeset
  1400
claus
parents: 345
diff changeset
  1401
    ^ nil
claus
parents: 345
diff changeset
  1402
claus
parents: 345
diff changeset
  1403
    "
claus
parents: 345
diff changeset
  1404
     Point category                
claus
parents: 345
diff changeset
  1405
     Behavior new category           
claus
parents: 345
diff changeset
  1406
    "
claus
parents: 345
diff changeset
  1407
!
claus
parents: 345
diff changeset
  1408
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1409
superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1410
    "return the receivers superclass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1411
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1412
    ^ superclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1413
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1414
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1415
selectorArray 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1416
    "return the receivers selector array.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1417
     Notice: this is not compatible with ST-80."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1418
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1419
    ^ selectorArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1420
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1421
362
claus
parents: 360
diff changeset
  1422
selectors
claus
parents: 360
diff changeset
  1423
    "return the receivers selector array.
claus
parents: 360
diff changeset
  1424
     Notice: this may not compatible with ST-80.
claus
parents: 360
diff changeset
  1425
     (should we return a Set ?)"
claus
parents: 360
diff changeset
  1426
claus
parents: 360
diff changeset
  1427
    ^ selectorArray asOrderedCollection
claus
parents: 360
diff changeset
  1428
!
claus
parents: 360
diff changeset
  1429
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1430
methodArray
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1431
    "return the receivers method array.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1432
     Notice: this is not compatible with ST-80."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1433
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1434
    ^ methodArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1435
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1436
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1437
methodDictionary
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1438
    "return the receivers method dictionary. 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1439
     Since no dictionary is actually present, create one for ST-80 compatibility."
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1440
345
claus
parents: 343
diff changeset
  1441
    |dict n "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1442
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1443
    dict := IdentityDictionary new.
345
claus
parents: 343
diff changeset
  1444
    n := selectorArray size.
claus
parents: 343
diff changeset
  1445
    1 to:n do:[:index |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1446
	dict at:(selectorArray at:index) put:(methodArray at:index)
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1447
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1448
    ^ dict
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1449
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1450
362
claus
parents: 360
diff changeset
  1451
implicit_methodDict 
claus
parents: 360
diff changeset
  1452
    "ST-80 compatibility.
claus
parents: 360
diff changeset
  1453
     This allows subclasses to assume there is an instance variable
claus
parents: 360
diff changeset
  1454
     named methodDict."
claus
parents: 360
diff changeset
  1455
claus
parents: 360
diff changeset
  1456
    ^ self methodDictionary
claus
parents: 360
diff changeset
  1457
!
claus
parents: 360
diff changeset
  1458
claus
parents: 360
diff changeset
  1459
implicit_methodDict:aDictionary 
claus
parents: 360
diff changeset
  1460
    "ST-80 compatibility.
claus
parents: 360
diff changeset
  1461
     This allows subclasses to assume there is an instance variable
claus
parents: 360
diff changeset
  1462
     named methodDict."
claus
parents: 360
diff changeset
  1463
claus
parents: 360
diff changeset
  1464
    ^ self error:'not allowed to set the methodDictionary'
claus
parents: 360
diff changeset
  1465
!
claus
parents: 360
diff changeset
  1466
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1467
instSize
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1468
    "return the number of instance variables of the receiver.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1469
     This includes all superclass instance variables."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1470
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1471
    ^ instSize
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1472
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1473
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1474
flags
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1475
    "return the receivers flag bits"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1476
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1477
    ^ flags
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1478
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1479
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1480
superclass:aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1481
    "set the superclass - this actually creates a new class,
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1482
     recompiling all methods for the new one. The receiving class stays
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1483
     around anonymous to allow existing instances some life.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1484
     This may change in the future (adjusting existing instances)"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1485
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1486
    SubclassInfo := nil.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1487
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1488
    "must flush caches since lookup chain changes"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1489
    ObjectMemory flushCaches.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1490
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1491
"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1492
    superclass := aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1493
"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1494
    "for correct recompilation, just create a new class ..."
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1495
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1496
    aClass subclass:(self name)
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1497
	   instanceVariableNames:(self instanceVariableString)
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1498
	   classVariableNames:(self classVariableString)
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1499
	   poolDictionaries:''
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1500
	   category:self category
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1501
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1502
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1503
addSuperclass:aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1504
    "EXPERIMENTAL MI support: add aClass to the set of classes, from which instances
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1505
     inherit protocol."
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1506
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1507
    "first, check if the class is abstract - 
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1508
     allows abstract mixins are allowed in the current implementation"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1509
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1510
    aClass instSize == 0 ifFalse:[
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1511
	self error:'only abstract mixins allowed'.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1512
	^ self
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1513
    ].
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1514
    otherSuperclasses isNil ifTrue:[
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1515
	otherSuperclasses := Array with:aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1516
    ] ifFalse:[
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1517
	otherSuperclasses := otherSuperclasses copyWith:aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1518
    ].
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1519
    SubclassInfo := nil.
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1520
    ObjectMemory flushCaches
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1521
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1522
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1523
removeSuperclass:aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1524
    "EXPERIMENTAL MI support: remove aClass from the set of classes, from which instances
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1525
     inherit protocol."
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1526
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1527
    otherSuperclasses notNil ifTrue:[
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1528
	otherSuperclasses := otherSuperclasses copyWithout:aClass.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1529
	otherSuperclasses isEmpty ifTrue:[
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1530
	    otherSuperclasses := nil
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1531
	].
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1532
	SubclassInfo := nil.
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1533
	ObjectMemory flushCaches
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1534
    ].
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1535
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1536
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1537
selectors:newSelectors methods:newMethods
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1538
    "set both selector array and method array of the receiver,
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1539
     and flush caches"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1540
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1541
    ObjectMemory flushCaches.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1542
    selectorArray := newSelectors.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1543
    methodArray := newMethods
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1544
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1545
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1546
addSelector:newSelector withMethod:newMethod
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1547
    "add the method given by 2nd argument under the selector given by
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1548
     1st argument to the methodDictionary. Flush all caches."
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1549
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1550
    |nargs|
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1551
249
claus
parents: 216
diff changeset
  1552
    (self primAddSelector:newSelector withMethod:newMethod) ifFalse:[^ false].
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1553
    self changed:#methodDictionary with:newSelector.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1554
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1555
    "
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1556
     if I have no subclasses, all we have to flush is cached
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1557
     data for myself ... (actually, in any case all that needs
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1558
     to be flushed is info for myself and all of my subclasses)
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1559
    "
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1560
"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1561
    problem: this is slower; since looking for all subclasses is (currently)
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1562
	     a bit slow :-(
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1563
	     We need the hasSubclasses-info bit in Behavior; now
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1564
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1565
    self withAllSubclassesDo:[:aClass |
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1566
	ObjectMemory flushInlineCachesFor:aClass withArgs:nargs.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1567
	ObjectMemory flushMethodCacheFor:aClass
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1568
    ].
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1569
"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1570
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1571
    "
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1572
     actually, we would do better with less flushing ...
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1573
    "
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1574
    nargs := newSelector numArgs.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1575
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1576
    ObjectMemory flushMethodCache.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1577
    ObjectMemory flushInlineCachesWithArgs:nargs.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1578
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1579
    ^ true
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1580
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1581
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1582
addSelector:newSelector withLazyMethod:newMethod
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1583
    "add the method given by 2nd argument under the selector given by
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1584
     1st argument to the methodDictionary. Since it does not flush
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1585
     any caches, this is only allowed for lazy methods."
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1586
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1587
    newMethod isLazyMethod ifFalse:[
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1588
	self error:'operation only allowed for lazy methods'.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1589
	^ false
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1590
    ].
362
claus
parents: 360
diff changeset
  1591
    "/ oops: we must flush, if this method already exists ...
claus
parents: 360
diff changeset
  1592
    (selectorArray includes:newSelector) ifTrue:[
claus
parents: 360
diff changeset
  1593
	ObjectMemory flushCaches
claus
parents: 360
diff changeset
  1594
    ].
249
claus
parents: 216
diff changeset
  1595
    (self primAddSelector:newSelector withMethod:newMethod) ifTrue:[
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1596
	self changed:#methodDictionary with:newSelector.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1597
	^ true
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1598
    ].
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1599
    ^ false
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1600
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1601
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1602
removeSelector:aSelector
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1603
    "remove the selector, aSelector and its associated method 
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1604
     from the methodDictionary"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1605
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1606
    |index oldSelectorArray oldMethodArray newSelectorArray newMethodArray|
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1607
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1608
    index := selectorArray identityIndexOf:aSelector startingAt:1.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1609
    (index == 0) ifTrue:[^ false].
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1610
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1611
    newSelectorArray := selectorArray copyWithoutIndex:index.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1612
    newMethodArray := methodArray copyWithoutIndex:index.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1613
    oldSelectorArray := selectorArray.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1614
    oldMethodArray := methodArray.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1615
    selectorArray := newSelectorArray.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1616
    methodArray := newMethodArray.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1617
"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1618
    [
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1619
	|nargs|
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1620
	nargs := aSelector numArgs.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1621
	ObjectMemory flushMethodCache.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1622
	ObjectMemory flushInlineCachesWithArgs:nargs.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1623
    ] value
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1624
"
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1625
    "
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1626
     actually, we would do better with less flushing ...
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1627
    "
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1628
    ObjectMemory flushCaches.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1629
    ^ true
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1630
! !
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1631
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1632
!Behavior methodsFor:'queries'!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1633
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1634
sizeOfInst:n
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1635
    "return the number of bytes required for an instance of
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1636
     myself with n indexed instance variables. The argument n 
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1637
     should be zero for classes without indexed instance variables.
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1638
     See Behavior>>niceNew: for an application of this."
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1639
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1640
    |nInstvars|
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1641
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1642
    nInstvars := self instSize.
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1643
%{
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1644
    int nBytes;
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1645
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1646
    nBytes = _intVal(nInstvars) * sizeof(OBJ) + OHDR_SIZE; 
249
claus
parents: 216
diff changeset
  1647
    if (__isSmallInteger(n)) {
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1648
	int nIndex;
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1649
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1650
	nIndex = _intVal(n);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1651
	switch (_intVal(_INST(flags)) & ARRAYMASK) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1652
	    case BYTEARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1653
		nBytes += nIndex;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1654
		if (nBytes & (ALIGN - 1)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1655
		    nBytes = (nBytes & ~(ALIGN - 1)) + ALIGN;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1656
		}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1657
		break;
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1658
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1659
	    case WORDARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1660
		nBytes += nIndex * sizeof(short);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1661
		if (nBytes & (ALIGN - 1)) {
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1662
		    nBytes = (nBytes & ~(ALIGN - 1)) + ALIGN;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1663
		}
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1664
		break;
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1665
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1666
	    case LONGARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1667
		nBytes += nIndex * sizeof(long);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1668
		break;
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1669
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1670
	    case FLOATARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1671
		nBytes += nIndex * sizeof(float);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1672
		break;
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1673
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1674
	    case DOUBLEARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1675
		nBytes += nIndex * sizeof(double);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1676
		break;
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1677
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1678
	    default:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1679
		nBytes += nIndex * sizeof(OBJ);
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1680
		break;
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1681
	}
127
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1682
    }
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1683
    RETURN (_MKSMALLINT(nBytes));
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1684
%}
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1685
!
6625c77d890f added sizeOfInst:
claus
parents: 92
diff changeset
  1686
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1687
isVariable
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1688
    "return true, if instances have indexed instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1689
362
claus
parents: 360
diff changeset
  1690
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1691
	^ (flags bitAnd:(Behavior maskIndexType)) ~~ 0
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1692
     "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1693
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1694
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1695
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1696
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1697
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1698
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1699
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1700
isFixed
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1701
    "return true, if instances do not have indexed instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1702
362
claus
parents: 360
diff changeset
  1703
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1704
	^ self isVariable not
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1705
    "
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1706
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1707
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1708
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1709
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? false : true ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1710
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1711
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1712
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1713
isBits
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1714
    "return true, if instances have indexed byte or short instance variables.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1715
     Ignore long, float and double arrays, since ST-80 code using isBits are probably
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1716
     not prepared to handle them correctly."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1717
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1718
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1719
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1720
    REGISTER int flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1721
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1722
    RETURN ( (((flags = (_intVal(_INST(flags)) & ARRAYMASK)) == BYTEARRAY)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1723
	     || (flags == WORDARRAY)) ? true : false ); 
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1724
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1725
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1726
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1727
isBytes
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1728
    "return true, if instances have indexed byte instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1729
362
claus
parents: 360
diff changeset
  1730
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1731
	^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagBytes
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1732
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1733
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1734
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1735
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == BYTEARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1736
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1737
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1738
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1739
isWords
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1740
    "return true, if instances have indexed short instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1741
362
claus
parents: 360
diff changeset
  1742
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1743
	^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagWords
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1744
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1745
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1746
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1747
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == WORDARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1748
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1749
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1750
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1751
isLongs
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1752
    "return true, if instances have indexed long instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1753
362
claus
parents: 360
diff changeset
  1754
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1755
	^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagLongs
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1756
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1757
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1758
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1759
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == LONGARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1760
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1761
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1762
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1763
isFloats
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1764
    "return true, if instances have indexed float instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1765
362
claus
parents: 360
diff changeset
  1766
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1767
	^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagFloats
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1768
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1769
%{  /* NOCONTEXT */
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1770
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1771
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == FLOATARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1772
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1773
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1774
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1775
isDoubles
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1776
    "return true, if instances have indexed double instance variables"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1777
362
claus
parents: 360
diff changeset
  1778
    "this could also be defined as:
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1779
	^ (flags bitAnd:(Behavior maskIndexType)) == Behavior flagDoubles
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1780
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1781
%{  /* NOCONTEXT */
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1782
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1783
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == DOUBLEARRAY) ? true : false ); 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1784
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1785
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1786
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1787
isPointers
2
claus
parents: 1
diff changeset
  1788
    "return true, if instances have pointer instance variables 
claus
parents: 1
diff changeset
  1789
     i.e. are either non-indexed or have indexed pointer variables"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1790
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1791
    "QUESTION: should we ignore WeakPointers ?"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1792
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1793
%{  /* NOCONTEXT */
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1794
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1795
    REGISTER int flags;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1796
2
claus
parents: 1
diff changeset
  1797
    flags = _intVal(_INST(flags)) & ARRAYMASK;
claus
parents: 1
diff changeset
  1798
    switch (flags) {
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1799
	default:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1800
	    /* normal objects */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1801
	    RETURN ( true );
2
claus
parents: 1
diff changeset
  1802
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1803
	case BYTEARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1804
	case WORDARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1805
	case LONGARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1806
	case FLOATARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1807
	case DOUBLEARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1808
	    RETURN (false );
2
claus
parents: 1
diff changeset
  1809
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1810
	case WKPOINTERARRAY:
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1811
	    /* what about those ? */
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1812
	    RETURN (true );
2
claus
parents: 1
diff changeset
  1813
    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1814
%}
2
claus
parents: 1
diff changeset
  1815
!
claus
parents: 1
diff changeset
  1816
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1817
isBehavior
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1818
    "return true, if the receiver is describing another objects behavior,
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1819
     i.e. is a class. Defined to avoid the need to use isKindOf:"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1820
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1821
    ^ true
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1822
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1823
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1824
     True isBehavior   
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1825
     true isBehavior
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1826
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1827
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1828
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1829
canBeSubclassed
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1830
    "return true, if its allowed to create subclasses of the receiver.
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1831
     This method is redefined in SmallInteger and UndefinedObject, since
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1832
     instances are detected by their pointer-fields, i.e. they do not have
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1833
     a class entry (you dont have to understand this :-)"
47
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1834
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1835
    ^ true
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1836
!
93f17a1b452c *** empty log message ***
claus
parents: 45
diff changeset
  1837
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1838
hasMultipleSuperclasses
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1839
    "Return true, if this class inherits from other classes 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1840
     (beside its primary superclass). 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1841
     This method is a preparation for a future multiple inheritance extension 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1842
     - currently it is not supported by the VM"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1843
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1844
    ^ otherSuperclasses notNil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1845
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1846
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1847
superclasses
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1848
    "return a collection of the receivers immediate superclasses.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1849
     This method is a preparation for a future multiple inheritance extension 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1850
     - currently it is not supported by the VM"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1851
345
claus
parents: 343
diff changeset
  1852
    |a|
claus
parents: 343
diff changeset
  1853
claus
parents: 343
diff changeset
  1854
    a := Array with:superclass.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1855
    otherSuperclasses notNil ifTrue:[
345
claus
parents: 343
diff changeset
  1856
	^ a , otherSuperclasses
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1857
    ].
345
claus
parents: 343
diff changeset
  1858
    ^ a
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1859
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1860
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1861
     String superclasses  
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1862
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1863
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1864
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1865
allSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1866
    "return a collection of the receivers accumulated superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1867
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1868
    |aCollection theSuperClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1869
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1870
    theSuperClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1871
    theSuperClass notNil ifTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1872
	aCollection := OrderedCollection new.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1873
	[theSuperClass notNil] whileTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1874
	    aCollection add:theSuperClass.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1875
	    theSuperClass := theSuperClass superclass
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1876
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1877
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1878
    ^ aCollection
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1879
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1880
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1881
     String allSuperclasses 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1882
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1883
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1884
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1885
withAllSuperclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1886
    "return a collection containing the receiver and all
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1887
     of the receivers accumulated superclasses"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1888
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1889
    |aCollection theSuperClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1890
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1891
    aCollection := OrderedCollection with:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1892
    theSuperClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1893
    [theSuperClass notNil] whileTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1894
	aCollection add:theSuperClass.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1895
	theSuperClass := theSuperClass superclass
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1896
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1897
    ^ aCollection
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1898
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1899
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1900
     String withAllSuperclasses 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1901
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1902
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1903
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1904
subclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1905
    "return a collection of the direct subclasses of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1906
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1907
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1908
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1909
    SubclassInfo notNil ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1910
	newColl := SubclassInfo at:self ifAbsent:nil.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1911
	newColl notNil ifTrue:[^ newColl asOrderedCollection]
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1912
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  1913
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1914
    newColl := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1915
    self subclassesDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1916
	newColl add:aClass
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1917
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1918
    ^ newColl
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1919
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1920
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1921
     Collection subclasses
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1922
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1923
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1924
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1925
allSubclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1926
    "return a collection of all subclasses (direct AND indirect) of
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1927
     the receiver. There will be no specific order, in which entries
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1928
     are returned."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1929
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1930
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1931
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1932
    newColl := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1933
    self allSubclassesDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1934
	newColl add:aClass
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1935
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1936
    ^ newColl
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1937
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1938
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1939
     Collection allSubclasses
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1940
    "
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1941
!
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1942
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1943
allSubclassesInOrder
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1944
    "return a collection of all subclasses (direct AND indirect) of
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1945
     the receiver. Higher level subclasses will come before lower ones."
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1946
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1947
    |newColl|
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1948
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1949
    newColl := OrderedCollection new.
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1950
    self allSubclassesInOrderDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1951
	newColl add:aClass
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1952
    ].
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1953
    ^ newColl
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1954
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1955
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1956
     Collection allSubclassesInOrder
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1957
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1958
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1959
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1960
withAllSubclasses
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1961
    "return a collection containing the receiver and 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1962
     all subclasses (direct AND indirect) of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1963
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1964
    |newColl|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1965
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1966
    newColl := OrderedCollection with:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1967
    self allSubclassesDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1968
	newColl add:aClass
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1969
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1970
    ^ newColl
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1971
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1972
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1973
     Collection withAllSubclasses
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1974
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1975
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1976
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1977
isSubclassOf:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1978
    "return true, if I am a subclass of the argument, aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1979
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1980
    |theClass|
2
claus
parents: 1
diff changeset
  1981
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1982
    theClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1983
    [theClass notNil] whileTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  1984
	(theClass == aClass) ifTrue:[^ true].
375
claus
parents: 369
diff changeset
  1985
%{
claus
parents: 369
diff changeset
  1986
	if (__isBehaviorLike(theClass)) {
claus
parents: 369
diff changeset
  1987
	    theClass = __ClassInstPtr(theClass)->c_superclass;
claus
parents: 369
diff changeset
  1988
	} else {
claus
parents: 369
diff changeset
  1989
	    theClass = nil;
claus
parents: 369
diff changeset
  1990
	}
claus
parents: 369
diff changeset
  1991
%}.
claus
parents: 369
diff changeset
  1992
"/        theClass := theClass superclass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1993
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1994
    ^ false
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  1995
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1996
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1997
     String isSubclassOf:Collection  
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1998
     LinkedList isSubclassOf:Array   
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  1999
     1 isSubclassOf:Number              <- will fail since 1 is no class
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2000
    "     
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2001
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2002
151
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2003
allInstVarNames
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2004
    "return a collection of all the instance variable name-strings
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2005
     this includes all superclass-instance variables.
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2006
     Since Behavior has no idea of instvar-names, return an empty collection
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2007
     here. Redefined in ClassDescription."
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2008
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2009
    ^ #()
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2010
!
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2011
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2012
allClassVarNames
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2013
    "return a collection of all the class variable name-strings
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2014
     this includes all superclass-class variables.
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2015
     Since Behavior has no idea of classvar-names, return an empty collection
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2016
     here. Redefined in ClassDescription."
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2017
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2018
    ^ #()
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2019
!
07c448be12b6 *** empty log message ***
claus
parents: 127
diff changeset
  2020
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2021
allInstances
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2022
    "return a collection of all my instances"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2023
362
claus
parents: 360
diff changeset
  2024
    "Read the documentation on why there seem to be no
claus
parents: 360
diff changeset
  2025
     instances of SmallInteger and UndefinedObject"
claus
parents: 360
diff changeset
  2026
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2027
    |coll|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2028
165
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
  2029
    coll := OrderedCollection new:100.
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2030
    self allInstancesDo:[:anObject |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2031
	coll add:anObject
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2032
    ].
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2033
    ^ coll 
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2034
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2035
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2036
     ScrollBar allInstances
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2037
    "
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2038
!
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2039
328
claus
parents: 325
diff changeset
  2040
allSubInstances
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2041
    "return a collection of all instances of myself and 
328
claus
parents: 325
diff changeset
  2042
     instances of all subclasses of myself."
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2043
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2044
    |coll|
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2045
165
63341654cfb8 *** empty log message ***
claus
parents: 154
diff changeset
  2046
    coll := OrderedCollection new:100.
331
claus
parents: 328
diff changeset
  2047
    self allSubInstancesDo:[:anObject |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2048
	(anObject isKindOf:self) ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2049
	    coll add:anObject
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2050
	]
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2051
    ].
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2052
    ^ coll 
25
e34a6267c79b *** empty log message ***
claus
parents: 11
diff changeset
  2053
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2054
    "
328
claus
parents: 325
diff changeset
  2055
     View allSubInstances
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2056
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2057
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2058
328
claus
parents: 325
diff changeset
  2059
allDerivedInstances
claus
parents: 325
diff changeset
  2060
    "return a collection of all instances of myself and 
claus
parents: 325
diff changeset
  2061
     instances of all subclasses of myself.
claus
parents: 325
diff changeset
  2062
     This method is going to be removed for protocol compatibility with
claus
parents: 325
diff changeset
  2063
     other STs; use allSubInstances"
claus
parents: 325
diff changeset
  2064
345
claus
parents: 343
diff changeset
  2065
    self obsoleteMethodWarning:'please use #allSubInstances'.
328
claus
parents: 325
diff changeset
  2066
    ^ self allSubInstances
claus
parents: 325
diff changeset
  2067
!
claus
parents: 325
diff changeset
  2068
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2069
hasInstances
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2070
    "return true, if there are any instances of myself"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2071
362
claus
parents: 360
diff changeset
  2072
    "Read the documentation on why there seem to be no
claus
parents: 360
diff changeset
  2073
     instances of SmallInteger and UndefinedObject"
claus
parents: 360
diff changeset
  2074
369
claus
parents: 362
diff changeset
  2075
"/    ObjectMemory allObjectsDo:[:anObject |
claus
parents: 362
diff changeset
  2076
"/        (anObject class == self) ifTrue:[
claus
parents: 362
diff changeset
  2077
"/            ^ true
claus
parents: 362
diff changeset
  2078
"/        ]
claus
parents: 362
diff changeset
  2079
"/    ].
claus
parents: 362
diff changeset
  2080
    ObjectMemory allInstancesOf:self do:[:anObject |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2081
	    ^ true
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2082
    ].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2083
    ^ false
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2084
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2085
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2086
     Object hasInstances
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2087
     SequenceableCollection hasInstances
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2088
     Float hasInstances
362
claus
parents: 360
diff changeset
  2089
     SmallInteger hasInstances
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2090
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2091
!
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2092
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2093
instanceCount
362
claus
parents: 360
diff changeset
  2094
    "return the number of instances of myself."
claus
parents: 360
diff changeset
  2095
claus
parents: 360
diff changeset
  2096
    "Read the documentation on why there seem to be no
claus
parents: 360
diff changeset
  2097
     instances of SmallInteger and UndefinedObject"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2098
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2099
    |count|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2100
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2101
    count := 0.
369
claus
parents: 362
diff changeset
  2102
"/    ObjectMemory allObjectsDo:[:anObject |
claus
parents: 362
diff changeset
  2103
"/        (anObject class == self) ifTrue:[
claus
parents: 362
diff changeset
  2104
"/            count := count + 1
claus
parents: 362
diff changeset
  2105
"/        ]
claus
parents: 362
diff changeset
  2106
"/    ].
claus
parents: 362
diff changeset
  2107
    ObjectMemory allInstancesOf:self do:[:anObject |
claus
parents: 362
diff changeset
  2108
	count := count + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2109
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2110
    ^ count
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2111
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2112
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2113
     View instanceCount
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2114
     Object instanceCount
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2115
     Float instanceCount
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2116
     SequenceableCollection instanceCount
362
claus
parents: 360
diff changeset
  2117
     SmallInteger instanceCount   .... mhmh - hear, hear
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2118
    "
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2119
!
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2120
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2121
derivedInstanceCount
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2122
    "return the number of instances of myself and of subclasses"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2123
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2124
    |count|
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2125
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2126
    count := 0.
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2127
    ObjectMemory allObjectsDo:[:anObject |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2128
	(anObject isKindOf:self) ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2129
	    count := count + 1
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2130
	]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2131
    ].
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2132
    ^ count
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2133
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2134
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2135
     View derivedInstanceCount
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2136
     SequenceableCollection derivedInstanceCount
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2137
    "
2
claus
parents: 1
diff changeset
  2138
!
claus
parents: 1
diff changeset
  2139
claus
parents: 1
diff changeset
  2140
selectorIndex:aSelector
claus
parents: 1
diff changeset
  2141
    "return the index in the arrays for given selector aSelector"
claus
parents: 1
diff changeset
  2142
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2143
    ^ selectorArray identityIndexOf:aSelector startingAt:1
2
claus
parents: 1
diff changeset
  2144
!
claus
parents: 1
diff changeset
  2145
295
14d0cf46c739 *** empty log message ***
claus
parents: 293
diff changeset
  2146
includesSelector:aSelector
14d0cf46c739 *** empty log message ***
claus
parents: 293
diff changeset
  2147
    "for ST-80 compatibility"
14d0cf46c739 *** empty log message ***
claus
parents: 293
diff changeset
  2148
14d0cf46c739 *** empty log message ***
claus
parents: 293
diff changeset
  2149
    ^ self implements:aSelector
14d0cf46c739 *** empty log message ***
claus
parents: 293
diff changeset
  2150
!
14d0cf46c739 *** empty log message ***
claus
parents: 293
diff changeset
  2151
2
claus
parents: 1
diff changeset
  2152
compiledMethodAt:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2153
    "return the method for given selector aSelector or nil.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2154
     Only methods in the receiver - not in the superclass chain are tested."
2
claus
parents: 1
diff changeset
  2155
claus
parents: 1
diff changeset
  2156
    |index|
claus
parents: 1
diff changeset
  2157
328
claus
parents: 325
diff changeset
  2158
    selectorArray isNil ifTrue:[
claus
parents: 325
diff changeset
  2159
	('oops: nil selectorArray in ' , self name) errorPrintNL.
claus
parents: 325
diff changeset
  2160
	^ nil
claus
parents: 325
diff changeset
  2161
    ].
claus
parents: 325
diff changeset
  2162
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2163
    index := selectorArray identityIndexOf:aSelector startingAt:1.
2
claus
parents: 1
diff changeset
  2164
    (index == 0) ifTrue:[^ nil].
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2165
    ^ methodArray at:index
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2166
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2167
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2168
     Object compiledMethodAt:#==
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2169
     (Object compiledMethodAt:#==) category
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2170
    "
2
claus
parents: 1
diff changeset
  2171
!
claus
parents: 1
diff changeset
  2172
claus
parents: 1
diff changeset
  2173
sourceCodeAt:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2174
    "return the methods source for given selector aSelector or nil.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2175
     Only methods in the receiver - not in the superclass chain are tested."
2
claus
parents: 1
diff changeset
  2176
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2177
    |method|
2
claus
parents: 1
diff changeset
  2178
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2179
    method := self compiledMethodAt:aSelector.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2180
    method isNil ifTrue:[^ nil].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  2181
    ^ method source
2
claus
parents: 1
diff changeset
  2182
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2183
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2184
     True sourceCodeAt:#ifTrue:
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2185
     Object sourceCodeAt:#==
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2186
     Behavior sourceCodeAt:#sourceCodeAt:
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2187
    "
2
claus
parents: 1
diff changeset
  2188
!
claus
parents: 1
diff changeset
  2189
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2190
lookupMethodFor:aSelector
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2191
    "return the method, which would be executed if aSelector was sent to
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2192
     an instance of the receiver. I.e. the selector arrays of the receiver
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2193
     and all of its superclasses are searched for aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2194
     Return the method, or nil if instances do not understand aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2195
     EXPERIMENTAL: take care of multiple superclasses."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2196
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2197
    |m cls|
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2198
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2199
    cls := self.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2200
    [cls notNil] whileTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2201
	m := cls compiledMethodAt:aSelector.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2202
	m notNil ifTrue:[^ m].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2203
	cls hasMultipleSuperclasses ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2204
	    cls superclasses do:[:aSuperClass |
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2205
		m := aSuperClass lookupMethodFor:aSelector.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2206
		m notNil ifTrue:[^ m].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2207
	    ].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2208
	    ^ nil
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2209
	] ifFalse:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2210
	    cls := cls superclass
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2211
	]
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2212
    ].
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2213
    ^ nil
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2214
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2215
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2216
cachedLookupMethodFor:aSelector
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2217
    "return the method, which would be executed if aSelector was sent to
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2218
     an instance of the receiver. I.e. the selector arrays of the receiver
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2219
     and all of its superclasses are searched for aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2220
     Return the method, or nil if instances do not understand aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2221
     This interface provides exactly the same information as #lookupMethodFor:,
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2222
     but uses the lookup-cache in the VM for faster search. 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2223
     However, keep in mind, that doing a lookup through the cache also adds new
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2224
     entries and can thus slow down the system by polluting the cache with 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2225
     irrelevant entries. (do NOT loop over all objects calling this method).
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2226
     Does NOT (currently) handle MI"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2227
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2228
%{  /* NOCONTEXT */
362
claus
parents: 360
diff changeset
  2229
    extern OBJ __lookup();
claus
parents: 360
diff changeset
  2230
claus
parents: 360
diff changeset
  2231
    RETURN ( __lookup(self, aSelector, SENDER) );
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2232
%}
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2233
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2234
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2235
     String cachedLookupMethodFor:#=
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2236
     String cachedLookupMethodFor:#asOrderedCollection
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2237
    "
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2238
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2239
2
claus
parents: 1
diff changeset
  2240
hasMethods
claus
parents: 1
diff changeset
  2241
    "return true, if there are any (local) methods in this class"
claus
parents: 1
diff changeset
  2242
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2243
    ^ (methodArray size ~~ 0)
10
claus
parents: 5
diff changeset
  2244
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2245
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2246
     True hasMethods
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2247
     True class hasMethods
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2248
    "
2
claus
parents: 1
diff changeset
  2249
!
claus
parents: 1
diff changeset
  2250
claus
parents: 1
diff changeset
  2251
implements:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2252
    "return true, if the receiver implements aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2253
     (i.e. implemented in THIS class - NOT in a superclass).
10
claus
parents: 5
diff changeset
  2254
     Dont use this method to check if someone responds to a message -
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2255
     use #canUnderstand: on the class or #respondsTo: on the instance
10
claus
parents: 5
diff changeset
  2256
     to do this."
2
claus
parents: 1
diff changeset
  2257
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2258
    ^ (selectorArray identityIndexOf:aSelector startingAt:1) ~~ 0
2
claus
parents: 1
diff changeset
  2259
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2260
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2261
     True implements:#ifTrue:
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2262
     True implements:#==
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2263
    "
2
claus
parents: 1
diff changeset
  2264
!
claus
parents: 1
diff changeset
  2265
claus
parents: 1
diff changeset
  2266
canUnderstand:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2267
    "return true, if the receiver or one of its superclasses implements aSelector.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2268
     (i.e. true if my instances understand aSelector)"
2
claus
parents: 1
diff changeset
  2269
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2270
    ^ (self lookupMethodFor:aSelector) notNil
10
claus
parents: 5
diff changeset
  2271
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2272
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2273
     True canUnderstand:#ifTrue:
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2274
     True canUnderstand:#==
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2275
     True canUnderstand:#do:
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2276
    "
2
claus
parents: 1
diff changeset
  2277
!
claus
parents: 1
diff changeset
  2278
claus
parents: 1
diff changeset
  2279
whichClassImplements:aSelector
328
claus
parents: 325
diff changeset
  2280
    "obsolete interface;
claus
parents: 325
diff changeset
  2281
     use whichClassIncludesSelector: for ST-80 compatibility."
claus
parents: 325
diff changeset
  2282
claus
parents: 325
diff changeset
  2283
    ^ self whichClassIncludesSelector:aSelector
claus
parents: 325
diff changeset
  2284
!
claus
parents: 325
diff changeset
  2285
claus
parents: 325
diff changeset
  2286
whichClassIncludesSelector:aSelector
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2287
    "return the class in the inheritance chain, which implements the method
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2288
     for aSelector; return nil if none.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2289
     EXPERIMENTAL: handle multiple superclasses"
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2290
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2291
    |cls|
2
claus
parents: 1
diff changeset
  2292
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2293
    cls := self.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2294
    [cls notNil] whileTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2295
	(cls implements:aSelector) ifTrue:[^ cls].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2296
	cls hasMultipleSuperclasses ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2297
	    cls superclasses do:[:aSuperClass |
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2298
		|implementingClass|
2
claus
parents: 1
diff changeset
  2299
328
claus
parents: 325
diff changeset
  2300
		implementingClass := aSuperClass whichClassIncludesSelector:aSelector.
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2301
		implementingClass notNil ifTrue:[^ implementingClass].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2302
	    ].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2303
	    ^ nil
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2304
	] ifFalse:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2305
	    cls := cls superclass
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2306
	]
2
claus
parents: 1
diff changeset
  2307
    ].
claus
parents: 1
diff changeset
  2308
    ^ nil
claus
parents: 1
diff changeset
  2309
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2310
    "
328
claus
parents: 325
diff changeset
  2311
     String whichClassIncludesSelector:#==
claus
parents: 325
diff changeset
  2312
     String whichClassIncludesSelector:#collect:
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2313
    "
2
claus
parents: 1
diff changeset
  2314
!
claus
parents: 1
diff changeset
  2315
claus
parents: 1
diff changeset
  2316
inheritsFrom:aClass
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2317
    "return true, if the receiver inherits methods from aClass"
2
claus
parents: 1
diff changeset
  2318
claus
parents: 1
diff changeset
  2319
    ^ self isSubclassOf:aClass
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2320
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2321
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2322
     True inheritsFrom:Object
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2323
     LinkedList inheritsFrom:Array
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2324
    "
2
claus
parents: 1
diff changeset
  2325
!
claus
parents: 1
diff changeset
  2326
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2327
selectorAtMethod:aMethod ifAbsent:failBlock
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2328
    "return the selector for given method aMethod
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2329
     or the value of failBlock, if not found."
2
claus
parents: 1
diff changeset
  2330
claus
parents: 1
diff changeset
  2331
    |index|
claus
parents: 1
diff changeset
  2332
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2333
    index := methodArray identityIndexOf:aMethod startingAt:1.
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2334
    (index == 0) ifTrue:[^ failBlock value].
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2335
    ^ selectorArray at:index
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2336
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2337
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2338
     |m|
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2339
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2340
     m := Object compiledMethodAt:#copy.
328
claus
parents: 325
diff changeset
  2341
     Object selectorAtMethod:m ifAbsent:['oops'].
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2342
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2343
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2344
     |m|
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2345
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2346
     m := Object compiledMethodAt:#copy.
328
claus
parents: 325
diff changeset
  2347
     Fraction selectorAtMethod:m ifAbsent:['oops'].
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2348
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2349
!
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2350
328
claus
parents: 325
diff changeset
  2351
selectorAtMethod:aMethod
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2352
    "Return the selector for given method aMethod."
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2353
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2354
    ^ self selectorAtMethod:aMethod ifAbsent:[nil]
328
claus
parents: 325
diff changeset
  2355
claus
parents: 325
diff changeset
  2356
    "
claus
parents: 325
diff changeset
  2357
     |m|
claus
parents: 325
diff changeset
  2358
claus
parents: 325
diff changeset
  2359
     m := Object compiledMethodAt:#copy.
claus
parents: 325
diff changeset
  2360
     Fraction selectorAtMethod:m.
claus
parents: 325
diff changeset
  2361
    "
claus
parents: 325
diff changeset
  2362
    "
claus
parents: 325
diff changeset
  2363
     |m|
claus
parents: 325
diff changeset
  2364
claus
parents: 325
diff changeset
  2365
     m := Object compiledMethodAt:#copy.
claus
parents: 325
diff changeset
  2366
     Object selectorAtMethod:m.
claus
parents: 325
diff changeset
  2367
    "
2
claus
parents: 1
diff changeset
  2368
!
claus
parents: 1
diff changeset
  2369
claus
parents: 1
diff changeset
  2370
containsMethod:aMethod
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2371
    "Return true, if the argument, aMethod is a method of myself"
2
claus
parents: 1
diff changeset
  2372
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2373
    methodArray isNil ifTrue:[^ false].  "degenerated class"
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2374
    ^ (methodArray identityIndexOf:aMethod startingAt:1) ~~ 0
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2375
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2376
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2377
!Behavior methodsFor:'private accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2378
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2379
setSuperclass:sup selectors:sels methods:m instSize:i flags:f
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2380
    "set some inst vars. 
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2381
     this method is for special uses only - there will be no recompilation
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2382
     and no change record is written here. Also, if the receiver class has 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2383
     already been in use, future operation of the system is not guaranteed to
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2384
     be correct, since no caches are flushed.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2385
     Therefore: do NOT use it; use Behavior>>superclass: (or flush the caches, at least)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2386
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2387
    SubclassInfo := nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2388
    superclass := sup.
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2389
    selectorArray := sels.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2390
    methodArray := m.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2391
    instSize := i.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2392
    flags := f
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2393
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2394
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2395
setSuperclass:aClass
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2396
    "set the superclass of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2397
     this method is for special uses only - there will be no recompilation
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2398
     and no change record written here. Also, if the receiver class has
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2399
     already been in use, future operation of the system is not guaranteed to
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2400
     be correct, since no caches are flushed.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2401
     Therefore: do NOT use it; use Behavior>>superclass: (or flush the caches, at least)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2402
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2403
    SubclassInfo := nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2404
    superclass := aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2405
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2406
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2407
setOtherSuperclasses:anArrayOfClasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2408
    "EXPERIMENTAL: set the other superclasses of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2409
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2410
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2411
     Do NOT use it."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2412
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2413
    SubclassInfo := nil.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2414
    otherSuperclasses := anArrayOfClasses
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2415
!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2416
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2417
instSize:aNumber
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2418
    "set the instance size.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2419
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2420
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2421
     Do NOT use it."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2422
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2423
    instSize := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2424
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2425
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2426
flags:aNumber
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2427
    "set the flags.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2428
     this method is for special uses only - there will be no recompilation
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2429
     and no change record written here; 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2430
     Do NOT use it."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2431
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2432
    flags := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2433
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2434
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2435
setSelectors:sels methods:m
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2436
    "set some inst vars. 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2437
     this method is for special uses only - there will be no recompilation
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2438
     and no change record written here; 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2439
     Do NOT use it."
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2440
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2441
    selectorArray := sels.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2442
    methodArray := m.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2443
!
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2444
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2445
setSelectorArray:anArray
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2446
    "set the selector array of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2447
     this method is for special uses only - there will be no recompilation
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2448
     and no change record written here.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2449
     NOT for general use."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2450
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2451
    selectorArray := anArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2452
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2453
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2454
setMethodArray:anArray
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2455
    "set the method array of the receiver.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2456
     this method is for special uses only - there will be no recompilation
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2457
     and no change record written here.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2458
     NOT for general use."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2459
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2460
    methodArray := anArray
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2461
!
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2462
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2463
setMethodDictionary:aDictionary
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2464
    "set the receivers method dictionary. 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2465
     Since no dictionary is actually used, decompose into selector- and
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2466
     method arrays and set those. For ST-80 compatibility.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2467
     NOT for general use."
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2468
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2469
    |n newSelectorArray newMethodArray idx|
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2470
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2471
    n := aDictionary size.
359
claus
parents: 357
diff changeset
  2472
    newSelectorArray := Array basicNew:n.
claus
parents: 357
diff changeset
  2473
    newMethodArray := Array basicNew:n.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2474
    idx := 1.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2475
    aDictionary keysAndValuesDo:[:sel :method |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2476
	newSelectorArray at:idx put:sel.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2477
	newMethodArray at:idx put:method.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2478
	idx := idx + 1
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2479
    ].
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2480
    selectorArray := newSelectorArray.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2481
    methodArray := newMethodArray
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2482
!
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2483
249
claus
parents: 216
diff changeset
  2484
primAddSelector:newSelector withMethod:newMethod
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2485
    "add the method given by 2nd argument under the selector given by
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2486
     the 1st argument to the methodDictionary. 
249
claus
parents: 216
diff changeset
  2487
     Does NOT flush any caches, does NOT write a change record.
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2488
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2489
     Do not use this in normal situations, strange behavior will be
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2490
     the consequence.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2491
     I.e. executing obsolete methods, since the old method will still 
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2492
     be executed out of the caches."
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2493
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2494
    |index oldSelectorArray oldMethodArray newSelectorArray newMethodArray|
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2495
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2496
    (newSelector isMemberOf:Symbol) ifFalse:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2497
	self error:'invalid selector'. 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2498
	^ false
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2499
    ].
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2500
    newMethod isNil ifTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2501
	self error:'invalid method'. 
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2502
	^ false
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2503
    ].
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2504
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2505
    index := selectorArray identityIndexOf:newSelector startingAt:1.
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2506
    (index == 0) ifTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2507
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2508
	 a new selector
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2509
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2510
	newSelectorArray := selectorArray copyWith:newSelector.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2511
	newMethodArray := methodArray copyWith:newMethod.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2512
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2513
	 keep a reference so they wont go away ...
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2514
	 mhmh: this is no longer needed - try without
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2515
	"
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2516
	oldSelectorArray := selectorArray.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2517
	oldMethodArray := methodArray.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2518
	selectorArray := newSelectorArray.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2519
	methodArray := newMethodArray
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2520
    ] ifFalse:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2521
	methodArray at:index put:newMethod
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2522
    ].
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2523
    ^ true
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2524
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2525
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2526
!Behavior methodsFor:'compiler interface'!
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2527
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2528
compiler
249
claus
parents: 216
diff changeset
  2529
    "return the compiler to use for this class.
345
claus
parents: 343
diff changeset
  2530
     OBSOLETE: This is the old ST/X interface, kept for migration. 
claus
parents: 343
diff changeset
  2531
	       Dont use it - it will vanish."
249
claus
parents: 216
diff changeset
  2532
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2533
    ^ self compilerClass
249
claus
parents: 216
diff changeset
  2534
!
claus
parents: 216
diff changeset
  2535
claus
parents: 216
diff changeset
  2536
compilerClass
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2537
    "return the compiler to use for this class - 
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2538
     this can be redefined in special classes, to get classes with
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2539
     Lisp, Prolog, ASN1, Basic :-) or whatever syntax."
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2540
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2541
    ^ Compiler
345
claus
parents: 343
diff changeset
  2542
!
claus
parents: 343
diff changeset
  2543
claus
parents: 343
diff changeset
  2544
evaluatorClass
claus
parents: 343
diff changeset
  2545
    "return the compiler to use for expression evaluation for this class - 
claus
parents: 343
diff changeset
  2546
     this can be redefined in special classes, to get classes with
claus
parents: 343
diff changeset
  2547
     Lisp, Prolog, ASN1, Basic :-) or whatever syntax."
claus
parents: 343
diff changeset
  2548
claus
parents: 343
diff changeset
  2549
    ^ Compiler
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2550
! !
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2551
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  2552
!Behavior methodsFor:'enumerating'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2553
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2554
allInstancesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2555
    "evaluate aBlock for all of my instances"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2556
369
claus
parents: 362
diff changeset
  2557
"/    ObjectMemory allObjectsDo:[:anObject |
claus
parents: 362
diff changeset
  2558
"/        (anObject class == self) ifTrue:[
claus
parents: 362
diff changeset
  2559
"/            aBlock value:anObject
claus
parents: 362
diff changeset
  2560
"/        ]
claus
parents: 362
diff changeset
  2561
"/    ]
claus
parents: 362
diff changeset
  2562
claus
parents: 362
diff changeset
  2563
    ObjectMemory allInstancesOf:self do:[:anObject |
claus
parents: 362
diff changeset
  2564
	aBlock value:anObject
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2565
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2566
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2567
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2568
     StandardSystemView allInstancesDo:[:v | Transcript showCr:(v name)]
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2569
    "
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2570
!
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2571
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2572
allDerivedInstancesDo:aBlock
328
claus
parents: 325
diff changeset
  2573
    "evaluate aBlock for all of my instances and all instances of subclasses.
claus
parents: 325
diff changeset
  2574
     This method is going to be removed for protocol compatibility with
claus
parents: 325
diff changeset
  2575
     other STs; use allSubInstancesDo:"
claus
parents: 325
diff changeset
  2576
345
claus
parents: 343
diff changeset
  2577
    self obsoleteMethodWarning:'please use #allSubInstancesDo:'.
328
claus
parents: 325
diff changeset
  2578
    self allSubInstancesDo:aBlock
claus
parents: 325
diff changeset
  2579
claus
parents: 325
diff changeset
  2580
    "
claus
parents: 325
diff changeset
  2581
     StandardSystemView allDerivedInstancesDo:[:v | Transcript showCr:(v name)]
claus
parents: 325
diff changeset
  2582
    "
claus
parents: 325
diff changeset
  2583
!
claus
parents: 325
diff changeset
  2584
claus
parents: 325
diff changeset
  2585
allSubInstancesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2586
    "evaluate aBlock for all of my instances and all instances of subclasses"
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2587
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2588
    ObjectMemory allObjectsDo:[:anObject |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2589
	(anObject isKindOf:self) ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2590
	    aBlock value:anObject
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2591
	]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2592
    ]
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2593
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2594
    "
328
claus
parents: 325
diff changeset
  2595
     StandardSystemView allSubInstancesDo:[:v | Transcript showCr:(v name)]
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2596
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2597
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2598
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2599
subclassesDo:aBlock
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2600
    "evaluate the argument, aBlock for all immediate subclasses.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2601
     This will only enumerate globally known classes - for anonymous
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2602
     behaviors, you have to walk over all instances of Behavior."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2603
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2604
    |coll|
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2605
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2606
    SubclassInfo isNil ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2607
	Behavior subclassInfo
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2608
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2609
    SubclassInfo notNil ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2610
	coll := SubclassInfo at:self ifAbsent:nil.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2611
	coll notNil ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2612
	    coll do:aBlock.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2613
	].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2614
	^ self
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2615
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2616
2
claus
parents: 1
diff changeset
  2617
    Smalltalk allBehaviorsDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2618
	(aClass superclass == self) ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2619
	    aBlock value:aClass
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2620
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2621
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2622
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2623
    "
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2624
     Collection subclassesDo:[:c | Transcript showCr:(c name)]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2625
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2626
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2627
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2628
allSubclassesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2629
    "evaluate aBlock for all of my subclasses.
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2630
     There is no specific order, in which the entries are enumerated.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2631
     This will only enumerate globally known classes - for anonymous
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2632
     behaviors, you have to walk over all instances of Behavior."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2633
2
claus
parents: 1
diff changeset
  2634
    Smalltalk allBehaviorsDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2635
	(aClass isSubclassOf:self) ifTrue:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2636
	    aBlock value:aClass
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2637
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2638
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2639
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2640
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2641
     Collection allSubclassesDo:[:c | Transcript showCr:(c name)]
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2642
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2643
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2644
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2645
allSubclassesInOrderDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2646
    "evaluate aBlock for all of my subclasses.
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2647
     Higher level subclasses will be enumerated before the deeper ones,
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2648
     so the order in which aBlock gets called is ok to fileOut classes in
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2649
     correct order for later fileIn.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2650
     This will only enumerate globally known classes - for anonymous
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2651
     behaviors, you have to walk over all instances of Behavior"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2652
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2653
    self subclassesDo:[:aClass |
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2654
	aBlock value:aClass.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2655
	aClass allSubclassesInOrderDo:aBlock
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2656
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2657
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2658
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2659
     Collection allSubclassesInOrderDo:[:c | Transcript showCr:(c name)]
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2660
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2661
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2662
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2663
allSuperclassesDo:aBlock
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2664
    "evaluate aBlock for all of my superclasses"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2665
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2666
    |theClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2667
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2668
    theClass := superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2669
    [theClass notNil] whileTrue:[
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2670
	aBlock value:theClass.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2671
	theClass := theClass superclass
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2672
    ]
45
0c270a39d4a2 *** empty log message ***
claus
parents: 43
diff changeset
  2673
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2674
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2675
     String allSuperclassesDo:[:c | Transcript showCr:(c name)]
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2676
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2677
! !
2
claus
parents: 1
diff changeset
  2678
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2679
!Behavior methodsFor:'binary storage'!
2
claus
parents: 1
diff changeset
  2680
343
claus
parents: 340
diff changeset
  2681
storeBinaryDefinitionOn: stream manager: manager
claus
parents: 340
diff changeset
  2682
    "binary store of a classes definition.
claus
parents: 340
diff changeset
  2683
     Classes will store the name only and restore by looking for
claus
parents: 340
diff changeset
  2684
     that name in the Smalltalk dictionary."
claus
parents: 340
diff changeset
  2685
claus
parents: 340
diff changeset
  2686
    | myName |
claus
parents: 340
diff changeset
  2687
claus
parents: 340
diff changeset
  2688
    myName := self name.
claus
parents: 340
diff changeset
  2689
    stream nextNumber:4 put:self signature.
claus
parents: 340
diff changeset
  2690
    stream nextNumber:2 put:0.
claus
parents: 340
diff changeset
  2691
    stream nextNumber:2 put:myName size.
claus
parents: 340
diff changeset
  2692
    myName do:[:c| 
claus
parents: 340
diff changeset
  2693
	stream nextPut:c asciiValue
claus
parents: 340
diff changeset
  2694
    ]
claus
parents: 340
diff changeset
  2695
claus
parents: 340
diff changeset
  2696
    "
claus
parents: 340
diff changeset
  2697
     |s|
claus
parents: 340
diff changeset
  2698
     s := WriteStream on:ByteArray new.
claus
parents: 340
diff changeset
  2699
     #(1 2 3 4) storeBinaryOn:s.
claus
parents: 340
diff changeset
  2700
     Object readBinaryFrom:(ReadStream on:s contents)  
claus
parents: 340
diff changeset
  2701
claus
parents: 340
diff changeset
  2702
     |s|
claus
parents: 340
diff changeset
  2703
     s := WriteStream on:ByteArray new.
claus
parents: 340
diff changeset
  2704
     Rectangle storeBinaryOn:s.
claus
parents: 340
diff changeset
  2705
     Object readBinaryFrom:(ReadStream on:s contents)  
claus
parents: 340
diff changeset
  2706
    "
claus
parents: 340
diff changeset
  2707
!
claus
parents: 340
diff changeset
  2708
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2709
readBinaryFrom:aStream
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2710
    "read an objects binary representation from the argument,
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2711
     aStream and return it. 
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2712
     The read object must be a kind of myself, otherwise an error is raised. 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2713
     To get any object, use 'Object readBinaryFrom:...',
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2714
     To get any number, use 'Number readBinaryFrom:...' and so on.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2715
     This is the reverse operation to 'storeBinaryOn:'. "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2716
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2717
    ^ self readBinaryFrom:aStream onError:[self error:('expected ' , self name)]
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2718
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2719
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2720
     |s|
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2721
     s := WriteStream on:(ByteArray new).
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2722
     #(1 2 3 4) storeBinaryOn:s.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2723
     Object readBinaryFrom:(ReadStream on:s contents)  
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2724
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2725
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2726
     |s|
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2727
     s := 'testFile' asFilename writeStream binary.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2728
     #(1 2 3 4) storeBinaryOn:s.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2729
     'hello world' storeBinaryOn:s.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2730
     s close.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2731
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2732
     s := 'testFile' asFilename readStream binary.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2733
     Transcript showCr:(Object readBinaryFrom:s).
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2734
     Transcript showCr:(Object readBinaryFrom:s).
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2735
     s close.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2736
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2737
!
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2738
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2739
readBinaryFrom:aStream onError:exceptionBlock
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2740
    "read an objects binary representation from the argument,
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2741
     aStream and return it. 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2742
     The read object must be a kind of myself, otherwise the value of
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2743
     the exceptionBlock is returned.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2744
     To get any object, use 'Object readBinaryFrom:...',
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2745
     To get any number, use 'Number readBinaryFrom:...' and so on.
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2746
     This is the reverse operation to 'storeBinaryOn:'. "
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2747
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2748
    |newObject|
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2749
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2750
    newObject := (BinaryInputManager new:1024) readFrom:aStream.
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2751
    (newObject isKindOf:self) ifFalse:[^ exceptionBlock value].
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2752
    ^ newObject
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2753
91
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2754
    "
b3971c7dc731 *** empty log message ***
claus
parents: 88
diff changeset
  2755
     |s|
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2756
     s := WriteStream on:(ByteArray new).
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2757
     #(1 2 3 4) storeBinaryOn:s.
198
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2758
     Object readBinaryFrom:(ReadStream on:s contents) onError:['oops'] 
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2759
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2760
    "
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2761
     |s|
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2762
     s := WriteStream on:(ByteArray new).
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2763
     #[1 2 3 4] storeBinaryOn:s.
d0d0e3910c98 added readFrom:onError: / binaryReadFrom:onError:
claus
parents: 165
diff changeset
  2764
     Array readBinaryFrom:(ReadStream on:s contents)  onError:['oops']  
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2765
    "
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2766
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  2767
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2768
binaryDefinitionFrom:stream manager:manager
343
claus
parents: 340
diff changeset
  2769
    "sent during a binary read by the input manager.
claus
parents: 340
diff changeset
  2770
     Read the definition on an empty instance (of my class) from stream.
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2771
     All pointer instances are left nil, while all bits are read in here.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2772
     return the new object."
2
claus
parents: 1
diff changeset
  2773
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2774
    |obj t
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2775
     basicSize "{ Class: SmallInteger }" |
2
claus
parents: 1
diff changeset
  2776
claus
parents: 1
diff changeset
  2777
    self isPointers ifTrue: [
343
claus
parents: 340
diff changeset
  2778
	"/
claus
parents: 340
diff changeset
  2779
	"/ inst size not needed - if you uncomment the line below,
claus
parents: 340
diff changeset
  2780
	"/ also uncomment the corresponding line in
claus
parents: 340
diff changeset
  2781
	"/ Object>>storeBinaryDefinitionOn:manager:
claus
parents: 340
diff changeset
  2782
	"/
claus
parents: 340
diff changeset
  2783
	"/ stream next. "skip instSize"
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2784
	self isVariable ifTrue: [
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2785
	    ^ self basicNew:(stream nextNumber:3)
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2786
	].
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2787
	^ self basicNew
2
claus
parents: 1
diff changeset
  2788
    ].
claus
parents: 1
diff changeset
  2789
343
claus
parents: 340
diff changeset
  2790
    "
claus
parents: 340
diff changeset
  2791
     an object with bit-valued instance variables.
claus
parents: 340
diff changeset
  2792
     These are read here.
claus
parents: 340
diff changeset
  2793
    "
43
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2794
    basicSize := stream nextNumber:4.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2795
    obj := self basicNew:basicSize.
00ca34676cbf *** empty log message ***
claus
parents: 25
diff changeset
  2796
2
claus
parents: 1
diff changeset
  2797
    self isBytes ifTrue: [
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2798
	stream nextBytes:basicSize into:obj
2
claus
parents: 1
diff changeset
  2799
    ] ifFalse: [
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2800
	self isWords ifTrue: [
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2801
	    1 to:basicSize do:[:i |
213
3b56a17534fd *** empty log message ***
claus
parents: 198
diff changeset
  2802
		obj basicAt:i put:(stream nextNumber:2)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2803
	    ]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2804
	] ifFalse:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2805
	    self isLongs ifTrue: [
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2806
		1 to:basicSize do:[:i |
213
3b56a17534fd *** empty log message ***
claus
parents: 198
diff changeset
  2807
		    obj basicAt:i put:(stream nextNumber:4)
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2808
		]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2809
	    ] ifFalse:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2810
		self isFloats ifTrue: [
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2811
		    "could do it in one big read on machines which use IEEE floats ..."
343
claus
parents: 340
diff changeset
  2812
		    t := Float basicNew.
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2813
		    1 to:basicSize do:[:i |
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2814
			Float readBinaryIEEESingleFrom:stream into:t.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2815
			obj basicAt:i put: t
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2816
		    ]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2817
		] ifFalse:[
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2818
		    self isDoubles ifTrue: [
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2819
			"could do it in one big read on machines which use IEEE doubles ..."
343
claus
parents: 340
diff changeset
  2820
			t := Float basicNew.
154
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2821
			1 to:basicSize do:[:i |
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2822
			    Float readBinaryIEEEDoubleFrom:stream into:t.
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2823
			    obj basicAt:i put: t
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2824
			]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2825
		    ]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2826
		]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2827
	    ]
d4236ec280a6 *** empty log message ***
claus
parents: 151
diff changeset
  2828
	]
2
claus
parents: 1
diff changeset
  2829
    ].
claus
parents: 1
diff changeset
  2830
    ^obj
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2831
!
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2832
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2833
canCloneFrom:anObject 
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2834
    "return true, if this class can clone an obsolete object as retrieved
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2835
     by a binary load. Subclasses which do not want to have obsolete objects
343
claus
parents: 340
diff changeset
  2836
     be converted, should redefine this method to return false.
claus
parents: 340
diff changeset
  2837
     (However, conversion is never done silently in a binary load; you
claus
parents: 340
diff changeset
  2838
      have to have a handler for the binaryload errors and for the conversion
claus
parents: 340
diff changeset
  2839
      request signal.)"
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2840
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2841
    ^ true
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2842
!
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2843
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2844
cloneFrom:aPrototype
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2845
    "return an instance of myself with variables initialized from
343
claus
parents: 340
diff changeset
  2846
     a prototype. This is used when instances of obsolete classes are
claus
parents: 340
diff changeset
  2847
     binary loaded and a conversion is done on the obsolete object. 
claus
parents: 340
diff changeset
  2848
     UserClasses may redefine this for better conversions."
308
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2849
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2850
    |newInst indexed myInfo otherInfo varIndexAssoc|
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2851
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2852
    indexed := false.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2853
    aPrototype class isVariable ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2854
	self isVariable ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2855
	    indexed := true.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2856
	].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2857
	"otherwise, these are lost ..."
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2858
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2859
    indexed ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2860
	newInst := self basicNew:aPrototype basicSize
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2861
    ] ifFalse:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2862
	newInst := self basicNew
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2863
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2864
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2865
    myInfo := self instanceVariableOffsets.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2866
    otherInfo := aPrototype class instanceVariableOffsets.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2867
    myInfo keysAndValuesDo:[:name :index |
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2868
	varIndexAssoc := otherInfo at:name ifAbsent:[].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2869
	varIndexAssoc notNil ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2870
	    newInst instVarAt:index put:(aPrototype instVarAt:(varIndexAssoc value))
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2871
	]
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2872
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2873
    indexed ifTrue:[
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2874
	1 to:aPrototype basicSize do:[:index |
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2875
	    newInst basicAt:index put:(aPrototype basicAt:index)
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2876
	].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2877
    ].
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2878
    ^ newInst
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2879
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2880
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2881
     Class updateChanges:false.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2882
     Point subclass:#Point3D
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2883
	   instanceVariableNames:'z'
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2884
	   classVariableNames:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2885
	   poolDictionaries:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2886
	   category:'testing'.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2887
     (Point3D cloneFrom:1@2) inspect.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2888
     Class updateChanges:true.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2889
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2890
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2891
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2892
     Class updateChanges:false.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2893
     Point variableSubclass:#Point3D
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2894
	   instanceVariableNames:'z'
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2895
	   classVariableNames:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2896
	   poolDictionaries:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2897
	   category:'testing'.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2898
     (Point3D cloneFrom:#(1 2 3)) inspect.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2899
     Class updateChanges:true.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2900
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2901
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2902
    "
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2903
     |someObject|
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2904
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2905
     Class updateChanges:false.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2906
     Object subclass:#TestClass1 
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2907
	   instanceVariableNames:'foo bar'
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2908
	   classVariableNames:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2909
	   poolDictionaries:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2910
	   category:'testing'.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2911
     someObject := TestClass1 new.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2912
     someObject instVarAt:1 put:'foo'; instVarAt:2 put:'bar'.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2913
     Object subclass:#TestClass2 
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2914
	   instanceVariableNames:'bar foo'
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2915
	   classVariableNames:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2916
	   poolDictionaries:''
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2917
	   category:'testing'.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2918
     (TestClass2 cloneFrom:someObject) inspect.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2919
     Class updateChanges:true.
f04744ef7b5d *** empty log message ***
claus
parents: 295
diff changeset
  2920
    "
2
claus
parents: 1
diff changeset
  2921
! !