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