MessageNode.st
author claus
Wed, 12 Jan 1994 21:20:41 +0100
changeset 12 80f627afdd4e
parent 6 0cd4e7480440
child 13 30e69e21d1d1
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
ParseNode subclass:#MessageNode
7ad01559b262 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'receiver selector argArray lineNr'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
7ad01559b262 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
7ad01559b262 Initial revision
claus
parents:
diff changeset
    17
       category:'System-Compiler-Support'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    18
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    19
7ad01559b262 Initial revision
claus
parents:
diff changeset
    20
MessageNode comment:'
4
f6fd83437415 *** empty log message ***
claus
parents: 3
diff changeset
    21
COPYRIGHT (c) 1989 by Claus Gittinger
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    22
              All Rights Reserved
7ad01559b262 Initial revision
claus
parents:
diff changeset
    23
12
80f627afdd4e *** empty log message ***
claus
parents: 6
diff changeset
    24
$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.5 1994-01-12 20:20:41 claus Exp $
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    25
'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    26
7ad01559b262 Initial revision
claus
parents:
diff changeset
    27
!MessageNode class methodsFor:'instance creation'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    28
7ad01559b262 Initial revision
claus
parents:
diff changeset
    29
receiver:recNode selector:selectorString 
7ad01559b262 Initial revision
claus
parents:
diff changeset
    30
    ^ (self basicNew) receiver:recNode selector:selectorString args:nil lineno:0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    31
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    32
7ad01559b262 Initial revision
claus
parents:
diff changeset
    33
receiver:recNode selector:selectorString arg:argNode
7ad01559b262 Initial revision
claus
parents:
diff changeset
    34
    ^ self receiver:recNode selector:selectorString arg:argNode fold:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
    35
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    36
7ad01559b262 Initial revision
claus
parents:
diff changeset
    37
receiver:recNode selector:selectorString arg:argNode fold:folding
7ad01559b262 Initial revision
claus
parents:
diff changeset
    38
    |result recVal argVal selector|
7ad01559b262 Initial revision
claus
parents:
diff changeset
    39
7ad01559b262 Initial revision
claus
parents:
diff changeset
    40
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
    41
    The constant folding code can usually not optimize things - this may change
7ad01559b262 Initial revision
claus
parents:
diff changeset
    42
    when some kind of constant declaration is added to smalltalk.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    43
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
    44
    folding ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    45
        "do constant folding ..."
7ad01559b262 Initial revision
claus
parents:
diff changeset
    46
        (recNode isConstant and:[argNode isConstant]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    47
            "check if we can do it ..."
7ad01559b262 Initial revision
claus
parents:
diff changeset
    48
            selectorString knownAsSymbol ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    49
                (recNode respondsTo:selectorString asSymbol) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    50
                    "we could do much more here - but then, we need a dependency from
7ad01559b262 Initial revision
claus
parents:
diff changeset
    51
                     the folded selectors method to the method we generate code for ...
7ad01559b262 Initial revision
claus
parents:
diff changeset
    52
                     limit optimizations to those that will never change
7ad01559b262 Initial revision
claus
parents:
diff changeset
    53
                     (or - if you change them - you will crash so bad ...)
7ad01559b262 Initial revision
claus
parents:
diff changeset
    54
                    "
7ad01559b262 Initial revision
claus
parents:
diff changeset
    55
                    selector := selectorString asSymbol.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    56
                    recVal := recNode evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    57
                    argVal := argNode evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    58
                    (recVal respondsToArithmetic and:[argVal respondsToArithmetic]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    59
                        (#( @ + - * / // \\ min: max:) includes:selector) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    60
                            (#( / // \\ ) includes:selector) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    61
                                argVal = 0 ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    62
                                    ^ 'division by zero'
7ad01559b262 Initial revision
claus
parents:
diff changeset
    63
                                ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
    64
                            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
    65
                            result := recVal perform:selector with:argVal.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    66
                            ^ ConstantNode type:(ConstantNode typeOfConstant:result)
7ad01559b262 Initial revision
claus
parents:
diff changeset
    67
                                          value:result
7ad01559b262 Initial revision
claus
parents:
diff changeset
    68
                        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    69
                    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
    70
                    (recVal isMemberOf:String) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    71
                        argVal respondsToArithmetic ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    72
                            (selector == #at:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    73
                                result := recVal perform:selector with:argVal.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    74
                                ^ ConstantNode type:(ConstantNode typeOfConstant:result)
7ad01559b262 Initial revision
claus
parents:
diff changeset
    75
                                              value:result
7ad01559b262 Initial revision
claus
parents:
diff changeset
    76
                            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    77
                        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
    78
                        (argVal isMemberOf:String) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    79
                            (selector == #',') ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    80
                                result := recVal perform:selector with:argVal.
7ad01559b262 Initial revision
claus
parents:
diff changeset
    81
                                ^ ConstantNode type:(ConstantNode typeOfConstant:result)
7ad01559b262 Initial revision
claus
parents:
diff changeset
    82
                                              value:result
7ad01559b262 Initial revision
claus
parents:
diff changeset
    83
                            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    84
                        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    85
                    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    86
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    87
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    88
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
    89
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
    90
    ^ (self basicNew) receiver:recNode selector:selectorString args:(Array with:argNode) lineno:0
7ad01559b262 Initial revision
claus
parents:
diff changeset
    91
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    92
7ad01559b262 Initial revision
claus
parents:
diff changeset
    93
receiver:recNode selector:selectorString args:anArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
    94
    ^ self receiver:recNode selector:selectorString args:anArray fold:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
    95
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
    96
7ad01559b262 Initial revision
claus
parents:
diff changeset
    97
receiver:recNode selector:selectorString args:argArray fold:folding
7ad01559b262 Initial revision
claus
parents:
diff changeset
    98
    (argArray size == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
    99
        ^ self receiver:recNode selector:selectorString arg:(argArray at:1) fold:folding
7ad01559b262 Initial revision
claus
parents:
diff changeset
   100
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   101
    ^ (self basicNew) receiver:recNode selector:selectorString args:argArray lineno:0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   102
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   103
7ad01559b262 Initial revision
claus
parents:
diff changeset
   104
!MessageNode methodsFor:'accessing'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   105
7ad01559b262 Initial revision
claus
parents:
diff changeset
   106
receiver:r selector:s args:a lineno:l
7ad01559b262 Initial revision
claus
parents:
diff changeset
   107
    receiver := r.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   108
    selector := s asSymbol.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   109
    argArray := a.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   110
    lineNr := l
7ad01559b262 Initial revision
claus
parents:
diff changeset
   111
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   112
7ad01559b262 Initial revision
claus
parents:
diff changeset
   113
receiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   114
    ^ receiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   115
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   116
7ad01559b262 Initial revision
claus
parents:
diff changeset
   117
selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   118
    ^ selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   119
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   120
7ad01559b262 Initial revision
claus
parents:
diff changeset
   121
args
7ad01559b262 Initial revision
claus
parents:
diff changeset
   122
    ^ argArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
   123
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   124
7ad01559b262 Initial revision
claus
parents:
diff changeset
   125
arg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   126
    ^ argArray at:1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   127
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   128
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   129
lineNumber
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   130
     ^ lineNr
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   131
!
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   132
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   133
lineNumber:num
7ad01559b262 Initial revision
claus
parents:
diff changeset
   134
     lineNr := num
7ad01559b262 Initial revision
claus
parents:
diff changeset
   135
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   136
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   137
!MessageNode methodsFor:'queries'!
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   138
7ad01559b262 Initial revision
claus
parents:
diff changeset
   139
isMessage
7ad01559b262 Initial revision
claus
parents:
diff changeset
   140
    ^ true
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   141
! !
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   142
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   143
!MessageNode class methodsFor:'queries'!
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   144
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   145
hasLineNumber:sel
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   146
    "return true, if special send code needs lineNr"
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   147
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   148
    (sel == #==) ifTrue:[^ false].
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   149
    (sel == #~~) ifTrue:[^ false].
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   150
    (sel == #class) ifTrue:[^ false].
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   151
    ^ true
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   152
!
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   153
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   154
isBuiltInUnarySelector:sel
7ad01559b262 Initial revision
claus
parents:
diff changeset
   155
    "return true, if unary selector sel is built in"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   156
7ad01559b262 Initial revision
claus
parents:
diff changeset
   157
    (sel == #peek) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   158
    (sel == #value) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   159
    (sel == #next) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   160
    (sel == #class) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   161
    (sel == #size) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   162
    (sel == #x) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   163
    (sel == #y) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   164
    (sel == #width) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   165
    (sel == #height) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   166
    (sel == #origin) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   167
    (sel == #extent) ifTrue:[^ true].
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   168
    (sel == #asInteger) ifTrue:[^ true].
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   169
    (sel == #rounded) ifTrue:[^ true].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   170
    ^ false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   171
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   172
7ad01559b262 Initial revision
claus
parents:
diff changeset
   173
isBuiltIn1ArgSelector:sel
7ad01559b262 Initial revision
claus
parents:
diff changeset
   174
    "return true, if selector sel is built in"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   175
7ad01559b262 Initial revision
claus
parents:
diff changeset
   176
    (sel == #at:) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   177
    (sel == #value:) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   178
    (sel == #bitAnd:) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   179
    (sel == #bitOr:) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   180
    ^ false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   181
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   182
7ad01559b262 Initial revision
claus
parents:
diff changeset
   183
isBuiltIn2ArgSelector:sel
7ad01559b262 Initial revision
claus
parents:
diff changeset
   184
    "return true, if selector sel is built in"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   185
7ad01559b262 Initial revision
claus
parents:
diff changeset
   186
    (sel == #at:put:) ifTrue:[^ true].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   187
    ^ false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   188
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   189
7ad01559b262 Initial revision
claus
parents:
diff changeset
   190
!MessageNode methodsFor:'printing'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   191
7ad01559b262 Initial revision
claus
parents:
diff changeset
   192
printOn:aStream indent:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
   193
    |needParen selectorParts index index2 arg|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   194
7ad01559b262 Initial revision
claus
parents:
diff changeset
   195
    (#(whileTrue: whileFalse:) includes:selector) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   196
        (receiver isKindOf:BlockNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   197
            ^ self printWhileOn:aStream indent:i
7ad01559b262 Initial revision
claus
parents:
diff changeset
   198
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   199
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   200
7ad01559b262 Initial revision
claus
parents:
diff changeset
   201
    index := 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   202
    selectorParts := OrderedCollection new.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   203
    [index == 0] whileFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   204
        index2 := selector indexOf:$: startingAt:index.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   205
        index2 ~~ 0 ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   206
            selectorParts add:(selector copyFrom:index to:index2).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   207
            index2 := index2 + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   208
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   209
        index := index2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   210
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   211
7ad01559b262 Initial revision
claus
parents:
diff changeset
   212
    needParen := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   213
    receiver isMessage ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   214
        receiver isUnaryMessage ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   215
            receiver isBinaryMessage ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   216
                needParen := true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   217
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   218
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   219
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   220
    needParen ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   221
        aStream nextPutAll:'('
7ad01559b262 Initial revision
claus
parents:
diff changeset
   222
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   223
    receiver printOn:aStream indent:i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   224
    needParen ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   225
        aStream nextPutAll:')'
7ad01559b262 Initial revision
claus
parents:
diff changeset
   226
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   227
7ad01559b262 Initial revision
claus
parents:
diff changeset
   228
    1 to:(argArray size) do:[:argIndex |
7ad01559b262 Initial revision
claus
parents:
diff changeset
   229
        aStream space.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   230
        (selectorParts at:argIndex) printOn:aStream.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   231
        aStream space.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   232
        arg := argArray at:argIndex.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   233
        needParen := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   234
        arg isMessage ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   235
            arg isBinaryMessage ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   236
                arg isUnaryMessage ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   237
                    needParen := true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   238
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   239
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   240
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   241
        needParen ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   242
            aStream nextPutAll:'('
7ad01559b262 Initial revision
claus
parents:
diff changeset
   243
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   244
        arg printOn:aStream indent:i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   245
        needParen ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   246
            aStream nextPutAll:') '
7ad01559b262 Initial revision
claus
parents:
diff changeset
   247
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   248
    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   249
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   250
7ad01559b262 Initial revision
claus
parents:
diff changeset
   251
printWhileOn:aStream indent:i
12
80f627afdd4e *** empty log message ***
claus
parents: 6
diff changeset
   252
    |needParen arg|
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   253
7ad01559b262 Initial revision
claus
parents:
diff changeset
   254
    "special handling of whileTrue/whileFalse"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   255
7ad01559b262 Initial revision
claus
parents:
diff changeset
   256
    aStream nextPutAll:'['.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   257
    receiver statements printOn:aStream indent:i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   258
    aStream nextPutAll:'] whileTrue: '.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   259
7ad01559b262 Initial revision
claus
parents:
diff changeset
   260
    arg := argArray at:1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   261
    needParen := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   262
    arg isMessage ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   263
        arg isBinaryMessage ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   264
            arg isUnaryMessage ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   265
                needParen := true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   266
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   267
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   268
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   269
    needParen ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   270
        aStream nextPutAll:'('
7ad01559b262 Initial revision
claus
parents:
diff changeset
   271
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   272
    arg printOn:aStream indent:i.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   273
    needParen ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   274
        aStream nextPutAll:') '
7ad01559b262 Initial revision
claus
parents:
diff changeset
   275
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   276
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   277
7ad01559b262 Initial revision
claus
parents:
diff changeset
   278
!MessageNode methodsFor:'checks'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   279
7ad01559b262 Initial revision
claus
parents:
diff changeset
   280
plausibilityCheck
7ad01559b262 Initial revision
claus
parents:
diff changeset
   281
    |rec arg operand|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   282
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   283
    "
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   284
     it once took me almost an hour, to find a '==' which
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   285
     should have been an '=' (you cannot compare floats with ==)
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   286
     (well, I saw it 50 times but didn't think about it ...).
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   287
     reason enough to add this check here.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   288
    "
7ad01559b262 Initial revision
claus
parents:
diff changeset
   289
    ((selector == #==) or:[selector == #~~]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   290
        receiver isConstant ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   291
            rec := receiver evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   292
            ((rec isMemberOf:String) or:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   293
             (rec isMemberOf:Float) or:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   294
             (rec isMemberOf:Fraction)]]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   295
                operand := rec
7ad01559b262 Initial revision
claus
parents:
diff changeset
   296
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   297
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   298
        (argArray at:1) isConstant ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   299
            arg := (argArray at:1) evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   300
            ((arg isMemberOf:String) or:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   301
             (arg isMemberOf:Float) or:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   302
             (arg isMemberOf:Fraction)]]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   303
                operand := arg
7ad01559b262 Initial revision
claus
parents:
diff changeset
   304
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   305
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   306
        operand notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   307
            (selector == #==) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   308
                ^ 'identity compare is unsafe here'
7ad01559b262 Initial revision
claus
parents:
diff changeset
   309
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   310
            ^ 'identity compare will usually return true here'
7ad01559b262 Initial revision
claus
parents:
diff changeset
   311
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   312
    ].
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   313
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   314
    "
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   315
     an error often occuring when you are a beginner ...
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   316
    "
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   317
    ((selector == #ifTrue:) or:[selector == #ifFalse:]) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   318
        receiver isBlock ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   319
            (Block canUnderstand:selector) ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   320
                ^ 'blocks usually do not respond to ' , selector , ' messages'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   321
            ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   322
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   323
        (argArray at:1) isBlock ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   324
            ^ 'will fail at runtime, if argument to ' , selector , ' does not evaluate to a block'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   325
        ]
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   326
    ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   327
    ((selector == #ifTrue:ifFalse) or:[selector == #ifFalse:ifTrue]) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   328
        receiver isBlock ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   329
            (Block canUnderstand:selector) ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   330
                ^ 'blocks usually do not respond to ' , selector , ' messages'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   331
            ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   332
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   333
        (argArray at:1) isBlock ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   334
            ^ 'will fail at runtime, if 1st. argument to ' , selector , ' does not evaluate to a block'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   335
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   336
        (argArray at:2) isBlock ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   337
            ^ 'will fail at runtime, if 2nd. argument to ' , selector , ' does not evaluate to a block'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   338
        ]
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   339
    ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   340
    ((selector == #whileTrue:) or:[selector == #whileFalse:]) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   341
        receiver isBlock ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   342
            ^ 'will fail at runtime, if receiver of ' , selector , ' does not evaluate to a block'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   343
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   344
        (argArray at:1) isBlock ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   345
            ^ 'will fail at runtime, if argument to ' , selector , ' does not evaluate to a block'
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   346
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   347
    ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   348
    ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   349
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   350
7ad01559b262 Initial revision
claus
parents:
diff changeset
   351
!MessageNode methodsFor:'evaluating'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   352
7ad01559b262 Initial revision
claus
parents:
diff changeset
   353
evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   354
    |r nargs argValueArray index|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   355
7ad01559b262 Initial revision
claus
parents:
diff changeset
   356
    argArray isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   357
        ^ (receiver evaluate) perform:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   358
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   359
    nargs := argArray size.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   360
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   361
        ^ (receiver evaluate) perform:selector with:(argArray at:1) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   362
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   363
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   364
        ^ (receiver evaluate) perform:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   365
                                 with:(argArray at:1) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   366
                                 with:(argArray at:2) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   367
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   368
    (nargs == 3) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   369
        ^ (receiver evaluate) perform:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   370
                                 with:(argArray at:1) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   371
                                 with:(argArray at:2) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   372
                                 with:(argArray at:3) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   373
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   374
    r := receiver evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   375
    argValueArray := Array new:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   376
    index := 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   377
    [index <= nargs] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   378
        argValueArray at:index put:((argArray at:index) evaluate).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   379
        index := index + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   380
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   381
    ^ r perform:selector withArguments:argValueArray
7ad01559b262 Initial revision
claus
parents:
diff changeset
   382
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   383
7ad01559b262 Initial revision
claus
parents:
diff changeset
   384
evaluateForCascade
7ad01559b262 Initial revision
claus
parents:
diff changeset
   385
    |r nargs argValueArray index|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   386
7ad01559b262 Initial revision
claus
parents:
diff changeset
   387
    r := receiver evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   388
    argArray isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   389
        r perform:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   390
        ^ r
7ad01559b262 Initial revision
claus
parents:
diff changeset
   391
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   392
    nargs := argArray size.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   393
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   394
        r perform:selector with:(argArray at:1) evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   395
        ^ r
7ad01559b262 Initial revision
claus
parents:
diff changeset
   396
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   397
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   398
        r perform:selector with:(argArray at:1) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   399
                           with:(argArray at:2) evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   400
        ^ r
7ad01559b262 Initial revision
claus
parents:
diff changeset
   401
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   402
    (nargs == 3) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   403
        r perform:selector with:(argArray at:1) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   404
                           with:(argArray at:2) evaluate
7ad01559b262 Initial revision
claus
parents:
diff changeset
   405
                           with:(argArray at:3) evaluate.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   406
        ^ r
7ad01559b262 Initial revision
claus
parents:
diff changeset
   407
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   408
    argValueArray := Array new:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   409
    index := 1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   410
    [index <= nargs] whileTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   411
        argValueArray at:index put:((argArray at:index) evaluate).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   412
        index := index + 1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   413
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   414
    r perform:selector withArguments:argValueArray.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   415
    ^ r
7ad01559b262 Initial revision
claus
parents:
diff changeset
   416
! !
7ad01559b262 Initial revision
claus
parents:
diff changeset
   417
7ad01559b262 Initial revision
claus
parents:
diff changeset
   418
!MessageNode methodsFor:'code generation'!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   419
7ad01559b262 Initial revision
claus
parents:
diff changeset
   420
codeForSideEffectOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   421
    self codeOn:aStream inBlock:b valueNeeded:false
7ad01559b262 Initial revision
claus
parents:
diff changeset
   422
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   423
7ad01559b262 Initial revision
claus
parents:
diff changeset
   424
codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   425
    self codeOn:aStream inBlock:b valueNeeded:true
7ad01559b262 Initial revision
claus
parents:
diff changeset
   426
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   427
7ad01559b262 Initial revision
claus
parents:
diff changeset
   428
optimizedConditionFor:aReceiver with:aByteCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   429
    |rec sel|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   430
7ad01559b262 Initial revision
claus
parents:
diff changeset
   431
    rec := aReceiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   432
    (rec class == BlockNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   433
        rec statements nextStatement isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   434
            rec := rec statements expression
7ad01559b262 Initial revision
claus
parents:
diff changeset
   435
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   436
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   437
    (rec class == UnaryNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   438
        sel := rec selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   439
        (sel == #isNil) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   440
            (aByteCode == #trueJump) ifTrue:[^ #nilJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   441
            (aByteCode == #falseJump) ifTrue:[^ #notNilJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   442
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   443
        (sel == #notNil) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   444
            (aByteCode == #trueJump) ifTrue:[^ #notNilJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   445
            (aByteCode == #falseJump) ifTrue:[^ #nilJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   446
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   447
        (sel == #not) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   448
            (aByteCode == #trueJump) ifTrue:[^ #falseJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   449
            (aByteCode == #falseJump) ifTrue:[^ #trueJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   450
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   451
        ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   452
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   453
    (rec class == BinaryNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   454
        sel := rec selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   455
        rec arg1 isConstant ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   456
            (rec arg1 value == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   457
                (sel == #==) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   458
                    (aByteCode == #trueJump) ifTrue:[^ #zeroJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   459
                    (aByteCode == #falseJump) ifTrue:[^ #notZeroJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   460
                ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   461
                (sel == #~~) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   462
                    (aByteCode == #falseJump) ifTrue:[^ #zeroJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   463
                    (aByteCode == #trueJump) ifTrue:[^ #notZeroJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   464
                ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   465
                ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   466
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   467
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   468
        (sel == #==) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   469
            (aByteCode == #trueJump) ifTrue:[^ #eqJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   470
            (aByteCode == #falseJump) ifTrue:[^ #notEqJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   471
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   472
        (sel == #~~) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   473
            (aByteCode == #falseJump) ifTrue:[^ #eqJump].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   474
            (aByteCode == #trueJump) ifTrue:[^ #notEqJump]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   475
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   476
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   477
    ^ nil
7ad01559b262 Initial revision
claus
parents:
diff changeset
   478
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   479
7ad01559b262 Initial revision
claus
parents:
diff changeset
   480
codeWhileOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   481
    "generate code for [...] whilexxx:[ ... ]"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   482
7ad01559b262 Initial revision
claus
parents:
diff changeset
   483
    |pos pos2 theReceiver theArg theByteCode optByteCode|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   484
7ad01559b262 Initial revision
claus
parents:
diff changeset
   485
    (selector == #whileTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   486
        theByteCode := #falseJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   487
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   488
        theByteCode := #trueJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   489
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   490
7ad01559b262 Initial revision
claus
parents:
diff changeset
   491
    theReceiver := receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   492
    optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   493
    optByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   494
        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   495
            theArg := receiver statements expression arg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   496
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   497
        theReceiver := receiver statements expression receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   498
        theByteCode := optByteCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   499
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   500
7ad01559b262 Initial revision
claus
parents:
diff changeset
   501
    valueNeeded ifTrue:[aStream nextPut:#pushNil].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   502
    pos := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   503
    optByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   504
        theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   505
        theArg notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   506
            theArg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   507
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   508
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   509
        theReceiver codeInlineOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   510
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   511
    aStream nextPut:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   512
    pos2 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   513
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   514
    valueNeeded ifTrue:[aStream nextPut:#drop].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   515
    (argArray at:1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   516
    aStream nextPut:#jump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   517
    aStream nextPut:pos.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   518
    (aStream contents) at:pos2 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   519
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   520
7ad01559b262 Initial revision
claus
parents:
diff changeset
   521
codeTimesRepeatOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   522
    "generate code for n timesRepeat:[ ... ]"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   523
12
80f627afdd4e *** empty log message ***
claus
parents: 6
diff changeset
   524
    |pos pos2 theReceiver|
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   525
7ad01559b262 Initial revision
claus
parents:
diff changeset
   526
    theReceiver := receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   527
    theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   528
    valueNeeded ifTrue:[aStream nextPut:#dup].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   529
7ad01559b262 Initial revision
claus
parents:
diff changeset
   530
    pos := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   531
    aStream nextPut:#dup.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   532
    aStream nextPut:#push0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   533
    aStream nextPut:#>.
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   534
    aStream nextPut:lineNr.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   535
    aStream nextPut:#falseJump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   536
    pos2 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   537
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   538
7ad01559b262 Initial revision
claus
parents:
diff changeset
   539
    (argArray at:1) codeInlineOn:aStream inBlock:b valueNeeded:false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   540
    aStream nextPut:#minus1.
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   541
    aStream nextPut:lineNr.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   542
    aStream nextPut:#jump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   543
    aStream nextPut:pos.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   544
7ad01559b262 Initial revision
claus
parents:
diff changeset
   545
    (aStream contents) at:pos2 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   546
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   547
7ad01559b262 Initial revision
claus
parents:
diff changeset
   548
codeIfElseOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   549
    "generate code for x ifxxx:[ ... ] yyy:[ ...]"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   550
7ad01559b262 Initial revision
claus
parents:
diff changeset
   551
    |pos pos2 theReceiver theArg theByteCode optByteCode|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   552
7ad01559b262 Initial revision
claus
parents:
diff changeset
   553
    theReceiver := receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   554
    (selector == #ifTrue:ifFalse:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   555
        theByteCode := #falseJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   556
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   557
        (selector == #ifFalse:ifTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   558
            theByteCode := #trueJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   559
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   560
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   561
    optByteCode := self optimizedConditionFor:theReceiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   562
                                         with:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   563
    optByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   564
        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   565
            theArg := theReceiver arg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   566
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   567
        theReceiver := theReceiver receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   568
        theByteCode := optByteCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   569
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   570
    theByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   571
        theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   572
        theArg notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   573
            theArg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   574
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   575
        aStream nextPut:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   576
        pos := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   577
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   578
        (argArray at:1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   579
        aStream nextPut:#jump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   580
        pos2 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   581
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   582
        (aStream contents) at:pos put:(aStream position).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   583
        (argArray at:2) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   584
        (aStream contents) at:pos2 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   585
    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   586
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   587
7ad01559b262 Initial revision
claus
parents:
diff changeset
   588
codeIfOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   589
    "generate code for x ifxxx:[ ... ]"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   590
7ad01559b262 Initial revision
claus
parents:
diff changeset
   591
    |pos pos2 theReceiver theArg theByteCode optByteCode subsel|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   592
7ad01559b262 Initial revision
claus
parents:
diff changeset
   593
    theReceiver := receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   594
7ad01559b262 Initial revision
claus
parents:
diff changeset
   595
    (theReceiver class == MessageNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   596
        subsel := theReceiver selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   597
        (subsel == #and:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   598
            self codeAndIfOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   599
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   600
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   601
        (subsel == #or:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   602
            self codeOrIfOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   603
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   604
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   605
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   606
    (selector == #ifTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   607
        theByteCode := #falseJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   608
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   609
        theByteCode := #trueJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   610
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   611
    optByteCode := self optimizedConditionFor:theReceiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   612
                                         with:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   613
    optByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   614
        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   615
            theArg := theReceiver arg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   616
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   617
        theReceiver := theReceiver receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   618
        theByteCode := optByteCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   619
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   620
7ad01559b262 Initial revision
claus
parents:
diff changeset
   621
    theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   622
    theArg notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   623
        theArg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   624
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   625
    aStream nextPut:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   626
    pos := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   627
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   628
    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   629
    valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   630
        aStream nextPut:#jump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   631
        pos2 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   632
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   633
        (aStream contents) at:pos put:(aStream position).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   634
        aStream nextPut:#pushNil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   635
        (aStream contents) at:pos2 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   636
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   637
        (aStream contents) at:pos put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   638
    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   639
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   640
7ad01559b262 Initial revision
claus
parents:
diff changeset
   641
codeAndIfOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   642
    "generate code for (x and:[y]) ifxxx:[ ... ]"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   643
7ad01559b262 Initial revision
claus
parents:
diff changeset
   644
    |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   645
7ad01559b262 Initial revision
claus
parents:
diff changeset
   646
7ad01559b262 Initial revision
claus
parents:
diff changeset
   647
    theByteCode := #falseJump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   648
    theReceiver := receiver receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   649
7ad01559b262 Initial revision
claus
parents:
diff changeset
   650
    optByteCode := self optimizedConditionFor:theReceiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   651
                                         with:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   652
    optByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   653
        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   654
            theArg := theReceiver arg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   655
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   656
        theReceiver := theReceiver receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   657
        theByteCode := optByteCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   658
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   659
    theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   660
    theArg notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   661
        theArg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   662
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   663
    aStream nextPut:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   664
    pos1 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   665
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   666
7ad01559b262 Initial revision
claus
parents:
diff changeset
   667
    theReceiver := receiver arg1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   668
    theReceiver codeInlineOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   669
    (selector == #ifTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   670
        aStream nextPut:#falseJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   671
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   672
        aStream nextPut:#trueJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   673
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   674
    pos2 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   675
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   676
    (selector == #ifFalse:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   677
        (aStream contents) at:pos1 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   678
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   679
    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   680
    valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   681
        aStream nextPut:#jump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   682
        pos3 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   683
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   684
        (selector == #ifTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   685
            (aStream contents) at:pos1 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   686
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   687
        (aStream contents) at:pos2 put:(aStream position).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   688
        aStream nextPut:#pushNil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   689
        (aStream contents) at:pos3 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   690
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   691
        (selector == #ifTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   692
            (aStream contents) at:pos1 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   693
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   694
        (aStream contents) at:pos2 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   695
    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   696
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   697
7ad01559b262 Initial revision
claus
parents:
diff changeset
   698
codeOrIfOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   699
    "generate code for (x or:[y]) ifxxx:[ ... ]"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   700
7ad01559b262 Initial revision
claus
parents:
diff changeset
   701
    |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   702
7ad01559b262 Initial revision
claus
parents:
diff changeset
   703
    theByteCode := #trueJump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   704
    theReceiver := receiver receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   705
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   706
    optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   707
    optByteCode notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   708
        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   709
            theArg := theReceiver arg1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   710
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   711
        theReceiver := theReceiver receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   712
        theByteCode := optByteCode
7ad01559b262 Initial revision
claus
parents:
diff changeset
   713
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   714
    theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   715
    theArg notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   716
        theArg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   717
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   718
    aStream nextPut:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   719
    pos1 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   720
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   721
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   722
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   723
    theReceiver := receiver arg1.
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   724
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   725
"new:"
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   726
    (selector == #ifTrue:) ifTrue:[
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   727
        theByteCode := #falseJump
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   728
    ] ifFalse:[
3
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   729
        theByteCode := #trueJump
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   730
    ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   731
    optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   732
    optByteCode notNil ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   733
        theReceiver isBlock ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   734
            theReceiver := theReceiver statements expression
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   735
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   736
        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   737
            theArg := theReceiver arg1
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   738
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   739
        theReceiver := theReceiver receiver.
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   740
        theByteCode := optByteCode.
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   741
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   742
        theReceiver codeOn:aStream inBlock:b.
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   743
        theArg notNil ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   744
            theArg codeOn:aStream inBlock:b
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   745
        ].
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   746
        aStream nextPut:theByteCode.
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   747
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   748
    ] ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   749
"org"
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   750
        theReceiver codeInlineOn:aStream inBlock:b.
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   751
        (selector == #ifTrue:) ifTrue:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   752
            aStream nextPut:#falseJump
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   753
        ] ifFalse:[
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   754
            aStream nextPut:#trueJump
b63b8a6b71fb *** empty log message ***
claus
parents: 0
diff changeset
   755
        ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   756
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   757
    pos2 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   758
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   759
    (selector == #ifTrue:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   760
        (aStream contents) at:pos1 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   761
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   762
    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   763
    valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   764
        aStream nextPut:#jump.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   765
        pos3 := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   766
        aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   767
        (selector == #ifFalse:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   768
            (aStream contents) at:pos1 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   769
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   770
        (aStream contents) at:pos2 put:(aStream position).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   771
        aStream nextPut:#pushNil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   772
        (aStream contents) at:pos3 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   773
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   774
        (selector == #ifFalse:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   775
            (aStream contents) at:pos1 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   776
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   777
        (aStream contents) at:pos2 put:(aStream position)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   778
    ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   779
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   780
7ad01559b262 Initial revision
claus
parents:
diff changeset
   781
codeAndOrOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   782
    "generate code for x and/or:[y] - but not in an if"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   783
7ad01559b262 Initial revision
claus
parents:
diff changeset
   784
    |pos theReceiver theByteCode|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   785
7ad01559b262 Initial revision
claus
parents:
diff changeset
   786
self halt.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   787
    theReceiver := receiver.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   788
    (selector == #and:) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   789
        theByteCode := #falseJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   790
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   791
        theByteCode := #trueJump
7ad01559b262 Initial revision
claus
parents:
diff changeset
   792
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   793
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   794
    (self canOptimizeConditionFor:receiver) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   795
        theByteCode := self optimizedConditionFor:theReceiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   796
                                             with:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   797
        theReceiver := theReceiver receiver
7ad01559b262 Initial revision
claus
parents:
diff changeset
   798
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   799
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   800
    theReceiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   801
    aStream nextPut:theByteCode.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   802
    pos := aStream position.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   803
    aStream nextPut:0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   804
    (argArray at: 1) codeInlineOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   805
    (aStream contents) at:pos put:(aStream position).
7ad01559b262 Initial revision
claus
parents:
diff changeset
   806
    valueNeeded ifFalse:[aStream nextPut:#drop]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   807
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
   808
7ad01559b262 Initial revision
claus
parents:
diff changeset
   809
codeOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
   810
    |nargs isBuiltIn|
7ad01559b262 Initial revision
claus
parents:
diff changeset
   811
7ad01559b262 Initial revision
claus
parents:
diff changeset
   812
    argArray isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   813
        nargs := 0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   814
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   815
        nargs := argArray size
7ad01559b262 Initial revision
claus
parents:
diff changeset
   816
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   817
7ad01559b262 Initial revision
claus
parents:
diff changeset
   818
    isBuiltIn := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   819
7ad01559b262 Initial revision
claus
parents:
diff changeset
   820
    (nargs == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   821
        isBuiltIn := self class isBuiltInUnarySelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   822
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   823
7ad01559b262 Initial revision
claus
parents:
diff changeset
   824
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   825
        ((argArray at:1) class == BlockNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   826
            ((selector == #ifTrue:) or:[selector == #ifFalse:]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   827
                self codeIfOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   828
                ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   829
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   830
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   831
            ((selector == #and:) or:[selector == #or:]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   832
                self codeAndOrOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   833
                ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   834
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   835
"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   836
            receiver isConstant ifTrue:[
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   837
                receiver evaluate isNumber ifTrue:[
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   838
                    self codeTimesRepeatOn:aStream inBlock:b valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   839
                    ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   840
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   841
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   842
7ad01559b262 Initial revision
claus
parents:
diff changeset
   843
            (receiver class == BlockNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   844
                ((selector == #whileTrue:) 
7ad01559b262 Initial revision
claus
parents:
diff changeset
   845
                  or:[selector == #whileFalse:]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   846
                    self codeWhileOn:aStream inBlock:b 
7ad01559b262 Initial revision
claus
parents:
diff changeset
   847
                                         valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   848
                    ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   849
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   850
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   851
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   852
        isBuiltIn := self class isBuiltIn1ArgSelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   853
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   854
7ad01559b262 Initial revision
claus
parents:
diff changeset
   855
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   856
        ((argArray at:1) class == BlockNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   857
            ((argArray at:2) class == BlockNode) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   858
                ((selector == #ifTrue:ifFalse:)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   859
                  or:[selector == #ifFalse:ifTrue:]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   860
                    self codeIfElseOn:aStream inBlock:b 
7ad01559b262 Initial revision
claus
parents:
diff changeset
   861
                                          valueNeeded:valueNeeded.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   862
                    ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   863
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   864
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   865
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   866
        isBuiltIn := self class isBuiltIn2ArgSelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
   867
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   868
7ad01559b262 Initial revision
claus
parents:
diff changeset
   869
    "can we use a send-bytecode ?"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   870
    isBuiltIn ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   871
        (receiver type == #Super) ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   872
            receiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   873
            (nargs > 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   874
                (argArray at:1) codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   875
                (nargs > 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   876
                    (argArray at:2) codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   877
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   878
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   879
            aStream nextPut:selector.
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   880
            (self class hasLineNumber:selector) ifTrue:[
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   881
                aStream nextPut:lineNr.
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
   882
            ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   883
            valueNeeded ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   884
                aStream nextPut:#drop
7ad01559b262 Initial revision
claus
parents:
diff changeset
   885
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   886
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   887
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   888
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   889
7ad01559b262 Initial revision
claus
parents:
diff changeset
   890
    ((nargs == 0) and:[selector == #yourself]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   891
        "yourself is often added to get the receiver -
7ad01559b262 Initial revision
claus
parents:
diff changeset
   892
         we get it without the yourself-message"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   893
7ad01559b262 Initial revision
claus
parents:
diff changeset
   894
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   895
            receiver codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   896
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   897
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   898
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   899
7ad01559b262 Initial revision
claus
parents:
diff changeset
   900
    "no - generate a send"
7ad01559b262 Initial revision
claus
parents:
diff changeset
   901
    ((receiver type ~~ #Self)
7ad01559b262 Initial revision
claus
parents:
diff changeset
   902
    or:[nargs > 3]) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   903
        receiver codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   904
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   905
    argArray notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   906
        argArray do:[:arg |
7ad01559b262 Initial revision
claus
parents:
diff changeset
   907
            arg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
   908
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   909
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   910
    (receiver type == #Super) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   911
        aStream nextPut:#superSend.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   912
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   913
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   914
        aStream nextPut:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   915
        aStream nextPut:nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   916
        valueNeeded ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   917
            aStream nextPut:#drop
7ad01559b262 Initial revision
claus
parents:
diff changeset
   918
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   919
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   920
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   921
    (nargs == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   922
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   923
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   924
                aStream nextPut:#sendSelf0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   925
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   926
                aStream nextPut:#send0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   927
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   928
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   929
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   930
                aStream nextPut:#sendSelfDrop0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   931
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   932
                aStream nextPut:#sendDrop0
7ad01559b262 Initial revision
claus
parents:
diff changeset
   933
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   934
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   935
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   936
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   937
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   938
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   939
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   940
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   941
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   942
                aStream nextPut:#sendSelf1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   943
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   944
                aStream nextPut:#send1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   945
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   946
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   947
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   948
                aStream nextPut:#sendSelfDrop1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   949
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   950
                aStream nextPut:#sendDrop1
7ad01559b262 Initial revision
claus
parents:
diff changeset
   951
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   952
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   953
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   954
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   955
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   956
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   957
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   958
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   959
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   960
                aStream nextPut:#sendSelf2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   961
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   962
                aStream nextPut:#send2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   963
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   964
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   965
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   966
                aStream nextPut:#sendSelfDrop2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   967
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   968
                aStream nextPut:#sendDrop2
7ad01559b262 Initial revision
claus
parents:
diff changeset
   969
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   970
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   971
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   972
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   973
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   974
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   975
    (nargs == 3) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   976
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   977
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   978
                aStream nextPut:#sendSelf3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   979
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   980
                aStream nextPut:#send3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   981
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   982
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   983
            (receiver type == #Self) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   984
                aStream nextPut:#sendSelfDrop3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   985
            ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   986
                aStream nextPut:#sendDrop3
7ad01559b262 Initial revision
claus
parents:
diff changeset
   987
            ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
   988
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   989
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   990
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   991
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
   992
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   993
    valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   994
        aStream nextPut:#send
7ad01559b262 Initial revision
claus
parents:
diff changeset
   995
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
   996
        aStream nextPut:#sendDrop
7ad01559b262 Initial revision
claus
parents:
diff changeset
   997
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
   998
    aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
   999
    aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1000
    aStream nextPut:nargs
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1001
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1002
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1003
codeSendOn:aStream inBlock:b valueNeeded:valueNeeded
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1004
    "like code on, but assumes that receiver has already been
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1005
     coded onto stack - needed for cascade"
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1006
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1007
    |nargs isBuiltIn|
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1008
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1009
    argArray isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1010
        nargs := 0
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1011
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1012
        nargs := argArray size
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1013
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1014
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1015
    isBuiltIn := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1016
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1017
    (nargs == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1018
        isBuiltIn := self class isBuiltInUnarySelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1019
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1020
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1021
        isBuiltIn := self class isBuiltIn1ArgSelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1022
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1023
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1024
        isBuiltIn := self class isBuiltIn2ArgSelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1025
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1026
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1027
    "can we use a send-bytecode ?"
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1028
    isBuiltIn ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1029
        (receiver type == #Super) ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1030
            (nargs > 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1031
                (argArray at:1) codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1032
                (nargs > 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1033
                    (argArray at:2) codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1034
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1035
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1036
            aStream nextPut:selector.
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
  1037
            (self class hasLineNumber:selector) ifTrue:[
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
  1038
                aStream nextPut:lineNr.
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
  1039
            ].
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1040
            valueNeeded ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1041
                aStream nextPut:#drop
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1042
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1043
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1044
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1045
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1046
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1047
    argArray notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1048
        argArray do:[:arg |
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1049
            arg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1050
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1051
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1052
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1053
    (receiver type == #Super) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1054
        aStream nextPut:#superSend.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1055
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1056
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1057
        aStream nextPut:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1058
        aStream nextPut:nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1059
        valueNeeded ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1060
            aStream nextPut:#drop
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1061
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1062
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1063
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1064
    (nargs == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1065
        (selector == #yourself) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1066
            "yourself is often added to get the receiver -
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1067
             we get it without the yourself-message"
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1068
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1069
            valueNeeded ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1070
                aStream nextPut:#drop
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1071
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1072
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1073
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1074
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1075
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1076
            aStream nextPut:#send0
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1077
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1078
            aStream nextPut:#sendDrop0
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1079
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1080
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1081
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1082
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1083
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1084
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1085
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1086
             aStream nextPut:#send1
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1087
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1088
            aStream nextPut:#sendDrop1
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1089
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1090
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1091
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1092
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1093
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1094
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1095
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1096
            aStream nextPut:#send2
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1097
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1098
            aStream nextPut:#sendDrop2
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1099
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1100
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1101
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1102
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1103
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1104
    (nargs == 3) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1105
        valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1106
            aStream nextPut:#send3
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1107
        ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1108
            aStream nextPut:#sendDrop3
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1109
        ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1110
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1111
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1112
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1113
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1114
    valueNeeded ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1115
        aStream nextPut:#send
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1116
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1117
        aStream nextPut:#sendDrop
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1118
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1119
    aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1120
    aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1121
    aStream nextPut:nargs
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1122
!
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1123
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1124
codeForCascadeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1125
    "like codeOn, but always leave the receiver instead of the result"
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1126
    |nargs isBuiltIn|
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1127
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1128
    argArray isNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1129
        nargs := 0
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1130
    ] ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1131
        nargs := argArray size
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1132
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1133
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1134
    isBuiltIn := false.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1135
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1136
    (nargs == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1137
        isBuiltIn := self class isBuiltInUnarySelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1138
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1139
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1140
        isBuiltIn := self class isBuiltIn1ArgSelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1141
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1142
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1143
        isBuiltIn := self class isBuiltIn2ArgSelector:selector
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1144
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1145
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1146
    receiver codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1147
    aStream nextPut:#dup.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1148
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1149
    "can we use a send-bytecode ?"
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1150
    isBuiltIn ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1151
        (receiver type == #Super) ifFalse:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1152
            (nargs > 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1153
                (argArray at:1) codeOn:aStream inBlock:b.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1154
                (nargs > 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1155
                    (argArray at:2) codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1156
                ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1157
            ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1158
            aStream nextPut:selector.
6
0cd4e7480440 *** empty log message ***
claus
parents: 4
diff changeset
  1159
            aStream nextPut:lineNr.
0
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1160
            aStream nextPut:#drop.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1161
            ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1162
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1163
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1164
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1165
    "no - generate a send"
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1166
    argArray notNil ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1167
        argArray do:[:arg |
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1168
            arg codeOn:aStream inBlock:b
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1169
        ]
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1170
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1171
    (receiver type == #Super) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1172
        aStream nextPut:#superSend.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1173
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1174
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1175
        aStream nextPut:nargs.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1176
        aStream nextPut:nil.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1177
        aStream nextPut:#drop.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1178
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1179
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1180
    (nargs == 0) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1181
        aStream nextPut:#sendDrop0.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1182
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1183
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1184
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1185
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1186
    (nargs == 1) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1187
        aStream nextPut:#sendDrop1.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1188
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1189
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1190
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1191
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1192
    (nargs == 2) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1193
        aStream nextPut:#sendDrop2.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1194
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1195
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1196
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1197
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1198
    (nargs == 3) ifTrue:[
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1199
        aStream nextPut:#sendDrop3.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1200
        aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1201
        aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1202
        ^ self
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1203
    ].
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1204
    aStream nextPut:#sendDrop.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1205
    aStream nextPut:lineNr.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1206
    aStream nextPut:selector.
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1207
    aStream nextPut:nargs
7ad01559b262 Initial revision
claus
parents:
diff changeset
  1208
! !