Block.st
author claus
Sun, 30 Jan 1994 18:58:28 +0100
changeset 46 9b743dde8762
parent 44 b262907c93ea
child 48 9f68393bea3c
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
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
1
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
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    24
COPYRIGHT (c) 1989 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
46
9b743dde8762 *** empty log message ***
claus
parents: 44
diff changeset
    27
$Header: /cvs/stx/stx/libbasic/Block.st,v 1.9 1994-01-30 17:58:28 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
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
    96
code:codeAddress byteCode:bCode nargs:numArgs sourcePosition:sourcePos initialPC:initialPC literals:literals dynamic:dynamic
1
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
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   102
    newBlock := super basicNew code:codeAddress 
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   103
                           byteCode:bCode
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   104
                              nargs:numArgs
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   105
                     sourcePosition:sourcePos
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   106
                          initialPC:initialPC
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   107
                           literals:literals
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   108
                            dynamic:dynamic.
1
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
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   112
new
1
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
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   119
new:size
1
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
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   129
    "return true, if this is a block - yes we I am"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   130
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
!Block methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
instVarAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
    "have to catch instVar access to code - since its no object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    (index == 1) ifTrue:[^ self code].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    ^ super instVarAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
instVarAt:index put:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
    "have to catch instVar access to code - since its no object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
    (index == 1) ifTrue:[^ self code:value].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
    ^ super instVarAt:index put:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
code
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
    "return the code field. This is not an object but the address of the machine instructions. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
     Therefore an integer representing the code-address is returned"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    if (_INST(code) != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
        RETURN ( _MKSMALLINT((int)(_INST(code))) )
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
byteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    "return the bytecode (a ByteArray) of the block"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
    ^ byteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
    "return the number of arguments I expect for evaluation"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
    ^ nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
selfValue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    "return the copied self"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
    ^ selfValue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
!Block methodsFor:'private accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   184
code:codeAddress byteCode:bCode nargs:numArgs sourcePosition:srcPos initialPC:iPC literals:lits dynamic:dynamic
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   185
    "set all relevant internals"
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   186
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   187
    self code:codeAddress.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   188
    byteCode := bCode.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   189
    nargs := numArgs.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   190
    sourcePos := srcPos.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   191
    initialPC := iPC.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   192
    literals := lits.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   193
    self dynamic:dynamic
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   194
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   195
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
code:anAddress
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    "set the code field - danger alert. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
     This is not an object but the address of the blocks machine instructions.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
     Therefore the argument must be an integer representing for this address.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
     You can crash Smalltalk very badly when playing around here ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
    if (_isSmallInteger(anAddress))
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
        _INST(code) = (OBJ)(_intVal(anAddress));
46
9b743dde8762 *** empty log message ***
claus
parents: 44
diff changeset
   205
    else
9b743dde8762 *** empty log message ***
claus
parents: 44
diff changeset
   206
        _INST(code) = (OBJ)0;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
byteCode:aByteArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
    "set the bytecode field - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
    byteCode := aByteArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
nargs:numArgs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
    "set the number of arguments I expect for evaluation - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    nargs := numArgs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
sourcePosition:position 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
    "set the position of the source within my method"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
    sourcePos := position
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
initialPC:initial 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
    "set the initial pc for evaluation - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
    initialPC := initial
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
literals:aLiteralArray 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
    "set the literal array for evaluation - danger alert"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
    literals := aLiteralArray
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   238
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   239
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   240
dynamic:aBoolean
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   241
    "set the flag bit stating that the machine code was created
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   242
     dynamically and should be flushed on image-restart."
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   243
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   244
    |newFlags|
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   245
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   246
    newFlags := flags.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   247
%{
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   248
    /* made this a primitive to get define in stc.h */
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   249
    if (aBoolean == true)
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   250
        newFlags = _MKSMALLINT(_intVal(newFlags) | F_DYNAMIC);
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   251
    else
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   252
        newFlags = _MKSMALLINT(_intVal(newFlags) & ~F_DYNAMIC);
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   253
%}
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   254
.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   255
    flags := newFlags
1
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:'error handling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
argumentCountError:numberGiven
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    "report that the number of arguments given does not match the number expected"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
    self error:('Block got ' , numberGiven printString ,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
                ' args while ' , nargs printString , ' where expected')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
invalidMethod
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
    "this is sent by the bytecode interpreter when the blocks definition is bad.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
     Can only happen when playing around with the blocks instvars
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
     or the Compiler/runtime system is buggy"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
    self error:'invalid block - not executable'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
invalidByteCode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
    "this is sent by the bytecode interpreter when trying to execute
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
     an invalid bytecode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
     Can only happen when playing around with the blocks instvars
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
      or the Compiler/runtime system is buggy"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
    self error:'invalid byteCode in block - not executable'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
receiverNotBoolean
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
    "this error is triggered when the bytecode-interpreter tries to
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
     execute ifTrue:/ifFalse or whileTrue: type of expressions where the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
     receiver is neither true nor false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
    self error:'if/while on non-boolean receiver'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
!Block methodsFor:'evaluation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
    "evaluate the receiver with no block args. The receiver must be a block without arguments."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
    if (_INST(nargs) == _MKSMALLINT(0)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
#endif
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   308
        thecode = _BlockInstPtr(self)->b_code;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   309
#ifdef NEW_BLOCK_CALL
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   310
        if (thecode != (OBJFUNC)nil) {
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   311
            /* compiled machine code */
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   312
            RETURN ( (*thecode)(self, COMMA_SND) );
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   313
        }
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   314
        /* interpreted code */
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   315
        RETURN ( interpret(self, 0, nil, nil COMMA_SND, nil) );
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   316
#else
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
        home = _BlockInstPtr(self)->b_home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
        if (thecode != (OBJFUNC)nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
            /* compiled machine code */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
            RETURN ( (*thecode)(home COMMA_SND) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
        /* interpreted code */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
        RETURN ( interpret(self, 0, nil, home COMMA_SND, nil) );
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   324
#endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
    ^ self argumentCountError:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
value:arg
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
    "evaluate the receiver with one argument. The receiver must be a 1-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
    if (_INST(nargs) == _MKSMALLINT(1)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
        thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   346
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
        if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   348
            RETURN ( (*thecode)(self COMMA_SND, arg) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
        /* interpreted code */
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   351
        RETURN ( interpret(self, 1, nil, nil COMMA_SND, nil, arg) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   353
        home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   354
        if (thecode != (OBJFUNC)nil) {
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   355
            RETURN ( (*thecode)(home COMMA_SND, arg) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   356
        }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   357
        /* interpreted code */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
        RETURN ( interpret(self, 1, nil, home COMMA_SND, nil, arg) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
    ^ self argumentCountError:1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
value:arg1 value:arg2
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
    "evaluate the receiver with two arguments. The receiver must be a 2-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
    if (_INST(nargs) == _MKSMALLINT(2)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
        thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   381
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
        if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   383
            RETURN ( (*thecode)(self COMMA_SND, arg1, arg2) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   384
        }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   385
        RETURN ( interpret(self, 2, nil, nil COMMA_SND, nil, arg1, arg2) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   387
        home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   388
        if (thecode != (OBJFUNC)nil) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
        RETURN ( interpret(self, 2, nil, home COMMA_SND, nil, arg1, arg2) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
    ^ self argumentCountError:2
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
value:arg1 value:arg2 value:arg3
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    "evaluate the receiver with three arguments. The receiver must be a 3-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    if (_INST(nargs) == _MKSMALLINT(3)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
        thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   414
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
        if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   416
            RETURN ( (*thecode)(self COMMA_SND, arg1, arg2, arg3) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   417
        }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   418
        RETURN ( interpret(self, 3, nil, nil COMMA_SND, nil, arg1, arg2, arg3) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   420
        home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   421
        if (thecode != (OBJFUNC)nil) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
        RETURN ( interpret(self, 3, nil, home COMMA_SND, nil, arg1, arg2, arg3) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
    ^ self argumentCountError:3
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
value:arg1 value:arg2 value:arg3 value:arg4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
    "evaluate the receiver with four arguments. The receiver must be a 4-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
    if (_INST(nargs) == _MKSMALLINT(4)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
        thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   447
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
        if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   449
            RETURN ( (*thecode)(self COMMA_SND, arg1, arg2, arg3, arg4) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   450
        }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   451
        RETURN ( interpret(self, 4, nil, nil COMMA_SND, nil, arg1, arg2, arg3, arg4) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   453
        home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   454
        if (thecode != (OBJFUNC)nil) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3, arg4) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
        RETURN ( interpret(self, 4, nil, home COMMA_SND, nil, arg1, arg2, arg3, arg4) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
    ^ self argumentCountError:4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
value:arg1 value:arg2 value:arg3 value:arg4 value:arg5
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
    "evaluate the receiver with four arguments. The receiver must be a 5-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
    if (_INST(nargs) == _MKSMALLINT(5)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
        thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   480
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
        if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   482
            RETURN ( (*thecode)(self COMMA_SND, arg1, arg2, arg3, arg4, arg5) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   483
        }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   484
        RETURN ( interpret(self, 5, nil, nil COMMA_SND, nil, arg1, arg2, arg3, arg4, arg5) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   486
        home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   487
        if (thecode != (OBJFUNC)nil) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3, arg4, arg5) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
        RETURN ( interpret(self, 5, nil, home COMMA_SND, nil, arg1, arg2, arg3, arg4, arg5) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
    ^ self argumentCountError:5
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
value:arg1 value:arg2 value:arg3 value:arg4 value:arg5 value:arg6
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
    "evaluate the receiver with four arguments. The receiver must be a 6-arg block."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
    if (_INST(nargs) == _MKSMALLINT(6)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
        if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
            _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
        thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   513
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
        if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   515
            RETURN ( (*thecode)(self COMMA_SND, arg1, arg2, arg3, arg4, arg5, arg6) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   516
        }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   517
        RETURN ( interpret(self, 6, nil, nil COMMA_SND, nil, arg1, arg2, arg3, arg4, arg5, arg6) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   519
        home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   520
        if (thecode != (OBJFUNC)nil) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
            RETURN ( (*thecode)(home COMMA_SND, arg1, arg2, arg3, arg4, arg5, arg6) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
        RETURN ( interpret(self, 6, nil, home COMMA_SND, nil, arg1, arg2, arg3, arg4, arg5, arg6) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
    ^ self argumentCountError:6
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
valueWithArguments:argArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
    "evaluate the receiver with arguments taken from argArray.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
     The size of the argArray must match the number of arguments the receiver expects."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
    |a1 a2 a3 a4 a5 a6 a7|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
    (argArray class == Array) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
        ^ self error:'argument must be an array'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
    (argArray size == nargs) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
        ^ self argumentCountError:(argArray size)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
    REGISTER OBJFUNC thecode;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
    OBJ home;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
    extern OBJ interpret();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
#if defined(THIS_CONTEXT)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
    if (1 /* _intVal(__pilc->ilc_lineNo) > 0 */)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
        _ContextInstPtr(__thisContext)->c_lineno = __pilc->ilc_lineNo;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    switch (_intVal(_INST(nargs))) {
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   554
        default:
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   555
            goto error;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
        case 7:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
            a7 = _ArrayInstPtr(argArray)->a_element[6];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
        case 6:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
            a6 = _ArrayInstPtr(argArray)->a_element[5];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
        case 5:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
            a5 = _ArrayInstPtr(argArray)->a_element[4];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
        case 4:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
            a4 = _ArrayInstPtr(argArray)->a_element[3];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
        case 3:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
            a3 = _ArrayInstPtr(argArray)->a_element[2];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
        case 2:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
            a2 = _ArrayInstPtr(argArray)->a_element[1];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
        case 1:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
            a1 = _ArrayInstPtr(argArray)->a_element[0];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
        case 0:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
            break;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
    thecode = _BlockInstPtr(self)->b_code;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   574
#ifdef NEW_BLOCK_CALL
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
    if (thecode != (OBJFUNC)nil) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   576
        RETURN ( (*thecode)(self COMMA_SND, a1, a2, a3, a4, a5, a6, a7) );
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   577
    }
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   578
    RETURN ( interpret(self, _intVal(_INST(nargs)), nil,
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   579
                                    nil COMMA_SND, nil, a1, a2, a3, a4, a5, a6, a7) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
#else
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   581
    home = _BlockInstPtr(self)->b_home;
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   582
    if (thecode != (OBJFUNC)nil) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
        RETURN ( (*thecode)(home COMMA_SND, a1, a2, a3, a4, a5, a6, a7) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
    RETURN ( interpret(self, _intVal(_INST(nargs)), nil,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
                                    home COMMA_SND, nil, a1, a2, a3, a4, a5, a6, a7) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
#endif
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   588
error: ;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
%}
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   590
.
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   591
    self error:'only blocks with up-to 7 arguments supported'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
valueNowOrOnUnwindDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
    "evaluate the receiver - after that, or when some method sent within unwinds (i.e. does
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
     a long return), evaluate the argument, aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
     This is used to make certain that cleanup actions (for example closing files etc.) are
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
     executed regardless of error actions"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
    |v|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
    v := self value.       "the real logic is in Context"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
    aBlock value.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
    ^ v
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
valueOnUnwindDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
    "evaluate the receiver - when some method sent within unwinds (i.e. does
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
     a long return), evaluate the argument, aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
     This is used to make certain that cleanup actions (for example closing files etc.) are
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
     executed regardless of error actions"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
    ^ self value        "the real logic is in Context"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
!Block methodsFor:'looping'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
whileTrue:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
    "evaluate the argument, aBlock while the receiver evaluates to true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
     - open coded by compiler but needed here for #perform and expression evaluation."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
    extern OBJ _value;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
    static struct inlineCache bval = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
    static struct inlineCache selfVal = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
    while ((*bval.ilc_func)(self, _value, CON_COMMA nil, &bval) == true) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
        if (InterruptPending != nil) interrupt(CONARG);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
        (*selfVal.ilc_func)(aBlock, _value, CON_COMMA nil, &selfVal);
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
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
whileTrue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
    "evaluate the receiver until it evaluates to false (ST80 compatibility)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
    ^ self whileTrue:[]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
whileFalse:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
    "evaluate the argument while the receiver evaluates to false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
     - open coded by compiler but needed here for #perform and expression evaluation."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
    extern OBJ _value;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
    static struct inlineCache bval = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
    static struct inlineCache selfVal = _ILC0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
    while ((*bval.ilc_func)(self, _value, CON_COMMA nil, &bval) == false) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
        if (InterruptPending != nil) interrupt(CONARG);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
        (*selfVal.ilc_func)(aBlock, _value, CON_COMMA nil, &selfVal);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
whileFalse
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
    "evaluate the receiver until it evaluates to true (ST80 compatibility)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
    ^ self whileFalse:[]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
doWhile:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
    "repeat the receiver block until aBlock evaluates to false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
     The receiver is evaluated at least once."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    self value.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
    [aBlock value] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
        self value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
doUntil:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
    "repeat the receiver block until aBlock evaluates to true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
     The receiver is evaluated at least once."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
    self value.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
    [aBlock value] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
        self value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
loop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
    "repeat the receiver forever (should contain a return somewhere).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
     Inspired by a corresponding Self method."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
    [true] whileTrue:[self value]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
    "[Transcript showCr:'hello'] loop"  "must be stopped with interrupt"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
valueWithExit
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
    "the receiver must be a block of one argument.  It is evaluated, and is passed a block,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
     which, if sent a value:-message, will exit the receiver block, returning the parameter of the 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   696
     value:-message. Used for premature returns to the caller.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   697
     Taken from a manchester goody (also appears in Self)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   698
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
    ^ self value: [:exitValue | ^exitValue]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
a27a279701f8 Initial revision
claus
parents:
diff changeset
   701
    "[:exit |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
        1 to:10 do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
            i == 5 ifTrue:[exit value:'thats it']
a27a279701f8 Initial revision
claus
parents:
diff changeset
   704
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
        'regular block-value; never returned'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   706
     ] valueWithExit"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   707
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
loopWithExit
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
    "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
   711
     block, which, if sent a value:-message, will exit the receiver block, returning the parameter of 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
     the value:-message. Used for loops with exit in the middle.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
     Inspired by a corresponding Self method."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
    |exitBlock|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
    exitBlock := [:exitValue | ^ exitValue].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
    [true] whileTrue:[self value:exitBlock]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
    "|i|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
     i := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
     [:exit |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
        i == 5 ifTrue:[exit value:'thats it'].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
        i := i + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
     ] loopWithExit"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   726
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
!Block methodsFor:'process creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
newProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
    "create a new (unscheduled) process executing the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
    |p pBlock startUp|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
    startUp := self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
    pBlock := [ startUp value. Processor terminate:p ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
    p := Processor newProcessFor:pBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
    ^ p
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
a27a279701f8 Initial revision
claus
parents:
diff changeset
   741
fork
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
    "create a new process executing the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
    ^ self newProcess resume
a27a279701f8 Initial revision
claus
parents:
diff changeset
   745
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
forkWith:argumentArray
44
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   748
    "create a new process executing the receiver passing elements
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   749
     in argumentArray to the receiver block"
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   750
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
    |b|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   752
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
    b := [self valueWithArguments:argumentArray].
10
claus
parents: 5
diff changeset
   754
    ^ b fork
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
a27a279701f8 Initial revision
claus
parents:
diff changeset
   757
forkAt:priority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
    "create a new process executing the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
a27a279701f8 Initial revision
claus
parents:
diff changeset
   760
    ^ (self newProcess priority:priority) resume
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
22
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   763
!Block methodsFor:'binary storage'!
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   764
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   765
readBinaryContentsFrom: stream manager: manager
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   766
    "make certain, that only interpreted blocks are created
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   767
     this way."
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   768
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   769
    super readBinaryContentsFrom: stream manager: manager.
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   770
    code := nil.
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   771
! !
847106305963 *** empty log message ***
claus
parents: 11
diff changeset
   772
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
!Block methodsFor:'printing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
printString
44
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   776
    "return a string containing a printed representation of the block"
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   777
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
    home notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
        ^ '[] in ', home printString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
    ^ '[] in ???'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
printOn:aStream
44
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   785
    "append a a printed representation of the block to aStream"
b262907c93ea *** empty log message ***
claus
parents: 22
diff changeset
   786
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
    |homeClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
a27a279701f8 Initial revision
claus
parents:
diff changeset
   789
    aStream nextPutAll:'[] in '.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
    homeClass := home containingClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
    homeClass notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   792
        homeClass name printOn:aStream.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
        aStream space.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   794
        (homeClass selectorForMethod:home) printOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   795
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   796
        aStream nextPutAll:' ???'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
! !