VMBehavior.st
author Claus Gittinger <cg@exept.de>
Sat, 09 Dec 1995 22:34:58 +0100
changeset 726 997e30ef8423
parent 530 07d0bce293c9
child 816 a09ed813648b
permissions -rw-r--r--
careful with empty revision strings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
357
claus
parents:
diff changeset
     1
"
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1995 by Claus Gittinger
claus
parents:
diff changeset
     3
	      All Rights Reserved
claus
parents:
diff changeset
     4
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
claus
parents:
diff changeset
    10
 hereby transferred.
claus
parents:
diff changeset
    11
"
claus
parents:
diff changeset
    12
claus
parents:
diff changeset
    13
Object subclass:#VMBehavior
claus
parents:
diff changeset
    14
       instanceVariableNames:'superclass flags selectorArray methodArray'
claus
parents:
diff changeset
    15
       classVariableNames:''
claus
parents:
diff changeset
    16
       poolDictionaries:''
claus
parents:
diff changeset
    17
       category:'Kernel-Classes'
claus
parents:
diff changeset
    18
!
claus
parents:
diff changeset
    19
claus
parents:
diff changeset
    20
!VMBehavior class methodsFor:'documentation'!
claus
parents:
diff changeset
    21
claus
parents:
diff changeset
    22
copyright
claus
parents:
diff changeset
    23
"
claus
parents:
diff changeset
    24
 COPYRIGHT (c) 1995 by Claus Gittinger
claus
parents:
diff changeset
    25
	      All Rights Reserved
claus
parents:
diff changeset
    26
claus
parents:
diff changeset
    27
 This software is furnished under a license and may be used
claus
parents:
diff changeset
    28
 only in accordance with the terms of that license and with the
claus
parents:
diff changeset
    29
 inclusion of the above copyright notice.   This software may not
claus
parents:
diff changeset
    30
 be provided or otherwise made available to, or used by, any
claus
parents:
diff changeset
    31
 other person.  No title to or ownership of the software is
claus
parents:
diff changeset
    32
 hereby transferred.
claus
parents:
diff changeset
    33
"
claus
parents:
diff changeset
    34
!
claus
parents:
diff changeset
    35
claus
parents:
diff changeset
    36
version
530
07d0bce293c9 uff - version methods changed to return stings
Claus Gittinger <cg@exept.de>
parents: 384
diff changeset
    37
    ^ '$Header: /cvs/stx/stx/libbasic/Attic/VMBehavior.st,v 1.5 1995-11-11 15:28:33 cg Exp $'
357
claus
parents:
diff changeset
    38
!
claus
parents:
diff changeset
    39
claus
parents:
diff changeset
    40
documentation
claus
parents:
diff changeset
    41
"
claus
parents:
diff changeset
    42
    This class describes what the VM considers to be a classLike object.
claus
parents:
diff changeset
    43
    Every class in the system inherits from VMBehavior (via Behavior, Class, ClassDescription).
claus
parents:
diff changeset
    44
claus
parents:
diff changeset
    45
    In contrast to Behavior (which describes smalltalk behavior), the things defined
claus
parents:
diff changeset
    46
    here are valid for all objects for which the VM can do a method lookup.
claus
parents:
diff changeset
    47
    In theory, you can create totally different object systems on top of VMBehavior.
claus
parents:
diff changeset
    48
    This class is purely abstract - therefore, no smalltalk behavior is defined here.
claus
parents:
diff changeset
    49
claus
parents:
diff changeset
    50
    This is certainly not for normal applications.
claus
parents:
diff changeset
    51
claus
parents:
diff changeset
    52
    Instance variables:
claus
parents:
diff changeset
    53
claus
parents:
diff changeset
    54
	superclass        <Class>           where lookup continues when a selector is not
claus
parents:
diff changeset
    55
					    found in the selector array
claus
parents:
diff changeset
    56
					    (i.e. the superclass in Smalltalk terms)
claus
parents:
diff changeset
    57
claus
parents:
diff changeset
    58
	selectorArray     <Array of Symbol> the selectors for which inst-methods are defined here
claus
parents:
diff changeset
    59
claus
parents:
diff changeset
    60
	methodArray       <Array of Method> the inst-methods corresponding to the selectors
claus
parents:
diff changeset
    61
claus
parents:
diff changeset
    62
	flags             <SmallInteger>    special flag bits coded in a number
claus
parents:
diff changeset
    63
					    not for application use
claus
parents:
diff changeset
    64
claus
parents:
diff changeset
    65
    flag bits (see stc.h):
claus
parents:
diff changeset
    66
claus
parents:
diff changeset
    67
    NOTICE: layout known by compiler and runtime system; be careful when changing
claus
parents:
diff changeset
    68
"
claus
parents:
diff changeset
    69
! !
claus
parents:
diff changeset
    70
claus
parents:
diff changeset
    71
!VMBehavior class methodsFor:'queries'!
claus
parents:
diff changeset
    72
claus
parents:
diff changeset
    73
isBuiltInClass
claus
parents:
diff changeset
    74
    "this class is known by the run-time-system"
claus
parents:
diff changeset
    75
claus
parents:
diff changeset
    76
    ^ true
claus
parents:
diff changeset
    77
! !
claus
parents:
diff changeset
    78
claus
parents:
diff changeset
    79
!VMBehavior class methodsFor:'initialization'!
claus
parents:
diff changeset
    80
claus
parents:
diff changeset
    81
initialize
claus
parents:
diff changeset
    82
    self == VMBehavior ifTrue:[
claus
parents:
diff changeset
    83
	self flags:(VMBehavior class flagBehavior).
claus
parents:
diff changeset
    84
    ]
claus
parents:
diff changeset
    85
! !
claus
parents:
diff changeset
    86
claus
parents:
diff changeset
    87
!VMBehavior class methodsFor:'private'!
claus
parents:
diff changeset
    88
claus
parents:
diff changeset
    89
basicNew
claus
parents:
diff changeset
    90
    "I dont know how to do this ..."
claus
parents:
diff changeset
    91
claus
parents:
diff changeset
    92
    ^ self subclassResponsibility
claus
parents:
diff changeset
    93
!
claus
parents:
diff changeset
    94
claus
parents:
diff changeset
    95
basicNew:size
claus
parents:
diff changeset
    96
    "I dont know how to do this ..."
claus
parents:
diff changeset
    97
claus
parents:
diff changeset
    98
    ^ self subclassResponsibility
claus
parents:
diff changeset
    99
!
claus
parents:
diff changeset
   100
claus
parents:
diff changeset
   101
new
claus
parents:
diff changeset
   102
    "I dont know how to do this ..."
claus
parents:
diff changeset
   103
claus
parents:
diff changeset
   104
    ^ self subclassResponsibility
claus
parents:
diff changeset
   105
!
claus
parents:
diff changeset
   106
claus
parents:
diff changeset
   107
new:size
claus
parents:
diff changeset
   108
    "I dont know how to do this ..."
claus
parents:
diff changeset
   109
claus
parents:
diff changeset
   110
    ^ self subclassResponsibility
claus
parents:
diff changeset
   111
! !
claus
parents:
diff changeset
   112
claus
parents:
diff changeset
   113
!VMBehavior class methodsFor:'flag bit constants'!
claus
parents:
diff changeset
   114
claus
parents:
diff changeset
   115
flagNotIndexed
claus
parents:
diff changeset
   116
    "return the flag code for non-indexed instances.
claus
parents:
diff changeset
   117
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   118
     it with flagNotIndexed."
claus
parents:
diff changeset
   119
claus
parents:
diff changeset
   120
    ^ 0
claus
parents:
diff changeset
   121
! 
claus
parents:
diff changeset
   122
claus
parents:
diff changeset
   123
flagBytes
claus
parents:
diff changeset
   124
    "return the flag code for byte-valued indexed instances.
claus
parents:
diff changeset
   125
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   126
     it with flagBytes."
claus
parents:
diff changeset
   127
claus
parents:
diff changeset
   128
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   129
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   130
claus
parents:
diff changeset
   131
    RETURN ( _MKSMALLINT(BYTEARRAY) );
claus
parents:
diff changeset
   132
%}
claus
parents:
diff changeset
   133
    "
claus
parents:
diff changeset
   134
     Behavior flagBytes    
claus
parents:
diff changeset
   135
    "
claus
parents:
diff changeset
   136
! 
claus
parents:
diff changeset
   137
claus
parents:
diff changeset
   138
flagWords
claus
parents:
diff changeset
   139
    "return the flag code for word-valued indexed instances (i.e. 2-byte).
claus
parents:
diff changeset
   140
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   141
     it with flagWords."
claus
parents:
diff changeset
   142
claus
parents:
diff changeset
   143
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   144
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   145
claus
parents:
diff changeset
   146
    RETURN ( _MKSMALLINT(WORDARRAY) );
claus
parents:
diff changeset
   147
%}
claus
parents:
diff changeset
   148
    "
claus
parents:
diff changeset
   149
     Behavior flagWords    
claus
parents:
diff changeset
   150
    "
claus
parents:
diff changeset
   151
! 
claus
parents:
diff changeset
   152
claus
parents:
diff changeset
   153
flagLongs
claus
parents:
diff changeset
   154
    "return the flag code for long-valued indexed instances (i.e. 4-byte).
claus
parents:
diff changeset
   155
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   156
     it with flagLongs."
claus
parents:
diff changeset
   157
claus
parents:
diff changeset
   158
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   159
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   160
claus
parents:
diff changeset
   161
    RETURN ( _MKSMALLINT(LONGARRAY) );
claus
parents:
diff changeset
   162
%}
claus
parents:
diff changeset
   163
    "
claus
parents:
diff changeset
   164
     Behavior flagLongs    
claus
parents:
diff changeset
   165
    "
claus
parents:
diff changeset
   166
! 
claus
parents:
diff changeset
   167
claus
parents:
diff changeset
   168
flagFloats
claus
parents:
diff changeset
   169
    "return the flag code for float-valued indexed instances (i.e. 4-byte reals).
claus
parents:
diff changeset
   170
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   171
     it with flagFloats."
claus
parents:
diff changeset
   172
claus
parents:
diff changeset
   173
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   174
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   175
claus
parents:
diff changeset
   176
    RETURN ( _MKSMALLINT(FLOATARRAY) );
claus
parents:
diff changeset
   177
%}
claus
parents:
diff changeset
   178
    "
claus
parents:
diff changeset
   179
     Behavior flagFloats    
claus
parents:
diff changeset
   180
    "
claus
parents:
diff changeset
   181
! 
claus
parents:
diff changeset
   182
claus
parents:
diff changeset
   183
flagDoubles
claus
parents:
diff changeset
   184
    "return the flag code for double-valued indexed instances (i.e. 8-byte reals).
claus
parents:
diff changeset
   185
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   186
     it with flagDoubles."
claus
parents:
diff changeset
   187
claus
parents:
diff changeset
   188
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   189
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   190
claus
parents:
diff changeset
   191
    RETURN ( _MKSMALLINT(DOUBLEARRAY) );
claus
parents:
diff changeset
   192
%}
claus
parents:
diff changeset
   193
    "
claus
parents:
diff changeset
   194
     Behavior flagDoubles    
claus
parents:
diff changeset
   195
    "
claus
parents:
diff changeset
   196
! 
claus
parents:
diff changeset
   197
claus
parents:
diff changeset
   198
flagPointers
claus
parents:
diff changeset
   199
    "return the flag code for pointer indexed instances (i.e. Array of object).
claus
parents:
diff changeset
   200
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   201
     it with flagPointers."
claus
parents:
diff changeset
   202
claus
parents:
diff changeset
   203
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   204
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   205
claus
parents:
diff changeset
   206
    RETURN ( _MKSMALLINT(POINTERARRAY) );
claus
parents:
diff changeset
   207
%}
claus
parents:
diff changeset
   208
    "
claus
parents:
diff changeset
   209
     Behavior flagPointers    
claus
parents:
diff changeset
   210
    "
claus
parents:
diff changeset
   211
! 
claus
parents:
diff changeset
   212
claus
parents:
diff changeset
   213
flagWeakPointers
claus
parents:
diff changeset
   214
    "return the flag code for weak pointer indexed instances (i.e. WeakArray).
claus
parents:
diff changeset
   215
     You have to mask the flag value with indexMask when comparing
claus
parents:
diff changeset
   216
     it with flagWeakPointers."
claus
parents:
diff changeset
   217
claus
parents:
diff changeset
   218
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   219
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   220
claus
parents:
diff changeset
   221
    RETURN ( _MKSMALLINT(WKPOINTERARRAY) );
claus
parents:
diff changeset
   222
%}
claus
parents:
diff changeset
   223
! 
claus
parents:
diff changeset
   224
claus
parents:
diff changeset
   225
maskIndexType
claus
parents:
diff changeset
   226
    "return a mask to extract all index-type bits"
claus
parents:
diff changeset
   227
claus
parents:
diff changeset
   228
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   229
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   230
claus
parents:
diff changeset
   231
    RETURN ( _MKSMALLINT(ARRAYMASK) );
claus
parents:
diff changeset
   232
%}
claus
parents:
diff changeset
   233
! 
claus
parents:
diff changeset
   234
claus
parents:
diff changeset
   235
flagBehavior
claus
parents:
diff changeset
   236
    "return the flag code which marks Behavior-like instances.
claus
parents:
diff changeset
   237
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   238
     checking for behaviors."
claus
parents:
diff changeset
   239
claus
parents:
diff changeset
   240
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   241
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   242
claus
parents:
diff changeset
   243
    RETURN ( _MKSMALLINT(BEHAVIOR_INSTS) );
claus
parents:
diff changeset
   244
%}
claus
parents:
diff changeset
   245
claus
parents:
diff changeset
   246
    "consistency check:
claus
parents:
diff changeset
   247
     all class-entries must be behaviors;
claus
parents:
diff changeset
   248
     all behaviors must be flagged so (in its class's flags)
claus
parents:
diff changeset
   249
     (otherwise, VM will bark)
claus
parents:
diff changeset
   250
     all non-behaviors may not be flagged
claus
parents:
diff changeset
   251
claus
parents:
diff changeset
   252
     |bit|
claus
parents:
diff changeset
   253
     bit := Class flagBehavior.
claus
parents:
diff changeset
   254
claus
parents:
diff changeset
   255
     ObjectMemory allObjectsDo:[:o|
claus
parents:
diff changeset
   256
       o isBehavior ifTrue:[
claus
parents:
diff changeset
   257
	 (o class flags bitTest:bit) ifFalse:[
claus
parents:
diff changeset
   258
	     self halt
claus
parents:
diff changeset
   259
	 ].
claus
parents:
diff changeset
   260
       ] ifFalse:[
claus
parents:
diff changeset
   261
	 (o class flags bitTest:bit) ifTrue:[
claus
parents:
diff changeset
   262
	     self halt
claus
parents:
diff changeset
   263
	 ].
claus
parents:
diff changeset
   264
       ].
claus
parents:
diff changeset
   265
       o class isBehavior ifFalse:[
claus
parents:
diff changeset
   266
	 self halt
claus
parents:
diff changeset
   267
       ] ifTrue:[
claus
parents:
diff changeset
   268
	 (o class class flags bitTest:bit) ifFalse:[
claus
parents:
diff changeset
   269
	     self halt
claus
parents:
diff changeset
   270
	 ]
claus
parents:
diff changeset
   271
       ]
claus
parents:
diff changeset
   272
     ]
claus
parents:
diff changeset
   273
    "
claus
parents:
diff changeset
   274
! 
claus
parents:
diff changeset
   275
claus
parents:
diff changeset
   276
flagBlock
claus
parents:
diff changeset
   277
    "return the flag code which marks Block-like instances.
claus
parents:
diff changeset
   278
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   279
     checking for blocks."
claus
parents:
diff changeset
   280
claus
parents:
diff changeset
   281
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   282
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   283
claus
parents:
diff changeset
   284
    RETURN ( _MKSMALLINT(BLOCK_INSTS) );
claus
parents:
diff changeset
   285
%}
claus
parents:
diff changeset
   286
! 
claus
parents:
diff changeset
   287
claus
parents:
diff changeset
   288
flagMethod
claus
parents:
diff changeset
   289
    "return the flag code which marks Method-like instances.
claus
parents:
diff changeset
   290
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   291
     checking for methods."
claus
parents:
diff changeset
   292
claus
parents:
diff changeset
   293
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   294
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   295
claus
parents:
diff changeset
   296
    RETURN ( _MKSMALLINT(METHOD_INSTS) );
claus
parents:
diff changeset
   297
%}
claus
parents:
diff changeset
   298
! 
claus
parents:
diff changeset
   299
claus
parents:
diff changeset
   300
flagContext
claus
parents:
diff changeset
   301
    "return the flag code which marks Context-like instances.
claus
parents:
diff changeset
   302
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   303
     checking for contexts."
claus
parents:
diff changeset
   304
claus
parents:
diff changeset
   305
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   306
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   307
claus
parents:
diff changeset
   308
    RETURN ( _MKSMALLINT(CONTEXT_INSTS) );
claus
parents:
diff changeset
   309
%}
claus
parents:
diff changeset
   310
! 
claus
parents:
diff changeset
   311
claus
parents:
diff changeset
   312
flagBlockContext
claus
parents:
diff changeset
   313
    "return the flag code which marks BlockContext-like instances.
claus
parents:
diff changeset
   314
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   315
     checking for blockContexts."
claus
parents:
diff changeset
   316
claus
parents:
diff changeset
   317
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   318
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   319
claus
parents:
diff changeset
   320
    RETURN ( _MKSMALLINT(BCONTEXT_INSTS) );
claus
parents:
diff changeset
   321
%}
claus
parents:
diff changeset
   322
! 
claus
parents:
diff changeset
   323
claus
parents:
diff changeset
   324
flagFloat
claus
parents:
diff changeset
   325
    "return the flag code which marks Float-like instances.
claus
parents:
diff changeset
   326
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   327
     checking for floats."
claus
parents:
diff changeset
   328
claus
parents:
diff changeset
   329
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   330
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   331
claus
parents:
diff changeset
   332
    RETURN ( _MKSMALLINT(FLOAT_INSTS) );
claus
parents:
diff changeset
   333
%}
claus
parents:
diff changeset
   334
! 
claus
parents:
diff changeset
   335
claus
parents:
diff changeset
   336
flagSymbol
claus
parents:
diff changeset
   337
    "return the flag code which marks Symbol-like instances.
claus
parents:
diff changeset
   338
     You have to check this single bit in the flag value when
claus
parents:
diff changeset
   339
     checking for symbols."
claus
parents:
diff changeset
   340
claus
parents:
diff changeset
   341
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   342
    /* this is defined as a primitive to get defines from stc.h */
claus
parents:
diff changeset
   343
claus
parents:
diff changeset
   344
    RETURN ( _MKSMALLINT(SYMBOL_INSTS) );
claus
parents:
diff changeset
   345
%}
claus
parents:
diff changeset
   346
! !
claus
parents:
diff changeset
   347
claus
parents:
diff changeset
   348
!VMBehavior methodsFor:'accessing'!
claus
parents:
diff changeset
   349
claus
parents:
diff changeset
   350
superclass
claus
parents:
diff changeset
   351
    "return the receivers superclass"
claus
parents:
diff changeset
   352
claus
parents:
diff changeset
   353
    ^ superclass
claus
parents:
diff changeset
   354
!
claus
parents:
diff changeset
   355
claus
parents:
diff changeset
   356
selectorArray 
claus
parents:
diff changeset
   357
    "return the receivers selector array.
claus
parents:
diff changeset
   358
     Notice: this is not compatible with ST-80."
claus
parents:
diff changeset
   359
claus
parents:
diff changeset
   360
    ^ selectorArray
claus
parents:
diff changeset
   361
!
claus
parents:
diff changeset
   362
claus
parents:
diff changeset
   363
methodArray
claus
parents:
diff changeset
   364
    "return the receivers method array.
claus
parents:
diff changeset
   365
     Notice: this is not compatible with ST-80."
claus
parents:
diff changeset
   366
claus
parents:
diff changeset
   367
    ^ methodArray
claus
parents:
diff changeset
   368
!
claus
parents:
diff changeset
   369
claus
parents:
diff changeset
   370
flags
claus
parents:
diff changeset
   371
    "return the receivers flag bits"
claus
parents:
diff changeset
   372
claus
parents:
diff changeset
   373
    ^ flags
claus
parents:
diff changeset
   374
!
claus
parents:
diff changeset
   375
claus
parents:
diff changeset
   376
selectors:newSelectors methods:newMethods
claus
parents:
diff changeset
   377
    "set both selector array and method array of the receiver,
claus
parents:
diff changeset
   378
     and flush caches"
claus
parents:
diff changeset
   379
claus
parents:
diff changeset
   380
    ObjectMemory flushCaches.
claus
parents:
diff changeset
   381
    selectorArray := newSelectors.
claus
parents:
diff changeset
   382
    methodArray := newMethods
claus
parents:
diff changeset
   383
! !
claus
parents:
diff changeset
   384
claus
parents:
diff changeset
   385
!VMBehavior methodsFor:'queries'!
claus
parents:
diff changeset
   386
claus
parents:
diff changeset
   387
isVariable
claus
parents:
diff changeset
   388
    "return true, if instances have indexed instance variables"
claus
parents:
diff changeset
   389
claus
parents:
diff changeset
   390
    "this could be defined as:
claus
parents:
diff changeset
   391
	^ (flags bitAnd:(VMBehavior maskIndexType)) ~~ 0
claus
parents:
diff changeset
   392
     "
claus
parents:
diff changeset
   393
claus
parents:
diff changeset
   394
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   395
claus
parents:
diff changeset
   396
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? true : false ); 
claus
parents:
diff changeset
   397
%}
claus
parents:
diff changeset
   398
!
claus
parents:
diff changeset
   399
claus
parents:
diff changeset
   400
isFixed
claus
parents:
diff changeset
   401
    "return true, if instances do not have indexed instance variables"
claus
parents:
diff changeset
   402
claus
parents:
diff changeset
   403
    "this could be defined as:
claus
parents:
diff changeset
   404
	^ self isVariable not
claus
parents:
diff changeset
   405
    "
claus
parents:
diff changeset
   406
claus
parents:
diff changeset
   407
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   408
claus
parents:
diff changeset
   409
    RETURN ( (_intVal(_INST(flags)) & ARRAYMASK) ? false : true ); 
claus
parents:
diff changeset
   410
%}
claus
parents:
diff changeset
   411
!
claus
parents:
diff changeset
   412
claus
parents:
diff changeset
   413
isBits
claus
parents:
diff changeset
   414
    "return true, if instances have indexed byte or short instance variables.
claus
parents:
diff changeset
   415
     Ignore long, float and double arrays, since ST-80 code using isBits are probably
claus
parents:
diff changeset
   416
     not prepared to handle them correctly."
claus
parents:
diff changeset
   417
claus
parents:
diff changeset
   418
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   419
claus
parents:
diff changeset
   420
    REGISTER int flags;
claus
parents:
diff changeset
   421
claus
parents:
diff changeset
   422
    RETURN ( (((flags = (_intVal(_INST(flags)) & ARRAYMASK)) == BYTEARRAY)
claus
parents:
diff changeset
   423
	     || (flags == WORDARRAY)) ? true : false ); 
claus
parents:
diff changeset
   424
%}
claus
parents:
diff changeset
   425
!
claus
parents:
diff changeset
   426
claus
parents:
diff changeset
   427
isBytes
claus
parents:
diff changeset
   428
    "return true, if instances have indexed byte instance variables"
claus
parents:
diff changeset
   429
claus
parents:
diff changeset
   430
    "this could be defined as:
claus
parents:
diff changeset
   431
	^ (flags bitAnd:(VMBehavior maskIndexType)) == VMBehavior flagBytes
claus
parents:
diff changeset
   432
    "
claus
parents:
diff changeset
   433
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   434
claus
parents:
diff changeset
   435
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == BYTEARRAY) ? true : false ); 
claus
parents:
diff changeset
   436
%}
claus
parents:
diff changeset
   437
!
claus
parents:
diff changeset
   438
claus
parents:
diff changeset
   439
isWords
claus
parents:
diff changeset
   440
    "return true, if instances have indexed short instance variables"
claus
parents:
diff changeset
   441
claus
parents:
diff changeset
   442
    "this could be defined as:
claus
parents:
diff changeset
   443
	^ (flags bitAnd:(VMBehavior maskIndexType)) == VMBehavior flagWords
claus
parents:
diff changeset
   444
    "
claus
parents:
diff changeset
   445
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   446
claus
parents:
diff changeset
   447
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == WORDARRAY) ? true : false ); 
claus
parents:
diff changeset
   448
%}
claus
parents:
diff changeset
   449
!
claus
parents:
diff changeset
   450
claus
parents:
diff changeset
   451
isLongs
claus
parents:
diff changeset
   452
    "return true, if instances have indexed long instance variables"
claus
parents:
diff changeset
   453
claus
parents:
diff changeset
   454
    "this could be defined as:
claus
parents:
diff changeset
   455
	^ (flags bitAnd:(VMBehavior maskIndexType)) == VMBehavior flagLongs
claus
parents:
diff changeset
   456
    "
claus
parents:
diff changeset
   457
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   458
claus
parents:
diff changeset
   459
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == LONGARRAY) ? true : false ); 
claus
parents:
diff changeset
   460
%}
claus
parents:
diff changeset
   461
!
claus
parents:
diff changeset
   462
claus
parents:
diff changeset
   463
isFloats
claus
parents:
diff changeset
   464
    "return true, if instances have indexed float instance variables"
claus
parents:
diff changeset
   465
claus
parents:
diff changeset
   466
    "this could be defined as:
claus
parents:
diff changeset
   467
	^ (flags bitAnd:(VMBehavior maskIndexType)) == VMBehavior flagFloats
claus
parents:
diff changeset
   468
    "
claus
parents:
diff changeset
   469
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   470
claus
parents:
diff changeset
   471
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == FLOATARRAY) ? true : false ); 
claus
parents:
diff changeset
   472
%}
claus
parents:
diff changeset
   473
!
claus
parents:
diff changeset
   474
claus
parents:
diff changeset
   475
isDoubles
claus
parents:
diff changeset
   476
    "return true, if instances have indexed double instance variables"
claus
parents:
diff changeset
   477
claus
parents:
diff changeset
   478
    "this could be defined as:
claus
parents:
diff changeset
   479
	^ (flags bitAnd:(VMBehavior maskIndexType)) == VMBehavior flagDoubles
claus
parents:
diff changeset
   480
    "
claus
parents:
diff changeset
   481
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   482
claus
parents:
diff changeset
   483
    RETURN ( ((_intVal(_INST(flags)) & ARRAYMASK) == DOUBLEARRAY) ? true : false ); 
claus
parents:
diff changeset
   484
%}
claus
parents:
diff changeset
   485
!
claus
parents:
diff changeset
   486
claus
parents:
diff changeset
   487
isPointers
claus
parents:
diff changeset
   488
    "return true, if instances have pointer instance variables 
claus
parents:
diff changeset
   489
     i.e. are either non-indexed or have indexed pointer variables"
claus
parents:
diff changeset
   490
claus
parents:
diff changeset
   491
    "QUESTION: should we ignore WeakPointers ?"
claus
parents:
diff changeset
   492
claus
parents:
diff changeset
   493
%{  /* NOCONTEXT */
claus
parents:
diff changeset
   494
claus
parents:
diff changeset
   495
    REGISTER int flags;
claus
parents:
diff changeset
   496
claus
parents:
diff changeset
   497
    flags = _intVal(_INST(flags)) & ARRAYMASK;
claus
parents:
diff changeset
   498
    switch (flags) {
claus
parents:
diff changeset
   499
	default:
claus
parents:
diff changeset
   500
	    /* normal objects */
claus
parents:
diff changeset
   501
	    RETURN ( true );
claus
parents:
diff changeset
   502
claus
parents:
diff changeset
   503
	case BYTEARRAY:
claus
parents:
diff changeset
   504
	case WORDARRAY:
claus
parents:
diff changeset
   505
	case LONGARRAY:
claus
parents:
diff changeset
   506
	case FLOATARRAY:
claus
parents:
diff changeset
   507
	case DOUBLEARRAY:
claus
parents:
diff changeset
   508
	    RETURN (false );
claus
parents:
diff changeset
   509
claus
parents:
diff changeset
   510
	case WKPOINTERARRAY:
claus
parents:
diff changeset
   511
	    /* what about those ? */
claus
parents:
diff changeset
   512
	    RETURN (true );
claus
parents:
diff changeset
   513
    }
claus
parents:
diff changeset
   514
%}
claus
parents:
diff changeset
   515
!
claus
parents:
diff changeset
   516
claus
parents:
diff changeset
   517
lookupMethodFor:aSelector
claus
parents:
diff changeset
   518
    "return the method, which would be executed if aSelector was sent to
claus
parents:
diff changeset
   519
     an instance of the receiver. I.e. the selector arrays of the receiver
claus
parents:
diff changeset
   520
     and all of its superclasses are searched for aSelector.
claus
parents:
diff changeset
   521
     Return the method, or nil if instances do not understand aSelector.
claus
parents:
diff changeset
   522
     EXPERIMENTAL: take care of multiple superclasses."
claus
parents:
diff changeset
   523
claus
parents:
diff changeset
   524
    |m cls|
claus
parents:
diff changeset
   525
claus
parents:
diff changeset
   526
    cls := self.
claus
parents:
diff changeset
   527
    [cls notNil] whileTrue:[
claus
parents:
diff changeset
   528
	m := cls compiledMethodAt:aSelector.
claus
parents:
diff changeset
   529
	m notNil ifTrue:[^ m].
claus
parents:
diff changeset
   530
	cls := cls superclass
claus
parents:
diff changeset
   531
    ].
claus
parents:
diff changeset
   532
    ^ nil
claus
parents:
diff changeset
   533
!
claus
parents:
diff changeset
   534
claus
parents:
diff changeset
   535
cachedLookupMethodFor:aSelector
claus
parents:
diff changeset
   536
    "return the method, which would be executed if aSelector was sent to
claus
parents:
diff changeset
   537
     an instance of the receiver. I.e. the selector arrays of the receiver
claus
parents:
diff changeset
   538
     and all of its superclasses are searched for aSelector.
claus
parents:
diff changeset
   539
     Return the method, or nil if instances do not understand aSelector.
claus
parents:
diff changeset
   540
     This interface provides exactly the same information as #lookupMethodFor:,
claus
parents:
diff changeset
   541
     but uses the lookup-cache in the VM for faster search. 
claus
parents:
diff changeset
   542
     However, keep in mind, that doing a lookup through the cache also adds new
claus
parents:
diff changeset
   543
     entries and can thus slow down the system by polluting the cache with 
claus
parents:
diff changeset
   544
     irrelevant entries. (do NOT loop over all objects calling this method).
claus
parents:
diff changeset
   545
     Does NOT (currently) handle MI"
claus
parents:
diff changeset
   546
claus
parents:
diff changeset
   547
%{  /* NOCONTEXT */
362
claus
parents: 357
diff changeset
   548
    extern OBJ __lookup();
357
claus
parents:
diff changeset
   549
362
claus
parents: 357
diff changeset
   550
    RETURN ( __lookup(self, aSelector, SENDER) );
357
claus
parents:
diff changeset
   551
%}
claus
parents:
diff changeset
   552
claus
parents:
diff changeset
   553
    "
claus
parents:
diff changeset
   554
     String cachedLookupMethodFor:#=
claus
parents:
diff changeset
   555
     String cachedLookupMethodFor:#asOrderedCollection
claus
parents:
diff changeset
   556
    "
claus
parents:
diff changeset
   557
! !
claus
parents:
diff changeset
   558
claus
parents:
diff changeset
   559
!VMBehavior methodsFor:'private accessing'!
claus
parents:
diff changeset
   560
claus
parents:
diff changeset
   561
setSuperclass:aClass
claus
parents:
diff changeset
   562
    "set the superclass of the receiver.
claus
parents:
diff changeset
   563
     this method is for special uses only - there will be no recompilation
claus
parents:
diff changeset
   564
     and no change record written here. Also, if the receiver class has
claus
parents:
diff changeset
   565
     already been in use, future operation of the system is not guaranteed to
claus
parents:
diff changeset
   566
     be correct, since no caches are flushed.
claus
parents:
diff changeset
   567
     Therefore: do NOT use it; use Behavior>>superclass: (or flush the caches, at least)"
claus
parents:
diff changeset
   568
claus
parents:
diff changeset
   569
    superclass := aClass
claus
parents:
diff changeset
   570
!
claus
parents:
diff changeset
   571
claus
parents:
diff changeset
   572
setFlags:aNumber
claus
parents:
diff changeset
   573
    "set the flags.
claus
parents:
diff changeset
   574
     Do NOT use it."
claus
parents:
diff changeset
   575
claus
parents:
diff changeset
   576
    flags := aNumber
claus
parents:
diff changeset
   577
!
claus
parents:
diff changeset
   578
claus
parents:
diff changeset
   579
setSelectors:sels methods:m
claus
parents:
diff changeset
   580
    "set some inst vars. 
claus
parents:
diff changeset
   581
     this method is for special uses only - there will be no recompilation
claus
parents:
diff changeset
   582
     and no change record written here; 
claus
parents:
diff changeset
   583
     Do NOT use it."
claus
parents:
diff changeset
   584
claus
parents:
diff changeset
   585
    selectorArray := sels.
claus
parents:
diff changeset
   586
    methodArray := m.
claus
parents:
diff changeset
   587
!
claus
parents:
diff changeset
   588
claus
parents:
diff changeset
   589
setSelectorArray:anArray
claus
parents:
diff changeset
   590
    "set the selector array of the receiver.
claus
parents:
diff changeset
   591
     this method is for special uses only - there will be no recompilation
claus
parents:
diff changeset
   592
     and no change record written here.
claus
parents:
diff changeset
   593
     NOT for general use."
claus
parents:
diff changeset
   594
claus
parents:
diff changeset
   595
    selectorArray := anArray
claus
parents:
diff changeset
   596
!
claus
parents:
diff changeset
   597
claus
parents:
diff changeset
   598
setMethodArray:anArray
claus
parents:
diff changeset
   599
    "set the method array of the receiver.
claus
parents:
diff changeset
   600
     this method is for special uses only - there will be no recompilation
claus
parents:
diff changeset
   601
     and no change record written here.
claus
parents:
diff changeset
   602
     NOT for general use."
claus
parents:
diff changeset
   603
claus
parents:
diff changeset
   604
    methodArray := anArray
claus
parents:
diff changeset
   605
! !