PrimaryNode.st
author claus
Fri, 16 Jul 1993 11:38:57 +0200
changeset 0 7ad01559b262
child 3 b63b8a6b71fb
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
     1
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-93 by Claus Gittinger
7ad01559b262 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
7ad01559b262 Initial revision
claus
parents:
diff changeset
     4
7ad01559b262 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
7ad01559b262 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
7ad01559b262 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
7ad01559b262 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
7ad01559b262 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
7ad01559b262 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    11
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
    12
7ad01559b262 Initial revision
claus
parents:
diff changeset
    13
ParseNode subclass:#PrimaryNode
7ad01559b262 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'value name selfValue token index block'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
7ad01559b262 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
7ad01559b262 Initial revision
claus
parents:
diff changeset
    17
       category:'System-Compiler-Support'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    18
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    19
7ad01559b262 Initial revision
claus
parents:
diff changeset
    20
PrimaryNode comment:'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    21
7ad01559b262 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1989-93 by Claus Gittinger
7ad01559b262 Initial revision
claus
parents:
diff changeset
    23
             All Rights Reserved
7ad01559b262 Initial revision
claus
parents:
diff changeset
    24
7ad01559b262 Initial revision
claus
parents:
diff changeset
    25
%W% %E%
7ad01559b262 Initial revision
claus
parents:
diff changeset
    26
written 88 by claus
7ad01559b262 Initial revision
claus
parents:
diff changeset
    27
'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    28
7ad01559b262 Initial revision
claus
parents:
diff changeset
    29
!PrimaryNode class methodsFor:'instance creation'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    30
7ad01559b262 Initial revision
claus
parents:
diff changeset
    31
type:t token:tok
7ad01559b262 Initial revision
claus
parents:
diff changeset
    32
    ^ (self basicNew) type:t token:tok
7ad01559b262 Initial revision
claus
parents:
diff changeset
    33
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    34
7ad01559b262 Initial revision
claus
parents:
diff changeset
    35
type:t name:n
7ad01559b262 Initial revision
claus
parents:
diff changeset
    36
    ^ (self basicNew) type:t name:n
7ad01559b262 Initial revision
claus
parents:
diff changeset
    37
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    38
7ad01559b262 Initial revision
claus
parents:
diff changeset
    39
type:t index:i selfValue:s
7ad01559b262 Initial revision
claus
parents:
diff changeset
    40
    ^ (self basicNew) type:t index:i selfValue:s
7ad01559b262 Initial revision
claus
parents:
diff changeset
    41
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    42
7ad01559b262 Initial revision
claus
parents:
diff changeset
    43
type:t value:val
7ad01559b262 Initial revision
claus
parents:
diff changeset
    44
    ^ (self basicNew) type:t value:val
7ad01559b262 Initial revision
claus
parents:
diff changeset
    45
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    46
7ad01559b262 Initial revision
claus
parents:
diff changeset
    47
type:t name:n value:val
7ad01559b262 Initial revision
claus
parents:
diff changeset
    48
    ^ (self basicNew) type:t name:n value:val
7ad01559b262 Initial revision
claus
parents:
diff changeset
    49
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    50
7ad01559b262 Initial revision
claus
parents:
diff changeset
    51
type:t name:n token:tok index:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
    52
    ^ (self basicNew) type:t name:n token:tok index:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
    53
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    54
7ad01559b262 Initial revision
claus
parents:
diff changeset
    55
type:t name:n index:i selfValue:s
7ad01559b262 Initial revision
claus
parents:
diff changeset
    56
    ^ (self basicNew) type:t name:n index:i selfValue:s
7ad01559b262 Initial revision
claus
parents:
diff changeset
    57
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    58
7ad01559b262 Initial revision
claus
parents:
diff changeset
    59
type:t name:n token:tok index:i block:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
    60
    ^ (self basicNew) type:t name:n token:tok index:i block:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
    61
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    62
7ad01559b262 Initial revision
claus
parents:
diff changeset
    63
type:t token:tok index:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
    64
    ^ (self basicNew) type:t token:tok index:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
    65
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    66
7ad01559b262 Initial revision
claus
parents:
diff changeset
    67
type:t token:tok index:i block:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
    68
    ^ (self basicNew) type:t token:tok index:i block:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
    69
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
    70
7ad01559b262 Initial revision
claus
parents:
diff changeset
    71
!PrimaryNode methodsFor:'accessing'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    72
7ad01559b262 Initial revision
claus
parents:
diff changeset
    73
type:t token:tok
7ad01559b262 Initial revision
claus
parents:
diff changeset
    74
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    75
    token := tok
7ad01559b262 Initial revision
claus
parents:
diff changeset
    76
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    77
7ad01559b262 Initial revision
claus
parents:
diff changeset
    78
type:t token:tok index:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
    79
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    80
    index := i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    81
    token := tok
7ad01559b262 Initial revision
claus
parents:
diff changeset
    82
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    83
7ad01559b262 Initial revision
claus
parents:
diff changeset
    84
type:t token:tok index:i block:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
    85
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    86
    index := i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    87
    block := b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    88
    token := tok
7ad01559b262 Initial revision
claus
parents:
diff changeset
    89
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    90
7ad01559b262 Initial revision
claus
parents:
diff changeset
    91
type:t name:n
7ad01559b262 Initial revision
claus
parents:
diff changeset
    92
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    93
    value := nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    94
    name := n
7ad01559b262 Initial revision
claus
parents:
diff changeset
    95
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    96
7ad01559b262 Initial revision
claus
parents:
diff changeset
    97
type:t index:i selfValue:s
7ad01559b262 Initial revision
claus
parents:
diff changeset
    98
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    99
    value := nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   100
    index := i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   101
    selfValue := s
7ad01559b262 Initial revision
claus
parents:
diff changeset
   102
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   103
7ad01559b262 Initial revision
claus
parents:
diff changeset
   104
type:t value:val
7ad01559b262 Initial revision
claus
parents:
diff changeset
   105
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   106
    value := val
7ad01559b262 Initial revision
claus
parents:
diff changeset
   107
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   108
7ad01559b262 Initial revision
claus
parents:
diff changeset
   109
type:t name:n value:val
7ad01559b262 Initial revision
claus
parents:
diff changeset
   110
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   111
    name := n.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   112
    value := val
7ad01559b262 Initial revision
claus
parents:
diff changeset
   113
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   114
7ad01559b262 Initial revision
claus
parents:
diff changeset
   115
type:t name:n index:i selfValue:s
7ad01559b262 Initial revision
claus
parents:
diff changeset
   116
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   117
    value := nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   118
    index := i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   119
    selfValue := s.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   120
    name := n
7ad01559b262 Initial revision
claus
parents:
diff changeset
   121
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   122
7ad01559b262 Initial revision
claus
parents:
diff changeset
   123
type:t name:n token:tok index:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
   124
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   125
    index := i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   126
    token := tok.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   127
    name := n
7ad01559b262 Initial revision
claus
parents:
diff changeset
   128
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   129
7ad01559b262 Initial revision
claus
parents:
diff changeset
   130
type:t name:n token:tok index:i block:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   131
    type := t.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   132
    index := i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   133
    block := b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   134
    token := tok.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   135
    name := n
7ad01559b262 Initial revision
claus
parents:
diff changeset
   136
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   137
7ad01559b262 Initial revision
claus
parents:
diff changeset
   138
name
7ad01559b262 Initial revision
claus
parents:
diff changeset
   139
    ^ name
7ad01559b262 Initial revision
claus
parents:
diff changeset
   140
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   141
7ad01559b262 Initial revision
claus
parents:
diff changeset
   142
index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   143
    ^ index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   144
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   145
7ad01559b262 Initial revision
claus
parents:
diff changeset
   146
value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   147
    ^ value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   148
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   149
7ad01559b262 Initial revision
claus
parents:
diff changeset
   150
!PrimaryNode methodsFor:'evaluating'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   151
7ad01559b262 Initial revision
claus
parents:
diff changeset
   152
evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   153
    (type == #MethodVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   154
        ^ token value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   155
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   156
    (type == #InstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   157
        ^ selfValue instVarAt:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   158
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   159
    (type == #BlockArg) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   160
        ^ token value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   161
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   162
    (type == #GlobalVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   163
        (Smalltalk includesKey:name) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   164
            ^ Smalltalk at:name
7ad01559b262 Initial revision
claus
parents:
diff changeset
   165
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   166
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   167
        self error:('global ' , name , ' is undefined').
7ad01559b262 Initial revision
claus
parents:
diff changeset
   168
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   169
7ad01559b262 Initial revision
claus
parents:
diff changeset
   170
        ^ UndefinedVariable name:name.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   171
        ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   172
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   173
    (type == #BlockVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   174
        ^ token value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   175
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   176
    (type == #ClassVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   177
        ^ Smalltalk at:name
7ad01559b262 Initial revision
claus
parents:
diff changeset
   178
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   179
    (type == #ClassInstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   180
        ^ selfValue class instVarAt:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   181
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   182
    (type == #ThisContext) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   183
        ^ thisContext
7ad01559b262 Initial revision
claus
parents:
diff changeset
   184
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   185
    ^ value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   186
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   187
7ad01559b262 Initial revision
claus
parents:
diff changeset
   188
store:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   189
    (type == #MethodVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   190
        token value:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   191
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   192
    (type == #InstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   193
        ^ selfValue instVarAt:index put:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   194
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   195
    (type == #GlobalVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   196
        ^ Smalltalk at:name put:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   197
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   198
    (type == #ClassVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   199
        ^ Smalltalk at:name put:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   200
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   201
    (type == #BlockVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   202
        token value:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   203
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   204
    (type == #ClassInstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   205
        ^ selfValue class instVarAt:index put:aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   206
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   207
    ^ aValue
7ad01559b262 Initial revision
claus
parents:
diff changeset
   208
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   209
7ad01559b262 Initial revision
claus
parents:
diff changeset
   210
!PrimaryNode methodsFor:'code generation'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   211
7ad01559b262 Initial revision
claus
parents:
diff changeset
   212
codeForSideEffectOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   213
    "no code at all"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   214
    ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   215
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   216
7ad01559b262 Initial revision
claus
parents:
diff changeset
   217
codeOn:aStream inBlock:codeBlock
7ad01559b262 Initial revision
claus
parents:
diff changeset
   218
    |theCode b deltaLevel|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   219
7ad01559b262 Initial revision
claus
parents:
diff changeset
   220
    (type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   221
        aStream nextPut:#pushSelf. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   222
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   223
    (type == #MethodArg) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   224
        (index <= 4) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   225
            aStream nextPut:(#(pushMethodArg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   226
                               pushMethodArg2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   227
                               pushMethodArg3 
7ad01559b262 Initial revision
claus
parents:
diff changeset
   228
                               pushMethodArg4) at:index).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   229
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   230
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   231
        aStream nextPut:#pushMethodArg.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   232
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   233
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   234
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   235
    (type == #MethodVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   236
        (index <= 6) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   237
            aStream nextPut:(#(pushMethodVar1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   238
                               pushMethodVar2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   239
                               pushMethodVar3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   240
                               pushMethodVar4
7ad01559b262 Initial revision
claus
parents:
diff changeset
   241
                               pushMethodVar5
7ad01559b262 Initial revision
claus
parents:
diff changeset
   242
                               pushMethodVar6) at:index).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   243
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   244
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   245
        aStream nextPut:#pushMethodVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   246
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   247
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   248
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   249
    (type == #InstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   250
        (index <= 10) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   251
            theCode := #(pushInstVar1 pushInstVar2 pushInstVar3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   252
                         pushInstVar4 pushInstVar5 pushInstVar6
7ad01559b262 Initial revision
claus
parents:
diff changeset
   253
                         pushInstVar7 pushInstVar8 pushInstVar9
7ad01559b262 Initial revision
claus
parents:
diff changeset
   254
                         pushInstVar10) at:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   255
            aStream nextPut:theCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   256
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   257
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   258
        aStream nextPut:#pushInstVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   259
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   260
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   261
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   262
    (type == #BlockArg) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   263
        "find deltaLevel to block, where argument was defined"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   264
        b := codeBlock.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   265
        deltaLevel := 0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   266
        [b notNil and:[b ~~ block]] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   267
            b inlineBlock ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   268
                deltaLevel := deltaLevel + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   269
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   270
            b := b home
7ad01559b262 Initial revision
claus
parents:
diff changeset
   271
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   272
        (deltaLevel == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   273
            (index <= 4) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   274
                theCode := #(pushBlockArg1 pushBlockArg2 pushBlockArg3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   275
                             pushBlockArg4) at:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   276
                aStream nextPut:theCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   277
                ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   278
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   279
            aStream nextPut:#pushBlockArg.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   280
            aStream nextPut:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   281
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   282
            (deltaLevel == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   283
                aStream nextPut:#pushOuter1BlockArg
7ad01559b262 Initial revision
claus
parents:
diff changeset
   284
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   285
                (deltaLevel == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   286
                    aStream nextPut:#pushOuter2BlockArg
7ad01559b262 Initial revision
claus
parents:
diff changeset
   287
                ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   288
                    aStream nextPut:#pushOuterBlockArg.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   289
                    aStream nextPut:deltaLevel
7ad01559b262 Initial revision
claus
parents:
diff changeset
   290
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   291
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   292
            aStream nextPut:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   293
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   294
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   295
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   296
    (type == #Super) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   297
        aStream nextPut:#pushSelf. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   298
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   299
    (type == #GlobalVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   300
        aStream nextPut:#pushGlobal.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   301
        aStream nextPut:name.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   302
        aStream nextPut:0.      "slot for generation "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   303
        aStream nextPut:0.      "slot for cell address (4 byte) "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   304
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   305
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   306
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   307
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   308
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   309
    (type == #ClassVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   310
        aStream nextPut:#pushClassVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   311
        aStream nextPut:name.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   312
        aStream nextPut:0.      "slot for generation "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   313
        aStream nextPut:0.      "slot for cell address (4 byte) "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   314
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   315
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   316
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   317
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   318
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   319
    (type == #BlockVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   320
        "find deltaLevel to block, where variable was defined"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   321
        b := codeBlock.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   322
        deltaLevel := 0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   323
        [b notNil and:[b ~~ block]] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   324
            b inlineBlock ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   325
                deltaLevel := deltaLevel + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   326
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   327
            b := b home
7ad01559b262 Initial revision
claus
parents:
diff changeset
   328
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   329
7ad01559b262 Initial revision
claus
parents:
diff changeset
   330
        (deltaLevel == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   331
            aStream nextPut:#pushBlockVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   332
            aStream nextPut:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   333
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   334
            aStream nextPut:#pushOuterBlockVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   335
            aStream nextPut:deltaLevel.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   336
            aStream nextPut:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   337
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   338
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   339
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   340
    (type == #ClassInstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   341
        aStream nextPut:#pushClassInstVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   342
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   343
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   344
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   345
    (type == #ThisContext) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   346
        aStream nextPut:#pushThisContext. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   347
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   348
7ad01559b262 Initial revision
claus
parents:
diff changeset
   349
    "can this be reached ?"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   350
7ad01559b262 Initial revision
claus
parents:
diff changeset
   351
    aStream nextPut:#pushLit.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   352
    aStream nextPut:value
7ad01559b262 Initial revision
claus
parents:
diff changeset
   353
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   354
7ad01559b262 Initial revision
claus
parents:
diff changeset
   355
codeStoreOn:aStream inBlock:codeBlock valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   356
    |theCode b deltaLevel|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   357
7ad01559b262 Initial revision
claus
parents:
diff changeset
   358
    valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   359
        aStream nextPut:#dup
7ad01559b262 Initial revision
claus
parents:
diff changeset
   360
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   361
    (type == #MethodVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   362
        (index <= 6) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   363
            theCode := #(storeMethodVar1 storeMethodVar2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   364
                         storeMethodVar3 storeMethodVar4
7ad01559b262 Initial revision
claus
parents:
diff changeset
   365
                         storeMethodVar5 storeMethodVar6) at:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   366
            aStream nextPut:theCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   367
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   368
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   369
        aStream nextPut:#storeMethodVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   370
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   371
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   372
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   373
    (type == #InstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   374
        (index <= 10) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   375
            theCode := #(storeInstVar1 storeInstVar2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   376
                         storeInstVar3 storeInstVar4
7ad01559b262 Initial revision
claus
parents:
diff changeset
   377
                         storeInstVar5 storeInstVar6
7ad01559b262 Initial revision
claus
parents:
diff changeset
   378
                         storeInstVar7 storeInstVar8
7ad01559b262 Initial revision
claus
parents:
diff changeset
   379
                         storeInstVar9 storeInstVar10) at:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   380
            aStream nextPut:theCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   381
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   382
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   383
        aStream nextPut:#storeInstVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   384
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   385
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   386
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   387
    (type == #GlobalVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   388
        aStream nextPut:#storeGlobal.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   389
        aStream nextPut:name.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   390
        aStream nextPut:0.      "slot for generation "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   391
        aStream nextPut:0.      "slot for cell address (4 byte) "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   392
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   393
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   394
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   395
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   396
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   397
    (type == #BlockVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   398
        "find deltaLevel to block, where variable was defined"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   399
        b := codeBlock.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   400
        deltaLevel := 0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   401
        [b notNil and:[b ~~ block]] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   402
            b inlineBlock ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   403
                deltaLevel := deltaLevel + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   404
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   405
            b := b home
7ad01559b262 Initial revision
claus
parents:
diff changeset
   406
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   407
7ad01559b262 Initial revision
claus
parents:
diff changeset
   408
        (deltaLevel == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   409
            aStream nextPut:#storeBlockVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   410
            aStream nextPut:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   411
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   412
            aStream nextPut:#storeOuterBlockVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   413
            aStream nextPut:deltaLevel.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   414
            aStream nextPut:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   415
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   416
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   417
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   418
    (type == #ClassVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   419
        aStream nextPut:#storeClassVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   420
        aStream nextPut:name.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   421
        aStream nextPut:0.      "slot for generation "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   422
        aStream nextPut:0.      "slot for cell address (4 byte) "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   423
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   424
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   425
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   426
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   427
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   428
    (type == #ClassInstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   429
        aStream nextPut:#storeClassInstVar.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   430
        aStream nextPut:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   431
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   432
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   433
    "cannot be reached"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   434
    ^ self error:'bad assignment'
7ad01559b262 Initial revision
claus
parents:
diff changeset
   435
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   436
7ad01559b262 Initial revision
claus
parents:
diff changeset
   437
!PrimaryNode methodsFor:'printing'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   438
7ad01559b262 Initial revision
claus
parents:
diff changeset
   439
printOn:aStream indent:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
   440
    (type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   441
        aStream nextPutAll:'self'. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   442
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   443
    (type == #MethodArg) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   444
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   445
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   446
    (type == #MethodVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   447
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   448
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   449
    (type == #InstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   450
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   451
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   452
    (type == #BlockArg) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   453
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   454
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   455
    (type == #Super) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   456
        aStream nextPutAll:'super'. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   457
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   458
    (type == #GlobalVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   459
        aStream nextPutAll:name.^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   460
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   461
    (type == #ClassVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   462
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   463
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   464
    (type == #BlockVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   465
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   466
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   467
    (type == #ClassInstanceVariable) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   468
        aStream nextPutAll:name. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   469
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   470
    (type == #ThisContext) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   471
        aStream nextPutAll:'thisContext'. ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   472
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   473
    self halt
7ad01559b262 Initial revision
claus
parents:
diff changeset
   474
! !