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