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