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