BCompiler.st
author claus
Wed, 30 Mar 1994 12:10:24 +0200
changeset 19 84a1ddf215a5
parent 15 992c3d87edbf
child 20 f8dd8ba75205
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
     1
"
4
f6fd83437415 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
0
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
Parser subclass:#ByteCodeCompiler
7ad01559b262 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'code codeIndex
7ad01559b262 Initial revision
claus
parents:
diff changeset
    15
                              litArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
    16
                              stackDelta extra lineno
7ad01559b262 Initial revision
claus
parents:
diff changeset
    17
                              maxStackDepth
7ad01559b262 Initial revision
claus
parents:
diff changeset
    18
                              relocList'
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
    19
       classVariableNames:'JumpToAbsJump'
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    20
       poolDictionaries:''
7ad01559b262 Initial revision
claus
parents:
diff changeset
    21
       category:'System-Compiler'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    22
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    23
7ad01559b262 Initial revision
claus
parents:
diff changeset
    24
ByteCodeCompiler comment:'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    25
4
f6fd83437415 *** empty log message ***
claus
parents: 3
diff changeset
    26
COPYRIGHT (c) 1989 by Claus Gittinger
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    27
             All Rights Reserved
7ad01559b262 Initial revision
claus
parents:
diff changeset
    28
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    29
$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.10 1994-03-30 10:09:41 claus Exp $
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    30
'!
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    31
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    32
!ByteCodeCompiler class methodsFor:'documentation'!
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    33
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    34
documentation
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    35
"
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    36
    This class performs compilation into ByteCodes.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    37
    First, parsing is done using superclass methods,
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    38
    then the parse-tree is converted into an array of symbolic codes
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    39
    and a relocation table; 
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    40
    these two are finally combined into a byteArray of the codes.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    41
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    42
    (the intermediate step through symbolic codes is for debugging
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    43
     only - it will vanish)
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    44
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    45
    There are many dependencies to the run-time-system (especially the
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    46
    interpreter) in here - be careful when playing around ...
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    47
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    48
    Instance variables:
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    49
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    50
        code            <ByteArry>              bytecodes
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    51
        codeIndex       <SmallInteger>          next index to put into code array
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    52
        litArray        <OrderedCollection>     literals
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    53
        stackDelta      <SmallInteger>          return value of byteCodeFor:
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    54
        extra           <Symbol>                return value of byteCodeFor:
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    55
        lineno          <Boolean>               return value of byteCodeFor:
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    56
        maxStackDepth   <SmallInteger>          stack need of method
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    57
        relocList       <Array>                 used temporary for relocation
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    58
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    59
    Class variables:
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    60
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
    61
        JumpToAbsJump   <Dictionary>            internal table to map opcodes
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    62
"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
    63
! !
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    64
7ad01559b262 Initial revision
claus
parents:
diff changeset
    65
!ByteCodeCompiler class methodsFor:'compiling methods'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    66
7ad01559b262 Initial revision
claus
parents:
diff changeset
    67
compile:methodText forClass:classToCompileFor
7ad01559b262 Initial revision
claus
parents:
diff changeset
    68
    "compile a source-string for a method in classToCompileFor"
7ad01559b262 Initial revision
claus
parents:
diff changeset
    69
7ad01559b262 Initial revision
claus
parents:
diff changeset
    70
    ^ self compile:methodText
7ad01559b262 Initial revision
claus
parents:
diff changeset
    71
          forClass:classToCompileFor
7ad01559b262 Initial revision
claus
parents:
diff changeset
    72
        inCategory:'others'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    73
         notifying:nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
    74
           install:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
    75
        skipIfSame:false
7ad01559b262 Initial revision
claus
parents:
diff changeset
    76
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    77
7ad01559b262 Initial revision
claus
parents:
diff changeset
    78
compile:aString forClass:aClass inCategory:cat
7ad01559b262 Initial revision
claus
parents:
diff changeset
    79
    "compile a source-string for a method in classToCompileFor.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    80
     The method will get cat as category"
7ad01559b262 Initial revision
claus
parents:
diff changeset
    81
7ad01559b262 Initial revision
claus
parents:
diff changeset
    82
    ^ self compile:aString
7ad01559b262 Initial revision
claus
parents:
diff changeset
    83
          forClass:aClass
7ad01559b262 Initial revision
claus
parents:
diff changeset
    84
        inCategory:cat
7ad01559b262 Initial revision
claus
parents:
diff changeset
    85
         notifying:nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
    86
           install:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
    87
        skipIfSame:false
7ad01559b262 Initial revision
claus
parents:
diff changeset
    88
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    89
7ad01559b262 Initial revision
claus
parents:
diff changeset
    90
compile:methodText forClass:classToCompileFor notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
    91
    "compile a source-string for a method in classToCompileFor.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    92
     errors are forwarded to someOne."
7ad01559b262 Initial revision
claus
parents:
diff changeset
    93
7ad01559b262 Initial revision
claus
parents:
diff changeset
    94
    ^ self compile:methodText
7ad01559b262 Initial revision
claus
parents:
diff changeset
    95
          forClass:classToCompileFor
7ad01559b262 Initial revision
claus
parents:
diff changeset
    96
        inCategory:'others'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    97
         notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
    98
           install:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
    99
        skipIfSame:false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   100
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   101
7ad01559b262 Initial revision
claus
parents:
diff changeset
   102
compile:aString forClass:aClass inCategory:cat notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
   103
    "compile a source-string for a method in classToCompileFor.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   104
     errors are forwarded to someOne.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   105
     The method will get cat as category"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   106
7ad01559b262 Initial revision
claus
parents:
diff changeset
   107
    ^ self compile:aString
7ad01559b262 Initial revision
claus
parents:
diff changeset
   108
          forClass:aClass
7ad01559b262 Initial revision
claus
parents:
diff changeset
   109
        inCategory:cat
7ad01559b262 Initial revision
claus
parents:
diff changeset
   110
         notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
   111
           install:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   112
        skipIfSame:false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   113
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   114
7ad01559b262 Initial revision
claus
parents:
diff changeset
   115
compile:aString forClass:aClass inCategory:cat notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
   116
                                                 install:install
7ad01559b262 Initial revision
claus
parents:
diff changeset
   117
    ^ self compile:aString
7ad01559b262 Initial revision
claus
parents:
diff changeset
   118
          forClass:aClass
7ad01559b262 Initial revision
claus
parents:
diff changeset
   119
        inCategory:cat
7ad01559b262 Initial revision
claus
parents:
diff changeset
   120
         notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
   121
           install:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   122
        skipIfSame:false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   123
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   124
7ad01559b262 Initial revision
claus
parents:
diff changeset
   125
compile:aString forClass:aClass inCategory:cat notifying:someOne
7ad01559b262 Initial revision
claus
parents:
diff changeset
   126
                 install:install skipIfSame:skipIfSame
7ad01559b262 Initial revision
claus
parents:
diff changeset
   127
7ad01559b262 Initial revision
claus
parents:
diff changeset
   128
    "the basic workhorse method for compiling.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   129
     compile a source-string for a method in classToCompileFor.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   130
     errors are forwarded to someOne (report on Transcript and return
7ad01559b262 Initial revision
claus
parents:
diff changeset
   131
     #Error, if someOne is nil).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   132
7ad01559b262 Initial revision
claus
parents:
diff changeset
   133
     The new method will get cat as category. If install is true, the method
7ad01559b262 Initial revision
claus
parents:
diff changeset
   134
     will go into the classes method-table, otherwise the method is simply
7ad01559b262 Initial revision
claus
parents:
diff changeset
   135
     returned (for anonymous methods).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   136
     If skipIsSame is true, and the source is the same as an existing
7ad01559b262 Initial revision
claus
parents:
diff changeset
   137
     methods source, this is a noop (for fast fileIn)."
7ad01559b262 Initial revision
claus
parents:
diff changeset
   138
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   139
    |compiler newMethod tree lits symbolicCodeArray oldMethod lazy|
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   140
7ad01559b262 Initial revision
claus
parents:
diff changeset
   141
    aString isNil ifTrue:[^ nil].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   142
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   143
    "lazy compilation is EXPERIMENTAL"
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   144
    lazy := (LazyCompilation == true) and:[install].
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   145
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   146
    "create a compiler, let it parse and create the parsetree"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   147
7ad01559b262 Initial revision
claus
parents:
diff changeset
   148
    compiler := self for:(ReadStream on:aString).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   149
    compiler setClassToCompileFor:aClass.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   150
    compiler notifying:someOne.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   151
7ad01559b262 Initial revision
claus
parents:
diff changeset
   152
    compiler nextToken.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   153
    (compiler parseMethodSpec == #Error) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   154
        tree := #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   155
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   156
        "check if same source"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   157
        (skipIfSame and:[compiler selector notNil]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   158
            oldMethod := aClass compiledMethodAt:(compiler selector).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   159
            oldMethod notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   160
                oldMethod source = aString ifTrue:[
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   161
                    Smalltalk silentLoading == true ifFalse:[
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   162
                        Transcript showCr:('unchanged: ',aClass name,' ',compiler selector)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   163
                    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   164
                    ^ oldMethod
7ad01559b262 Initial revision
claus
parents:
diff changeset
   165
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   166
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   167
        ].
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   168
        lazy ifFalse:[
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   169
            tree := compiler parseMethodBody.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   170
            compiler tree:tree.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   171
        ]
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   172
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   173
7ad01559b262 Initial revision
claus
parents:
diff changeset
   174
    (compiler errorFlag or:[tree == #Error]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   175
        compiler selector notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   176
            Transcript show:(compiler selector,' ')
7ad01559b262 Initial revision
claus
parents:
diff changeset
   177
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   178
        Transcript showCr:'syntax error'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   179
        ^ #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   180
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   181
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   182
    "if no error and also no selector ..."
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   183
    compiler selector isNil ifTrue:[
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   184
        "... it was just a comment or other empty stuff"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   185
        ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   186
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   187
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   188
    "will add freak-out support here soon ..."
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   189
    compiler hasPrimitiveCode ifTrue:[
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   190
        Transcript showCr:'cannot compile primitives (yet)'.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   191
        ^ #Error
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   192
    ].
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   193
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   194
    "EXPERIMENTAL: quick loading"
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   195
    lazy ifTrue:[
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   196
        newMethod := LazyMethod new.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   197
        newMethod source:aString.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   198
        newMethod category:cat.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   199
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   200
        aClass addSelector:(compiler selector) withLazyMethod:newMethod.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   201
        ^ newMethod
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   202
    ].
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   203
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   204
    "produce symbolic code first"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   205
7ad01559b262 Initial revision
claus
parents:
diff changeset
   206
    symbolicCodeArray := compiler genSymbolicCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   207
    (symbolicCodeArray == #Error) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   208
        compiler selector notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   209
            Transcript show:(compiler selector,' ')
7ad01559b262 Initial revision
claus
parents:
diff changeset
   210
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   211
        Transcript showCr:'translation error'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   212
        ^ #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   213
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   214
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   215
    "take this, producing bytecode 
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   216
     (someone willin' to make machine code :-)"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   217
    ((compiler genByteCodeFrom:symbolicCodeArray) == #Error) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   218
        compiler selector notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   219
            Transcript show:(compiler selector,' ')
7ad01559b262 Initial revision
claus
parents:
diff changeset
   220
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   221
        Transcript showCr:'relocation error - must be simplified'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   222
        ^ #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   223
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   224
7ad01559b262 Initial revision
claus
parents:
diff changeset
   225
    "finally create the new method-object"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   226
7ad01559b262 Initial revision
claus
parents:
diff changeset
   227
    newMethod := Method new.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   228
    lits := compiler literalArray.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   229
    lits notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   230
        "literals MUST be an array - not just any Collection"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   231
        lits := Array withAll:lits.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   232
        newMethod literals:lits
7ad01559b262 Initial revision
claus
parents:
diff changeset
   233
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   234
    newMethod byteCode:(compiler code).
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   235
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   236
    "if there where any corrections, install the updated source"
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   237
    compiler correctedSource notNil ifTrue:[
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   238
        newMethod source:compiler correctedSource
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   239
    ] ifFalse:[
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   240
        newMethod source:aString.
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   241
    ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   242
    newMethod category:cat.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   243
    newMethod numberOfMethodVars:(compiler numberOfMethodVars).
13
30e69e21d1d1 *** empty log message ***
claus
parents: 12
diff changeset
   244
    newMethod numberOfMethodArgs:(compiler numberOfMethodArgs).
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   245
    newMethod stackSize:(compiler maxStackDepth).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   246
7ad01559b262 Initial revision
claus
parents:
diff changeset
   247
    install ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   248
        aClass addSelector:(compiler selector) withMethod:newMethod
7ad01559b262 Initial revision
claus
parents:
diff changeset
   249
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   250
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   251
    Smalltalk silentLoading == true ifFalse:[
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   252
        Transcript showCr:('compiled: ',aClass name,' ',compiler selector)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   253
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   254
7ad01559b262 Initial revision
claus
parents:
diff changeset
   255
    ^ newMethod
7ad01559b262 Initial revision
claus
parents:
diff changeset
   256
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   257
15
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   258
!ByteCodeCompiler class methodsFor:'constants'!
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   259
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   260
byteCodeFor:aSymbol
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   261
    "only some exported codes handled here (for BlockNode)"
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   262
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   263
    (aSymbol == #blockRetTop) ifTrue:[^ 6].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   264
    (aSymbol == #push0) ifTrue:[^120].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   265
    (aSymbol == #push1) ifTrue:[^121].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   266
    (aSymbol == #push2) ifTrue:[^139].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   267
    (aSymbol == #pushMinus1) ifTrue:[^122].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   268
    (aSymbol == #pushNil) ifTrue:[^ 10].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   269
    (aSymbol == #pushTrue) ifTrue:[^ 11].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   270
    (aSymbol == #pushFalse) ifTrue:[^ 12].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   271
    (aSymbol == #pushSelf) ifTrue:[^ 15].
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   272
    self error
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   273
! !
992c3d87edbf *** empty log message ***
claus
parents: 13
diff changeset
   274
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   275
!ByteCodeCompiler methodsFor:'accessing'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   276
7ad01559b262 Initial revision
claus
parents:
diff changeset
   277
literalArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
   278
    "return the literal array - only valid after parsing"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   279
7ad01559b262 Initial revision
claus
parents:
diff changeset
   280
    ^ litArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
   281
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   282
7ad01559b262 Initial revision
claus
parents:
diff changeset
   283
code
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   284
    "return the bytecode array - only valid after code-generation"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   285
7ad01559b262 Initial revision
claus
parents:
diff changeset
   286
    ^ code
7ad01559b262 Initial revision
claus
parents:
diff changeset
   287
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   288
7ad01559b262 Initial revision
claus
parents:
diff changeset
   289
maxStackDepth
7ad01559b262 Initial revision
claus
parents:
diff changeset
   290
    "return the stack-need of the method - only valid after code-generation"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   291
7ad01559b262 Initial revision
claus
parents:
diff changeset
   292
    ^ maxStackDepth
7ad01559b262 Initial revision
claus
parents:
diff changeset
   293
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   294
7ad01559b262 Initial revision
claus
parents:
diff changeset
   295
!ByteCodeCompiler methodsFor:'code generation'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   296
7ad01559b262 Initial revision
claus
parents:
diff changeset
   297
genSymbolicCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   298
    "traverse the parse-tree producing symbolicCode - return the codeArray"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   299
7ad01559b262 Initial revision
claus
parents:
diff changeset
   300
    |codeStream thisStatement lastStatement|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   301
7ad01559b262 Initial revision
claus
parents:
diff changeset
   302
    codeStream := WriteStream on:(Array new:100).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   303
    thisStatement := tree.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   304
    [thisStatement notNil] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   305
        lastStatement := thisStatement.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   306
        thisStatement codeForSideEffectOn:codeStream inBlock:nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   307
        thisStatement := thisStatement nextStatement
7ad01559b262 Initial revision
claus
parents:
diff changeset
   308
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   309
    (lastStatement isNil or:[(lastStatement isMemberOf:ReturnNode) not])
7ad01559b262 Initial revision
claus
parents:
diff changeset
   310
    ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   311
        "not a return - add retSelf"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   312
        codeStream nextPut:#retSelf
7ad01559b262 Initial revision
claus
parents:
diff changeset
   313
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   314
    ^ codeStream contents
7ad01559b262 Initial revision
claus
parents:
diff changeset
   315
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   316
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   317
checkForPrimitiveCode:nr
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   318
    "this was added to allow emulation of (some) ST-80
7ad01559b262 Initial revision
claus
parents:
diff changeset
   319
     primitives (to fileIn Remote-Package)"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   320
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   321
    |cls sel|
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   322
19
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   323
    (nr == 75)  ifTrue:[ cls := Object. sel := #identityHash ].
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   324
    (nr == 110) ifTrue:[ cls := Object. sel := #==           ].
84a1ddf215a5 *** empty log message ***
claus
parents: 15
diff changeset
   325
    (nr == 111) ifTrue:[ cls := Object. sel := #class        ].
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   326
    cls notNil ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   327
        ^ (cls compiledMethodAt:sel) code
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   328
    ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   329
    ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   330
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   331
7ad01559b262 Initial revision
claus
parents:
diff changeset
   332
genByteCodeFrom:symbolicCodeArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
   333
    "convert symbolicCode into bytecodes"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   334
7ad01559b262 Initial revision
claus
parents:
diff changeset
   335
    |symIndex    "<SmallInteger>"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   336
     codeSize    "<SmallInteger>"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   337
     symCodeSize "<SmallInteger>"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   338
     index addr
7ad01559b262 Initial revision
claus
parents:
diff changeset
   339
     codeSymbol nargs done
7ad01559b262 Initial revision
claus
parents:
diff changeset
   340
     stackDepth relocInfo level nvars|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   341
7ad01559b262 Initial revision
claus
parents:
diff changeset
   342
    symbolicCodeArray isNil ifTrue:[^ self].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   343
7ad01559b262 Initial revision
claus
parents:
diff changeset
   344
    done := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   345
    symCodeSize := symbolicCodeArray size.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   346
    codeSize := symCodeSize.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   347
7ad01559b262 Initial revision
claus
parents:
diff changeset
   348
    [done] whileFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   349
        litArray := nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   350
        stackDepth := 0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   351
        maxStackDepth := 0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   352
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   353
        code := ByteArray uninitializedNew:codeSize.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   354
        relocInfo := Array new:(codeSize + 1).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   355
        symIndex := 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   356
        codeIndex := 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   357
7ad01559b262 Initial revision
claus
parents:
diff changeset
   358
        [symIndex <= symCodeSize] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   359
            relocInfo at:symIndex put:codeIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   360
7ad01559b262 Initial revision
claus
parents:
diff changeset
   361
            codeSymbol := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   362
            symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   363
            stackDelta := 0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   364
            extra := nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   365
            lineno := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   366
            self appendByteCodeFor:codeSymbol.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   367
            lineno ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   368
                self appendByte:((symbolicCodeArray at:symIndex) min:255).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   369
                symIndex := symIndex + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   370
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   371
            extra notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   372
              (extra == #number) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   373
                index := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   374
                symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   375
                self appendSignedByte:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   376
              ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   377
                (extra == #index) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   378
                  index := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   379
                  symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   380
                  self appendByte:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   381
                ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   382
                  (extra == #lit) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   383
                    index := self addLiteral:(symbolicCodeArray at:symIndex).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   384
                    symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   385
                    self appendByte:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   386
                  ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   387
                    (extra == #speciallit) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   388
                      index := self addLiteral:(symbolicCodeArray at:symIndex).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   389
                      symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   390
                      self appendByte:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   391
                      self appendByte:0.  "space for inline-generation"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   392
                      self appendByte:0.  "space for inline-address"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   393
                      self appendByte:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   394
                      self appendByte:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   395
                      self appendByte:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   396
                      symIndex := symIndex + 5
7ad01559b262 Initial revision
claus
parents:
diff changeset
   397
                    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   398
                      (extra == #offset) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   399
                        relocInfo at:symIndex put:codeIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   400
                        self addReloc:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   401
                        symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   402
                        self appendByte:0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   403
                      ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   404
                        (extra == #indexLevel) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   405
                          index := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   406
                          symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   407
                          self appendByte:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   408
                          level := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   409
                          symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   410
                          self appendByte:level
7ad01559b262 Initial revision
claus
parents:
diff changeset
   411
                        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   412
                          (extra == #offsetNvarNarg) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   413
                            relocInfo at:symIndex put:codeIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   414
                            self addReloc:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   415
                            symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   416
                            self appendByte:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   417
                            nvars := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   418
                            symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   419
                            self appendByte:nvars.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   420
                            level := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   421
                            symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   422
                            self appendByte:level
7ad01559b262 Initial revision
claus
parents:
diff changeset
   423
                          ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   424
                            (extra == #absoffset) ifTrue:[
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   425
                              relocInfo at:symIndex put:codeIndex.
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   426
                              self addReloc:symIndex.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   427
                              addr := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   428
                              symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   429
                              self appendByte:(addr bitAnd:16rFF).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   430
                              self appendByte:((addr bitShift:-8) bitAnd:16rFF).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   431
                            ] ifFalse:[
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   432
                              (extra == #absoffsetNvarNarg) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   433
                                relocInfo at:symIndex put:codeIndex.
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   434
                                self addReloc:symIndex.
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   435
                                addr := symbolicCodeArray at:symIndex.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   436
                                symIndex := symIndex + 1.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   437
                                self appendByte:(addr bitAnd:16rFF).
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   438
                                self appendByte:((addr bitShift:-8) bitAnd:16rFF).
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   439
                                nvars := symbolicCodeArray at:symIndex.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   440
                                symIndex := symIndex + 1.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   441
                                self appendByte:nvars.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   442
                                level := symbolicCodeArray at:symIndex.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   443
                                symIndex := symIndex + 1.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   444
                                self appendByte:level
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   445
                              ] ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   446
                                self error:'compiler botch'
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   447
                              ]
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   448
                            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   449
                          ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   450
                        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   451
                      ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   452
                    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   453
                  ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   454
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   455
              ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   456
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   457
            ((codeSymbol == #send) or:[codeSymbol == #superSend]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   458
              index := self addLiteral:(symbolicCodeArray at:symIndex).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   459
              symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   460
              nargs := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   461
              symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   462
              self appendByte:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   463
              self appendByte:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   464
              (codeSymbol == #superSend) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   465
                  symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   466
                  index := self addLiteral:(classToCompileFor superclass).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   467
                  self appendByte:index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   468
              ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   469
              stackDelta := nargs negated
7ad01559b262 Initial revision
claus
parents:
diff changeset
   470
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   471
              (codeSymbol == #sendDrop) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   472
                  index := self addLiteral:(symbolicCodeArray at:symIndex).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   473
                  symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   474
                  nargs := symbolicCodeArray at:symIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   475
                  symIndex := symIndex + 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   476
                  self appendByte:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   477
                  self appendByte:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   478
                  stackDelta := (nargs + 1) negated
7ad01559b262 Initial revision
claus
parents:
diff changeset
   479
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   480
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   481
            stackDepth := stackDepth + stackDelta.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   482
            (stackDepth > maxStackDepth) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   483
                maxStackDepth := stackDepth
7ad01559b262 Initial revision
claus
parents:
diff changeset
   484
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   485
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   486
        relocInfo at:symIndex put:codeIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   487
7ad01559b262 Initial revision
claus
parents:
diff changeset
   488
        "relocate - returns true if ok, false if we have to rerun"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   489
        done := true.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   490
        relocList notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   491
            done := self relocateWith:symbolicCodeArray relocInfo:relocInfo.
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   492
            "if returned with false, a relative jump was made into
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   493
             an absolute jump - need to start over with one more byte space"
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   494
            done ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   495
                relocList := nil.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   496
                codeSize := codeSize + 1.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   497
            ]
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   498
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   499
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   500
    "code printNewline."
7ad01559b262 Initial revision
claus
parents:
diff changeset
   501
    ^ errorFlag
7ad01559b262 Initial revision
claus
parents:
diff changeset
   502
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   503
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   504
absJumpFromJump:code
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   505
    "given a jump-symbolic code, return corresponding absolute jump"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   506
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   507
    JumpToAbsJump isNil ifTrue:[
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   508
        JumpToAbsJump := IdentityDictionary new.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   509
        JumpToAbsJump at:#jump put:#jumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   510
        JumpToAbsJump at:#trueJump put:#trueJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   511
        JumpToAbsJump at:#falseJump put:#falseJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   512
        JumpToAbsJump at:#nilJump put:#nilJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   513
        JumpToAbsJump at:#notNilJump put:#notNilJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   514
        JumpToAbsJump at:#eqJump put:#eqJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   515
        JumpToAbsJump at:#notEqJump put:#notEqJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   516
        JumpToAbsJump at:#zeroJump put:#zeroJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   517
        JumpToAbsJump at:#notZeroJump put:#notZeroJumpabs.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   518
        JumpToAbsJump at:#makeBlock put:#makeBlockabs.
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   519
    ].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   520
    ^ JumpToAbsJump at:code
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   521
!
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   522
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   523
relocateWith:symbolicCodeArray relocInfo:relocInfo
7ad01559b262 Initial revision
claus
parents:
diff changeset
   524
    "helper for genByteCodeFrom - relocate code using relocInfo.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   525
     if relocation fails badly (due to long relative jumps) patch
7ad01559b262 Initial revision
claus
parents:
diff changeset
   526
     symbolicCode to use absolute jumps instead and return false
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   527
     (genByteCodeFrom will then try again). Otherwise return true.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   528
     Also, on the fly, jumps to jumps and jumps to return are handled."
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   529
7ad01559b262 Initial revision
claus
parents:
diff changeset
   530
    |delta       "<SmallInteger>"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   531
     codePos     "<SmallInteger>"
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   532
     opCodePos   "<SmallInteger>"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   533
     codeOffset  "<SmallInteger>"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   534
     symOffset opcode dstOpcode jumpTarget
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   535
     jumpCode deleteSet|
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   536
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   537
    deleteSet := OrderedCollection new.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   538
    relocList do:[:sIndex |
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   539
        "have to relocate symCode at sIndex ..." 
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   540
        symOffset := symbolicCodeArray at:sIndex.   "the target in the symbolic code"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   541
        codePos := relocInfo at:sIndex.             "position of the offet in byte code"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   542
        codeOffset := relocInfo at:symOffset.       "position of the target in byte code"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   543
        delta := codeOffset - codePos - 1.
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   544
        opCodePos := codePos - 1.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   545
        opcode := code at:opCodePos.
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   546
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   547
        (opcode between:190 and:199) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   548
            "an absolute jump/makeBlock"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   549
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   550
            code at:codePos put:(codeOffset bitAnd:16rFF).
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   551
            code at:(codePos + 1) put:(codeOffset bitShift:-8)
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   552
        ] ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   553
            "get jump-code from long and vlong codes"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   554
            (opcode between:50 and:59) ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   555
                (opcode between:60 and:69) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   556
                    opcode := opcode - 10
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   557
                ] ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   558
                    (opcode between:70 and:79) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   559
                        opcode := opcode - 20
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   560
                    ] ifFalse:[
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   561
                        self error:'invalid code to relocate'
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   562
                    ]
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   563
                ].
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   564
            ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   565
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   566
            "optimize jump to return and jump to jump"
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   567
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   568
            (opcode == 54) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   569
                "a jump"
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   570
                dstOpcode := symbolicCodeArray at:symOffset.
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   571
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   572
                (#(retSelf retTop retNil retTrue retFalse ret0 blockRetTop) includes:dstOpcode) ifTrue:[
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   573
                    "a jump to a return - put in the return instead jump"
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   574
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   575
                    symbolicCodeArray at:(sIndex - 1) put:dstOpcode.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   576
                    symbolicCodeArray at:sIndex put:dstOpcode.
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   577
                    code at:opCodePos put:(self byteCodeFor:dstOpcode).
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   578
                    delta := 0.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   579
                    deleteSet add:sIndex.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   580
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   581
" 
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   582
'jump to return at: ' print. (sIndex - 1) printNewline.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   583
" 
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   584
                ] ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   585
                    (dstOpcode == #jump) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   586
                        "jump to jump to be done soon"
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   587
                        jumpTarget := symbolicCodeArray at:(symOffset + 1).
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   588
" 
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   589
'jump to jump at: ' print. (sIndex - 1) print.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   590
'  newTarget:' print. jumpTarget printNewline.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   591
" 
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   592
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   593
                        symbolicCodeArray at:sIndex put:jumpTarget.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   594
                        symOffset := jumpTarget.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   595
                        codeOffset := relocInfo at:symOffset.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   596
                        delta := codeOffset - codePos - 1.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   597
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   598
                        "continue with new delta"
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   599
                    ]
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   600
                ]
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   601
            ].
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   602
            (#(50 51 52 53 56 57 58 59) includes:opcode) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   603
                "a conditional jump"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   604
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   605
                dstOpcode := symbolicCodeArray at:symOffset.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   606
                (dstOpcode == #jump) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   607
                    "conditional jump to unconditional jump"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   608
                    jumpTarget := symbolicCodeArray at:(symOffset + 1).
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   609
" 
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   610
'cond jump to jump at: ' print. (sIndex - 1) print.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   611
'  newTarget:' print. jumpTarget printNewline.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   612
" 
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   613
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   614
                    symbolicCodeArray at:sIndex put:jumpTarget.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   615
                    symOffset := jumpTarget.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   616
                    codeOffset := relocInfo at:symOffset.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   617
                    delta := codeOffset - codePos - 1.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   618
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   619
                    "continue with new delta"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   620
                ].
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   621
            ].
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   622
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   623
            (delta >= 0) ifTrue:[
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   624
                (delta > 127) ifTrue:[
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   625
                    (opcode between:50 and:59) ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   626
                        self error:'invalid code to relocate'
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   627
                    ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   628
                    (delta > 255) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   629
                        "change jmp into vljmp ..."
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   630
                        code at:opCodePos put:(opcode + 20).
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   631
                        delta := delta - 256 
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   632
                    ] ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   633
                        "change jmp into ljmp ..."
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   634
                        code at:opCodePos put:(opcode + 10).
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   635
                        delta := delta - 128
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   636
                    ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   637
                    (delta > 127) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   638
                        "change symbolic into a jump absolute and fail"
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   639
                        jumpCode := symbolicCodeArray at:(sIndex - 1).
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   640
                        symbolicCodeArray at:(sIndex - 1) put:(self absJumpFromJump:jumpCode).
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   641
                        symbolicCodeArray at:sIndex put:symOffset.
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   642
"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   643
'change short into abs jump' printNewline.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   644
"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   645
                        deleteSet do:[:d | relocList remove:d].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   646
                        ^ false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   647
                    ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   648
                ].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   649
                code at:codePos put:delta
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   650
            ] ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   651
                (delta < -128) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   652
                    (opcode between:50 and:59) ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   653
                        self error:'invalid code to relocate'
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   654
                    ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   655
                    (delta < -256) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   656
                        "change jmp into vljmp ..."
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   657
                        code at:opCodePos put:(opcode + 20).
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   658
                        delta := delta + 256
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   659
                    ] ifFalse:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   660
                        "change jmp into ljmp ..."
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   661
                        code at:opCodePos put:(opcode + 10).
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   662
                        delta := delta + 128
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   663
                    ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   664
                    (delta < -128) ifTrue:[
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   665
                        "change symbolic into a jump absolute and fail"
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   666
                        jumpCode := symbolicCodeArray at:(sIndex - 1).
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   667
                        symbolicCodeArray at:(sIndex - 1) put:(self absJumpFromJump:jumpCode).
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   668
                        symbolicCodeArray at:sIndex put:symOffset.
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   669
"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   670
'change short into abs jump' printNewline.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   671
"
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   672
                        deleteSet do:[:d | relocList remove:d].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   673
                        ^ false
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   674
                    ]
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   675
                ].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   676
                code at:codePos put:(256 + delta)
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   677
            ]
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   678
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   679
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   680
    (errorFlag == #Error) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   681
        self error:'relocation range error'
7ad01559b262 Initial revision
claus
parents:
diff changeset
   682
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   683
    ^ true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   684
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   685
7ad01559b262 Initial revision
claus
parents:
diff changeset
   686
addLiteral:anObject
7ad01559b262 Initial revision
claus
parents:
diff changeset
   687
    "add a literal to the literalArray - watch for and eliminate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   688
     duplicates. return the index of the literal in the Array"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   689
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   690
    |index class|
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   691
7ad01559b262 Initial revision
claus
parents:
diff changeset
   692
    litArray isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   693
        litArray := Array with:anObject.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   694
        ^ 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   695
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   696
    index := litArray identityIndexOf:anObject.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   697
    (index == 0) ifTrue:[
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   698
        class := anObject class.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   699
        ((class == Float) or:[class == Fraction]) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   700
            index := litArray indexOf:anObject.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   701
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   702
        (index == 0) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   703
            litArray := litArray copyWith:anObject.
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   704
            ^ litArray size
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   705
        ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   706
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   707
    ^ index
7ad01559b262 Initial revision
claus
parents:
diff changeset
   708
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   709
7ad01559b262 Initial revision
claus
parents:
diff changeset
   710
appendByteCodeFor:codeSymbol
7ad01559b262 Initial revision
claus
parents:
diff changeset
   711
    "append the byteCode for an instructionSymbol to the code-Array"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   712
7ad01559b262 Initial revision
claus
parents:
diff changeset
   713
    code at:codeIndex put:(self byteCodeFor:codeSymbol).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   714
    codeIndex := codeIndex + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   715
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   716
7ad01559b262 Initial revision
claus
parents:
diff changeset
   717
appendByte:aByte
7ad01559b262 Initial revision
claus
parents:
diff changeset
   718
    "append a byte to the code-Array, checking for byte-range (debug-only)"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   719
7ad01559b262 Initial revision
claus
parents:
diff changeset
   720
    (aByte between:0 and:255) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   721
        code at:codeIndex put:aByte.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   722
        codeIndex := codeIndex + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   723
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   724
        self error:'byte range error'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   725
        errorFlag := #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   726
    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   727
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   728
7ad01559b262 Initial revision
claus
parents:
diff changeset
   729
appendSignedByte:aByte
7ad01559b262 Initial revision
claus
parents:
diff changeset
   730
    "append a signedbyte (as in jump-offsets) to the code-Array,
7ad01559b262 Initial revision
claus
parents:
diff changeset
   731
     check range and report an error if invalid"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   732
7ad01559b262 Initial revision
claus
parents:
diff changeset
   733
    |b "<SmallInteger>" |
7ad01559b262 Initial revision
claus
parents:
diff changeset
   734
7ad01559b262 Initial revision
claus
parents:
diff changeset
   735
    b := aByte.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   736
    (b >= 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   737
        (b > 127) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   738
            self error:'jump-range error'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   739
            errorFlag := #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   740
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   741
        code at:codeIndex put:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   742
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   743
        (b < -128) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   744
            self error:'jump-range error'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   745
            errorFlag := #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   746
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   747
        code at:codeIndex put:(256 + b)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   748
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   749
    codeIndex := codeIndex + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   750
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   751
7ad01559b262 Initial revision
claus
parents:
diff changeset
   752
addReloc:symIndex
7ad01559b262 Initial revision
claus
parents:
diff changeset
   753
    "remember to relocate offset at symIndex later ..."
7ad01559b262 Initial revision
claus
parents:
diff changeset
   754
7ad01559b262 Initial revision
claus
parents:
diff changeset
   755
    relocList isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   756
        relocList := OrderedCollection new.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   757
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   758
    relocList add:symIndex
7ad01559b262 Initial revision
claus
parents:
diff changeset
   759
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   760
7ad01559b262 Initial revision
claus
parents:
diff changeset
   761
byteCodeFor:aSymbol
7ad01559b262 Initial revision
claus
parents:
diff changeset
   762
    "given a symbolic instruction, return the corresponding bytecode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   763
     as a side-effect, leave number of bytes pushed/popped by this instr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   764
     in stackDelta, and, if the instruction needs extra arguments, leave
7ad01559b262 Initial revision
claus
parents:
diff changeset
   765
     this info in extra"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   766
7ad01559b262 Initial revision
claus
parents:
diff changeset
   767
    "standard bytecodes"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   768
7ad01559b262 Initial revision
claus
parents:
diff changeset
   769
    (aSymbol == #pushNil) ifTrue:[stackDelta := 1. ^ 10].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   770
    (aSymbol == #pushTrue) ifTrue:[stackDelta := 1. ^ 11].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   771
    (aSymbol == #pushFalse) ifTrue:[stackDelta := 1. ^ 12].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   772
    (aSymbol == #pushLit) ifTrue:[stackDelta := 1. extra := #lit. ^ 14].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   773
    (aSymbol == #pushSelf) ifTrue:[stackDelta := 1. ^ 15].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   774
    (aSymbol == #pushNum) ifTrue:[stackDelta := 1. extra := #number. ^ 16].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   775
7ad01559b262 Initial revision
claus
parents:
diff changeset
   776
    (aSymbol == #pushMethodArg) ifTrue:[stackDelta := 1. extra := #index. ^ 30].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   777
    (aSymbol == #pushMethodVar) ifTrue:[stackDelta := 1. extra := #index. ^ 31].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   778
    (aSymbol == #pushBlockArg) ifTrue:[stackDelta := 1. extra := #index. ^ 32].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   779
    (aSymbol == #pushBlockVar) ifTrue:[stackDelta := 1. extra := #index. ^ 33].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   780
    (aSymbol == #pushInstVar) ifTrue:[stackDelta := 1. extra := #index. ^ 34].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   781
    (aSymbol == #pushOuterBlockArg) ifTrue:[stackDelta := 1. extra := #indexLevel. ^ 42].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   782
    (aSymbol == #pushOuterBlockVar) ifTrue:[stackDelta := 1. extra := #indexLevel. ^ 128].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   783
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   784
    (aSymbol == #storeMethodVar) ifTrue:[extra := #index. stackDelta := -1. ^ 37].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   785
    (aSymbol == #storeBlockVar) ifTrue:[extra := #index. stackDelta := -1. ^ 38].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   786
    (aSymbol == #storeInstVar) ifTrue:[extra := #index. stackDelta := -1. ^ 39].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   787
7ad01559b262 Initial revision
claus
parents:
diff changeset
   788
    (aSymbol == #retTop) ifTrue:[stackDelta := -1. ^ 0].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   789
    (aSymbol == #blockRetTop) ifTrue:[stackDelta := -1. ^ 6].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   790
7ad01559b262 Initial revision
claus
parents:
diff changeset
   791
    (aSymbol == #retSelf) ifTrue:[^5].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   792
7ad01559b262 Initial revision
claus
parents:
diff changeset
   793
    (aSymbol == #==) ifTrue:[stackDelta := -1. self addLiteral:aSymbol. ^ 45].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   794
    (aSymbol == #~~) ifTrue:[stackDelta := -1. self addLiteral:aSymbol. ^ 46].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   795
7ad01559b262 Initial revision
claus
parents:
diff changeset
   796
    (aSymbol == #falseJump) ifTrue:[stackDelta := -1. extra := #offset. ^ 50].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   797
    (aSymbol == #trueJump) ifTrue:[stackDelta := -1. extra := #offset. ^ 51].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   798
    (aSymbol == #nilJump) ifTrue:[stackDelta := -1. extra := #offset. ^ 52].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   799
    (aSymbol == #notNilJump) ifTrue:[stackDelta := -1. extra := #offset. ^ 53].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   800
    (aSymbol == #jump) ifTrue:[extra := #offset. ^ 54].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   801
    (aSymbol == #makeBlock) ifTrue:[stackDelta := 1. extra := #offsetNvarNarg. ^ 55].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   802
    (aSymbol == #zeroJump) ifTrue:[stackDelta := -1. extra := #offset. ^ 56].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   803
    (aSymbol == #notZeroJump) ifTrue:[stackDelta := -1. extra := #offset. ^ 57].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   804
    (aSymbol == #eqJump) ifTrue:[stackDelta := -2. extra := #offset. ^ 58].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   805
    (aSymbol == #notEqJump) ifTrue:[stackDelta := -2. extra := #offset. ^ 59].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   806
7ad01559b262 Initial revision
claus
parents:
diff changeset
   807
    (aSymbol == #send) ifTrue:[lineno := true. ^ 19].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   808
    (aSymbol == #superSend) ifTrue:[lineno := true. ^ 20].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   809
7ad01559b262 Initial revision
claus
parents:
diff changeset
   810
    (aSymbol == #drop) ifTrue:[stackDelta := -1. ^ 18].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   811
    (aSymbol == #dup) ifTrue:[stackDelta := 1. ^ 47].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   812
7ad01559b262 Initial revision
claus
parents:
diff changeset
   813
    (aSymbol == #pushClassVar) ifTrue:[stackDelta := 1. extra := #speciallit. ^ 35].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   814
    (aSymbol == #pushClassInstVar) ifTrue:[stackDelta := 1. extra := #index. ^ 176].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   815
    (aSymbol == #pushGlobal) ifTrue:[stackDelta := 1. extra := #speciallit. ^ 36].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   816
7ad01559b262 Initial revision
claus
parents:
diff changeset
   817
    (aSymbol == #storeClassVar) ifTrue:[extra := #speciallit.stackDelta := -1. ^ 40].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   818
    (aSymbol == #storeClassInstVar) ifTrue:[extra := #index.stackDelta := -1. ^ 177].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   819
    (aSymbol == #storeGlobal) ifTrue:[extra := #speciallit. stackDelta := -1. ^ 41].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   820
    (aSymbol == #storeOuterBlockVar) ifTrue:[stackDelta := -1. extra := #indexLevel. ^ 129].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   821
7ad01559b262 Initial revision
claus
parents:
diff changeset
   822
    "optimized bytecodes"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   823
7ad01559b262 Initial revision
claus
parents:
diff changeset
   824
    (aSymbol == #retNil) ifTrue:[^ 1].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   825
    (aSymbol == #retTrue) ifTrue:[^ 2].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   826
    (aSymbol == #retFalse) ifTrue:[^ 3].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   827
    (aSymbol == #ret0) ifTrue:[^ 4].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   828
    (aSymbol == #retNum) ifTrue:[extra := #number. ^ 127].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   829
7ad01559b262 Initial revision
claus
parents:
diff changeset
   830
    (aSymbol == #pushChar) ifTrue:[stackDelta := 1. ^17].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   831
    (aSymbol == #push0) ifTrue:[stackDelta := 1. ^120].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   832
    (aSymbol == #push1) ifTrue:[stackDelta := 1. ^121].
3
b63b8a6b71fb *** empty log message ***
claus
parents: 1
diff changeset
   833
    (aSymbol == #push2) ifTrue:[stackDelta := 1. ^139].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   834
    (aSymbol == #pushMinus1) ifTrue:[stackDelta := 1. ^122].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   835
7ad01559b262 Initial revision
claus
parents:
diff changeset
   836
    (aSymbol == #send0) ifTrue:[lineno := true. extra := #lit. ^21].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   837
    (aSymbol == #send1) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^22].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   838
    (aSymbol == #send2) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^23].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   839
    (aSymbol == #send3) ifTrue:[lineno := true. extra := #lit. stackDelta := -3. ^24].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   840
7ad01559b262 Initial revision
claus
parents:
diff changeset
   841
    (aSymbol == #sendSelf0) ifTrue:[lineno := true. extra := #lit. stackDelta := 1. ^180].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   842
    (aSymbol == #sendSelf1) ifTrue:[lineno := true. extra := #lit. ^181].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   843
    (aSymbol == #sendSelf2) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^182].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   844
    (aSymbol == #sendSelf3) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^183].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   845
    (aSymbol == #sendSelfDrop0) ifTrue:[lineno := true. extra := #lit. ^184].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   846
    (aSymbol == #sendSelfDrop1) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^185].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   847
    (aSymbol == #sendSelfDrop2) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^186].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   848
    (aSymbol == #sendSelfDrop3) ifTrue:[lineno := true. extra := #lit. stackDelta := -3. ^187].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   849
7ad01559b262 Initial revision
claus
parents:
diff changeset
   850
    (aSymbol == #sendDrop) ifTrue:[lineno := true. ^25].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   851
    (aSymbol == #sendDrop0) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^26].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   852
    (aSymbol == #sendDrop1) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^27].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   853
    (aSymbol == #sendDrop2) ifTrue:[lineno := true. extra := #lit. stackDelta := -3. ^28].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   854
    (aSymbol == #sendDrop3) ifTrue:[lineno := true. extra := #lit. stackDelta := -4. ^29].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   855
7ad01559b262 Initial revision
claus
parents:
diff changeset
   856
    (aSymbol == #pushMethodVar1) ifTrue:[stackDelta := 1. ^80].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   857
    (aSymbol == #pushMethodVar2) ifTrue:[stackDelta := 1. ^81].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   858
    (aSymbol == #pushMethodVar3) ifTrue:[stackDelta := 1. ^82].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   859
    (aSymbol == #pushMethodVar4) ifTrue:[stackDelta := 1. ^83].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   860
    (aSymbol == #pushMethodVar5) ifTrue:[stackDelta := 1. ^84].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   861
    (aSymbol == #pushMethodVar6) ifTrue:[stackDelta := 1. ^85].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   862
7ad01559b262 Initial revision
claus
parents:
diff changeset
   863
    (aSymbol == #pushMethodArg1) ifTrue:[stackDelta := 1. ^86].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   864
    (aSymbol == #pushMethodArg2) ifTrue:[stackDelta := 1. ^87].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   865
    (aSymbol == #pushMethodArg3) ifTrue:[stackDelta := 1. ^88].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   866
    (aSymbol == #pushMethodArg4) ifTrue:[stackDelta := 1. ^89].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   867
7ad01559b262 Initial revision
claus
parents:
diff changeset
   868
    (aSymbol == #pushInstVar1) ifTrue:[stackDelta := 1. ^90].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   869
    (aSymbol == #pushInstVar2) ifTrue:[stackDelta := 1. ^91].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   870
    (aSymbol == #pushInstVar3) ifTrue:[stackDelta := 1. ^92].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   871
    (aSymbol == #pushInstVar4) ifTrue:[stackDelta := 1. ^93].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   872
    (aSymbol == #pushInstVar5) ifTrue:[stackDelta := 1. ^94].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   873
    (aSymbol == #pushInstVar6) ifTrue:[stackDelta := 1. ^95].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   874
    (aSymbol == #pushInstVar7) ifTrue:[stackDelta := 1. ^96].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   875
    (aSymbol == #pushInstVar8) ifTrue:[stackDelta := 1. ^97].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   876
    (aSymbol == #pushInstVar9) ifTrue:[stackDelta := 1. ^98].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   877
    (aSymbol == #pushInstVar10) ifTrue:[stackDelta := 1. ^99].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   878
7ad01559b262 Initial revision
claus
parents:
diff changeset
   879
    (aSymbol == #storeMethodVar1) ifTrue:[stackDelta := -1. ^100].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   880
    (aSymbol == #storeMethodVar2) ifTrue:[stackDelta := -1. ^101].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   881
    (aSymbol == #storeMethodVar3) ifTrue:[stackDelta := -1. ^102].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   882
    (aSymbol == #storeMethodVar4) ifTrue:[stackDelta := -1. ^103].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   883
    (aSymbol == #storeMethodVar5) ifTrue:[stackDelta := -1. ^104].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   884
    (aSymbol == #storeMethodVar6) ifTrue:[stackDelta := -1. ^105].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   885
7ad01559b262 Initial revision
claus
parents:
diff changeset
   886
    (aSymbol == #storeInstVar1) ifTrue:[stackDelta := -1. ^110].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   887
    (aSymbol == #storeInstVar2) ifTrue:[stackDelta := -1. ^111].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   888
    (aSymbol == #storeInstVar3) ifTrue:[stackDelta := -1. ^112].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   889
    (aSymbol == #storeInstVar4) ifTrue:[stackDelta := -1. ^113].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   890
    (aSymbol == #storeInstVar5) ifTrue:[stackDelta := -1. ^114].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   891
    (aSymbol == #storeInstVar6) ifTrue:[stackDelta := -1. ^115].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   892
    (aSymbol == #storeInstVar7) ifTrue:[stackDelta := -1. ^116].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   893
    (aSymbol == #storeInstVar8) ifTrue:[stackDelta := -1. ^117].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   894
    (aSymbol == #storeInstVar9) ifTrue:[stackDelta := -1. ^118].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   895
    (aSymbol == #storeInstVar10) ifTrue:[stackDelta := -1. ^119].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   896
7ad01559b262 Initial revision
claus
parents:
diff changeset
   897
    (aSymbol == #retMethodVar1) ifTrue:[^160].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   898
    (aSymbol == #retMethodVar2) ifTrue:[^161].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   899
    (aSymbol == #retMethodVar3) ifTrue:[^162].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   900
    (aSymbol == #retMethodVar4) ifTrue:[^163].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   901
    (aSymbol == #retMethodVar5) ifTrue:[^164].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   902
    (aSymbol == #retMethodVar6) ifTrue:[^165].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   903
7ad01559b262 Initial revision
claus
parents:
diff changeset
   904
    (aSymbol == #retInstVar1) ifTrue:[^166].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   905
    (aSymbol == #retInstVar2) ifTrue:[^167].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   906
    (aSymbol == #retInstVar3) ifTrue:[^168].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   907
    (aSymbol == #retInstVar4) ifTrue:[^169].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   908
    (aSymbol == #retInstVar5) ifTrue:[^170].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   909
    (aSymbol == #retInstVar6) ifTrue:[^171].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   910
    (aSymbol == #retInstVar7) ifTrue:[^172].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   911
    (aSymbol == #retInstVar8) ifTrue:[^173].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   912
7ad01559b262 Initial revision
claus
parents:
diff changeset
   913
    (aSymbol == #retMethodArg1) ifTrue:[^174].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   914
    (aSymbol == #retMethodArg2) ifTrue:[^175].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   915
7ad01559b262 Initial revision
claus
parents:
diff changeset
   916
    (aSymbol == #pushBlockArg1) ifTrue:[stackDelta := 1. ^140].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   917
    (aSymbol == #pushBlockArg2) ifTrue:[stackDelta := 1. ^141].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   918
    (aSymbol == #pushBlockArg3) ifTrue:[stackDelta := 1. ^142].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   919
    (aSymbol == #pushBlockArg4) ifTrue:[stackDelta := 1. ^143].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   920
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   921
    (aSymbol == #pushOuter1BlockArg) ifTrue:[stackDelta := 1. extra := #index. ^ 43].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   922
    (aSymbol == #pushOuter2BlockArg) ifTrue:[stackDelta := 1. extra := #index. ^ 44].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   923
5
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   924
    (aSymbol == #=) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^130].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   925
    (aSymbol == #+) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^131].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   926
    (aSymbol == #~=) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^132].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   927
    (aSymbol == #-) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^133].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   928
    (aSymbol == #class) ifTrue:[self addLiteral:aSymbol. ^134].
5
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   929
    (aSymbol == #x) ifTrue:[lineno := true. self addLiteral:aSymbol. ^106].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   930
    (aSymbol == #y) ifTrue:[lineno := true. self addLiteral:aSymbol. ^107].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   931
    (aSymbol == #width) ifTrue:[lineno := true. self addLiteral:aSymbol. ^108].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   932
    (aSymbol == #height) ifTrue:[lineno := true. self addLiteral:aSymbol. ^109].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   933
    (aSymbol == #origin) ifTrue:[lineno := true. self addLiteral:aSymbol. ^154].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   934
    (aSymbol == #extent) ifTrue:[lineno := true. self addLiteral:aSymbol. ^155].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   935
    (aSymbol == #at:) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^135].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   936
    (aSymbol == #at:put:)ifTrue:[lineno := true. stackDelta := -2. self addLiteral:aSymbol. ^136].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   937
    (aSymbol == #bitAnd:) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^137].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   938
    (aSymbol == #bitOr:) ifTrue:[lineno := true. stackDelta := -1. self addLiteral:aSymbol. ^138].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   939
    (aSymbol == #plus1) ifTrue:[lineno := true. self addLiteral:#+. ^123].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   940
    (aSymbol == #minus1) ifTrue:[lineno := true. self addLiteral:#-. ^124].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   941
5
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   942
    (aSymbol == #incMethodVar) ifTrue:[lineno := true. self addLiteral:#+. extra := #index. ^125].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   943
    (aSymbol == #decMethodVar) ifTrue:[lineno := true. self addLiteral:#-. extra := #index. ^126].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   944
7ad01559b262 Initial revision
claus
parents:
diff changeset
   945
    (aSymbol == #eq0) ifTrue:[self addLiteral:#==. ^48].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   946
    (aSymbol == #ne0) ifTrue:[self addLiteral:#~~. ^49].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   947
5
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   948
    (aSymbol == #>) ifTrue:[lineno := true. self addLiteral:aSymbol. stackDelta := -1. ^ 145].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   949
    (aSymbol == #>=) ifTrue:[lineno := true. self addLiteral:aSymbol. stackDelta := -1. ^ 146].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   950
    (aSymbol == #<) ifTrue:[lineno := true. self addLiteral:aSymbol. stackDelta := -1. ^ 147].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   951
    (aSymbol == #<=) ifTrue:[lineno := true. self addLiteral:aSymbol. stackDelta := -1. ^ 148].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   952
    (aSymbol == #next) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 149].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   953
    (aSymbol == #peek) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 150].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   954
    (aSymbol == #value) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 151].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   955
    (aSymbol == #value:) ifTrue:[lineno := true. self addLiteral:aSymbol.  stackDelta := -1. ^ 152].
6
0cd4e7480440 *** empty log message ***
claus
parents: 5
diff changeset
   956
    (aSymbol == #value:value:) ifTrue:[lineno := true. self addLiteral:aSymbol.  stackDelta := -2. ^ 178].
5
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   957
    (aSymbol == #size) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 153].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   958
    (aSymbol == #asInteger) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 158].
020d67cc590e *** empty log message ***
claus
parents: 4
diff changeset
   959
    (aSymbol == #rounded) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 159].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   960
    (aSymbol == #mk0Block) ifTrue:[^ 156].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   961
    (aSymbol == #mkNilBlock) ifTrue:[^ 157].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   962
7ad01559b262 Initial revision
claus
parents:
diff changeset
   963
    (aSymbol == #falseJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 190].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   964
    (aSymbol == #trueJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 191].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   965
    (aSymbol == #nilJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 192].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   966
    (aSymbol == #notNilJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 193].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   967
    (aSymbol == #jumpabs) ifTrue:[extra := #absoffset. ^ 194].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   968
    (aSymbol == #makeBlockabs) ifTrue:[stackDelta := 1. extra := #absoffsetNvarNarg. ^ 195].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   969
    (aSymbol == #zeroJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 196].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   970
    (aSymbol == #notZeroJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 197].
1
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   971
    (aSymbol == #eqJumpabs) ifTrue:[stackDelta := -2. extra := #absoffset. ^ 198].
77da9f5728e5 *** empty log message ***
claus
parents: 0
diff changeset
   972
    (aSymbol == #notEqJumpabs) ifTrue:[stackDelta := -2. extra := #absoffset. ^ 199].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   973
7ad01559b262 Initial revision
claus
parents:
diff changeset
   974
    (aSymbol == #pushThisContext) ifTrue:[stackDelta := 1. ^ 144].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   975
7ad01559b262 Initial revision
claus
parents:
diff changeset
   976
    self error:'invalid code symbol'.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   977
    errorFlag := #Error
7ad01559b262 Initial revision
claus
parents:
diff changeset
   978
! !