Block.st
author claus
Wed, 13 Oct 1993 01:19:00 +0100
changeset 3 24d81bf47225
parent 2 6526dde5f3ac
child 5 67342904af11
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#Block
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'code flags byteCode home nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
                              sourcePos initialPC literals
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
                              selfValue'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       classVariableNames:'InvalidNewSignal'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
       category:'Kernel-Methods'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
Block comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
COPYRIGHT (c) 1989-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    27
$Header: /cvs/stx/stx/libbasic/Block.st,v 1.3 1993-10-13 00:14:54 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
written spring 89 by claus
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
!Block class methodsFor:'documentation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
documentation
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
Blocks are pieces of executable code which can be evaluated by sending
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
them a value-message (''value'', ''value:'', ''value:value:'' etc).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
Blocks with arguments need a message of type ''value:arg1 ... value:argn''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
for evaluation; the number of arguments passed when evaluating must match
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
the number of arguments the block was declared with otherwise an error is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
raised. Blocks without args need a ''value'' message for evaluation.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
Blocks keep a reference to the method context where the block was declared -
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
this allows blocks to access the methods arguments and/or variables.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
This is also true when the method has already returned - since the
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
block keeps this reference, the methods context will NOT die in this case.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
A return (via ^-statement) out of a block will force a return from the
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
blocks method context (if it is still living) - this make the implementation
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
of long-jumps and control structures possible.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
(If the method is not alive (i.e. has already returned), a return out of the block 
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
is ignored and a simple return from the block is performed).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
Long-jump is done by defining a catchBlock as ''[^ self]''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
somewhere up in the calling-tree. Then, to do the long-jump from out of some 
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
deeply nested method, simply do: ''catchBlock value''.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
Instance variables:
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
code        <not_an_object>   the function pointer if its a compiled block
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
flags       <SmallInteger>    special flag bits coded in a number
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
byteCode    <ByteArray>       bytecode of home method if its an interpreted block
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
home        <Context>         the context where this block lives
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
nargs       <SmallInteger>    the number of arguments the block expects
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
sourcePos   <SmallInteger>    the character poistion of its source, in chars
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
                              relative to methods source beginning
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
initialPC   <SmallInteger>    the start position within the byteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
literals    <Array>           the blocks literal array
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
selfValue   <Object>          value to use for self if its a copying block
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
NOTICE: layout known by runtime system and compiler - do not change
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
!Block class methodsFor:'initialization' !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
    "setup the signals"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
    InvalidNewSignal := (Signal new).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
    InvalidNewSignal mayProceed:false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
    InvalidNewSignal notifierString:'blocks are only created by the system'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    86
!Block class methodsFor:'queries'!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    87
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    88
isBuiltInClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    89
    "this class is known by the run-time-system"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    90
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    91
    ^ true
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    92
! !
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    93
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
!Block class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
code:codeAddress byteCode:bCode nargs:numArgs sourcePosition:sourcePos initialPC:initialPC literals:literals
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    "create a new cheap (homeless) block.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
     Not for public use - special hook for the compiler."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
    |newBlock|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    newBlock := super basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
    newBlock code:codeAddress.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
    newBlock byteCode:bCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
    newBlock nargs:numArgs.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
    newBlock sourcePosition:sourcePos. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
    newBlock initialPC:initialPC. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
    newBlock literals:literals.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
    ^ newBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
    "catch creation of blocks - only the system creates blocks"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
    InvalidNewSignal raise.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
basicNew:size
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    "catch creation of blocks - only the system creates blocks"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
    InvalidNewSignal raise.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
!Block methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
isBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
!Block methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
instVarAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    "have to catch instVar access to code - since its no object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
    (index == 1) ifTrue:[^ self code].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
    ^ super instVarAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
instVarAt:index put:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    "have to catch instVar access to code - since its no object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
    (index == 1) ifTrue:[^ self code:value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
    ^ super instVarAt:index put:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
code
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
    "return the code field. This is not an object but the address of the machine instructions. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
     Therefore an integer representing the code-address is returned"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
    if (_INST(code) != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
        RETURN ( _MKSMALLINT((int)(_INST(code))) )
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
byteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
    "return the bytecode (a ByteArray) of the block"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    ^ byteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
    "return the number of arguments I expect for evaluation"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
    ^ nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
selfValue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
    "return the copied self"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    ^ selfValue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
!Block methodsFor:'private accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
code:anAddress
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    "set the code field - danger alert. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
     This is not an object but the address of the blocks machine instructions.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
     Therefore the argument must be an integer representing for this address.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
     You can crash Smalltalk very badly when playing around here ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
    if (_isSmallInteger(anAddress))
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
        _INST(code) = (OBJ)(_intVal(anAddress));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
byteCode:aByteArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
    "set the bytecode field - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    byteCode := aByteArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
nargs:numArgs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
    "set the number of arguments I expect for evaluation - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
    nargs := numArgs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
sourcePosition:position 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
    "set the position of the source within my method"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
    sourcePos := position
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
initialPC:initial 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
    "set the initial pc for evaluation - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
    initialPC := initial
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
literals:aLiteralArray 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    "set the literal array for evaluation - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
    literals := aLiteralArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
!Block methodsFor:'error handling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
argumentCountError:numberGiven
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
    "report that the number of arguments given does not match the number expected"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
    self error:('Block got ' , numberGiven printString ,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
                ' args while ' , nargs printString , ' where expected')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
invalidMethod
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
    "this is sent by the bytecode interpreter when the blocks definition is bad.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
     Can only happen when playing around with the blocks instvars
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
     or the Compiler/runtime system is buggy"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
    self error:'invalid block - not executable'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
invalidByteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
    "this is sent by the bytecode interpreter when trying to execute
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
     an invalid bytecode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
     Can only happen when playing around with the blocks instvars
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
      or the Compiler/runtime system is buggy"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
    self error:'invalid byteCode in block - not executable'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
receiverNotBoolean
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
    "this error is triggered when the bytecode-interpreter tries to
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
     execute ifTrue:/ifFalse or whileTrue: type of expressions where the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
     receiver is neither true nor false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
    self error:'if/while on non-boolean receiver'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
!Block methodsFor:'evaluation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    "evaluate the receiver with no block args. The receiver must be a block without arguments."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
    if (_INST(nargs) == _MKSMALLINT(0)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
            /* compiled machine code */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
            RETURN ( (*thecode)(home COMMA_SND) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
        /* interpreted code */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
        RETURN ( interpret(self, 0, nil, home COMMA_SND, nil) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
    ^ self argumentCountError:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
value:arg
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
    "evaluate the receiver with one argument. The receiver must be a 1-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
    if (_INST(nargs) == _MKSMALLINT(1)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
            RETURN ( (*thecode)(home COMMA_SND, &arg) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
            RETURN ( (*thecode)(home COMMA_SND, arg) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
        /* interpreted code */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
        RETURN ( interpret(self, 1, nil, home COMMA_SND, nil, &arg) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
        RETURN ( interpret(self, 1, nil, home COMMA_SND, nil, arg) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
    ^ self argumentCountError:1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
value:arg1 value:arg2
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
    "evaluate the receiver with two arguments. The receiver must be a 2-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
    if (_INST(nargs) == _MKSMALLINT(2)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
            RETURN ( (*thecode)(home COMMA_SND, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
        RETURN ( interpret(self, 2, nil, home COMMA_SND, nil, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
        RETURN ( interpret(self, 2, nil, home COMMA_SND, nil, arg1, arg2) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
    ^ self argumentCountError:2
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
value:arg1 value:arg2 value:arg3
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
    "evaluate the receiver with three arguments. The receiver must be a 3-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    if (_INST(nargs) == _MKSMALLINT(3)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
            RETURN ( (*thecode)(home COMMA_SND, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
        RETURN ( interpret(self, 3, nil, home COMMA_SND, nil, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
        RETURN ( interpret(self, 3, nil, home COMMA_SND, nil, arg1, arg2, arg3) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
    ^ self argumentCountError:3
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
value:arg1 value:arg2 value:arg3 value:arg4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
    "evaluate the receiver with four arguments. The receiver must be a 4-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    if (_INST(nargs) == _MKSMALLINT(4)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
            RETURN ( (*thecode)(home COMMA_SND, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3, arg4) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
        RETURN ( interpret(self, 4, nil, home COMMA_SND, nil, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
        RETURN ( interpret(self, 4, nil, home COMMA_SND, nil, arg1, arg2, arg3, arg4) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
    ^ self argumentCountError:4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
value:arg1 value:arg2 value:arg3 value:arg4 value:arg5
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    "evaluate the receiver with four arguments. The receiver must be a 5-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    if (_INST(nargs) == _MKSMALLINT(5)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
            RETURN ( (*thecode)(home COMMA_SND, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3, arg4, arg5) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
        RETURN ( interpret(self, 5, nil, home COMMA_SND, nil, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
        RETURN ( interpret(self, 5, nil, home COMMA_SND, nil, arg1, arg2, arg3, arg4, arg5) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
    ^ self argumentCountError:5
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
value:arg1 value:arg2 value:arg3 value:arg4 value:arg5 value:arg6
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
    "evaluate the receiver with four arguments. The receiver must be a 6-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
    if (_INST(nargs) == _MKSMALLINT(6)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
        thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
            RETURN ( (*thecode)(home COMMA_SND, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3, arg4, arg5, arg6) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
        RETURN ( interpret(self, 6, nil, home COMMA_SND, nil, &arg1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
        RETURN ( interpret(self, 6, nil, home COMMA_SND, nil, arg1, arg2, arg3, arg4, arg5, arg6) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
    ^ self argumentCountError:6
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
valueWithArguments:argArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
    "evaluate the receiver with arguments taken from argArray.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
     The size of the argArray must match the number of arguments the receiver expects."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
    |a1 a2 a3 a4 a5 a6 a7|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
    (argArray class == Array) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
        ^ self error:'argument must be an array'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
    (argArray size == nargs) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
        ^ self argumentCountError:(argArray size)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
    if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
        _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
    switch (_intVal(_INST(nargs))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
        case 7:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
            a7 = _ArrayInstPtr(argArray)->a_element[6];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
        case 6:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
            a6 = _ArrayInstPtr(argArray)->a_element[5];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
        case 5:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
            a5 = _ArrayInstPtr(argArray)->a_element[4];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
        case 4:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
            a4 = _ArrayInstPtr(argArray)->a_element[3];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
        case 3:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
            a3 = _ArrayInstPtr(argArray)->a_element[2];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
        case 2:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
            a2 = _ArrayInstPtr(argArray)->a_element[1];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
        case 1:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
            a1 = _ArrayInstPtr(argArray)->a_element[0];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
        case 0:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
            break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
    home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
    thecode = _BlockInstPtr(self)->b_code;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
    if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
        RETURN ( (*thecode)(home COMMA_SND, &a1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
        RETURN ( (*thecode)(home COMMA_SND, a1, a2, a3, a4, a5, a6, a7) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
#ifdef PASS_ARG_REF
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
    RETURN ( interpret(self, _intVal(_INST(nargs)), nil,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
                                    home COMMA_SND, nil, &a1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
    RETURN ( interpret(self, _intVal(_INST(nargs)), nil,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
                                    home COMMA_SND, nil, a1, a2, a3, a4, a5, a6, a7) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
valueNowOrOnUnwindDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    "evaluate the receiver - after that, or when some method sent within unwinds (i.e. does
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
     a long return), evaluate the argument, aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
     This is used to make certain that cleanup actions (for example closing files etc.) are
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
     executed regardless of error actions"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
    |v|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
    v := self value.       "the real logic is in Context"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
    aBlock value.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
    ^ v
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
valueOnUnwindDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
    "evaluate the receiver - when some method sent within unwinds (i.e. does
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
     a long return), evaluate the argument, aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
     This is used to make certain that cleanup actions (for example closing files etc.) are
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
     executed regardless of error actions"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
    ^ self value        "the real logic is in Context"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
!Block methodsFor:'looping'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
whileTrue:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
    "evaluate the argument, aBlock while the receiver evaluates to true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
     - open coded by compiler but needed here for #perform and expression evaluation."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
    extern OBJ _value;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
    static struct inlineCache bval = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
    static struct inlineCache selfVal = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
    while ((*bval.ilc_func)(self, _value, CON_COMMA nil, &bval) == true) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
        if (InterruptPending != nil) interrupt(CONARG);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
        (*selfVal.ilc_func)(aBlock, _value, CON_COMMA nil, &selfVal);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
whileTrue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
    "evaluate the receiver until it evaluates to false (ST80 compatibility)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
    ^ self whileTrue:[]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
whileFalse:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
    "evaluate the argument while the receiver evaluates to false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
     - open coded by compiler but needed here for #perform and expression evaluation."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
    extern OBJ _value;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
    static struct inlineCache bval = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
    static struct inlineCache selfVal = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
    while ((*bval.ilc_func)(self, _value, CON_COMMA nil, &bval) == false) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
        if (InterruptPending != nil) interrupt(CONARG);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
        (*selfVal.ilc_func)(aBlock, _value, CON_COMMA nil, &selfVal);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
whileFalse
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
    "evaluate the receiver until it evaluates to true (ST80 compatibility)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
    ^ self whileFalse:[]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
doWhile:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
    "repeat the receiver block until aBlock evaluates to false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
     The receiver is evaluated at least once."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
    self value.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
    [aBlock value] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
        self value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
doUntil:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
    "repeat the receiver block until aBlock evaluates to true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
     The receiver is evaluated at least once."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
    self value.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
    [aBlock value] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
        self value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
loop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
    "repeat the receiver forever (should contain a return somewhere).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
     Inspired by a corresponding Self method."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
    [true] whileTrue:[self value]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
    "[Transcript showCr:'hello'] loop"  "must be stopped with interrupt"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
valueWithExit
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
    "the receiver must be a block of one argument.  It is evaluated, and is passed a block,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
     which, if sent a value:-message, will exit the receiver block, returning the parameter of the 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
     value:-message. Used for premature returns to the caller.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
     Taken from a manchester goody (also appears in Self)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
    ^ self value: [:exitValue | ^exitValue]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
    "[:exit |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
        1 to:10 do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
            i == 5 ifTrue:[exit value:'thats it']
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
        'regular block-value; never returned'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
     ] valueWithExit"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
loopWithExit
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    "the receiver must be a block of one argument.  It is evaluated in a loop forever, and is passed a 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
     block, which, if sent a value:-message, will exit the receiver block, returning the parameter of 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
     the value:-message. Used for loops with exit in the middle.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
     Inspired by a corresponding Self method."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
    |exitBlock|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
    exitBlock := [:exitValue | ^ exitValue].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
    [true] whileTrue:[self value:exitBlock]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
    "|i|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
     i := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
     [:exit |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
        i == 5 ifTrue:[exit value:'thats it'].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
        i := i + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
     ] loopWithExit"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
!Block methodsFor:'process creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
newProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
    "create a new (unscheduled) process executing the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
    |p pBlock startUp|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
    startUp := self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
    pBlock := [ startUp value. Processor terminate:p ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
    p := Processor newProcessFor:pBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   696
    ^ p
a27a279701f8 Initial revision
claus
parents:
diff changeset
   697
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   698
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
fork
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
    "create a new process executing the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   701
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
    ^ self newProcess resume
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   704
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
forkWith:argumentArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   706
    |b|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   707
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
    b := [self valueWithArguments:argumentArray].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
    b fork
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   711
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
forkAt:priority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
    "create a new process executing the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
    ^ (self newProcess priority:priority) resume
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
!Block methodsFor:'printing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
printString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
    home notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
        ^ '[] in ', home printString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
    ^ '[] in ???'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   726
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
printOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
    |homeClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
    aStream nextPutAll:'[] in '.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
    homeClass := home containingClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
    homeClass notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
        homeClass name printOn:aStream.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
        aStream space.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
        (homeClass selectorForMethod:home) printOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
        aStream nextPutAll:' ???'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
! !