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