| \ ELSE. However, if ELSE generates an appropriate "lp+!#" before the |
\ ELSE. However, if ELSE generates an appropriate "lp+!#" before the |
| \ branch, there will be none after the target <then>. |
\ branch, there will be none after the target <then>. |
| |
|
| : (then-like) ( orig -- addr ) |
: (then-like) ( orig -- ) |
| swap -rot dead-orig = |
dead-orig = |
| if |
if |
| drop |
>resolve drop |
| else |
else |
| dead-code @ |
dead-code @ |
| if |
if |
| set-locals-size-list dead-code off |
>resolve set-locals-size-list dead-code off |
| else \ both live |
else \ both live |
| dup list-size adjust-locals-size |
over list-size adjust-locals-size |
| |
>resolve |
| locals-list @ common-list dup list-size adjust-locals-size |
locals-list @ common-list dup list-size adjust-locals-size |
| locals-list ! |
locals-list ! |
| then |
then |
| \ this gives a unique identifier for the way the xt was defined |
\ this gives a unique identifier for the way the xt was defined |
| \ words defined with different does>-codes have different definers |
\ words defined with different does>-codes have different definers |
| \ the definer can be used for comparison and in definer! |
\ the definer can be used for comparison and in definer! |
| dup >code-address [ ' spaces >code-address ] Literal = |
dup >does-code |
| \ !! this definition will not work on some implementations for `bits' |
?dup-if |
| if \ if >code-address delivers the same value for all does>-def'd words |
nip 1 or |
| >does-code 1 or \ bit 0 marks special treatment for does codes |
|
| else |
else |
| >code-address |
>code-address |
| then ; |
then ; |
| 0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } |
0 0 0. 0.0e0 { c: clocal w: wlocal d: dlocal f: flocal } |
| comp' drop dup >definer |
comp' drop dup >definer |
| case |
case |
| [ ' locals-wordlist >definer ] literal \ value |
[ ' locals-wordlist ] literal >definer \ value |
| OF >body POSTPONE Aliteral POSTPONE ! ENDOF |
OF >body POSTPONE Aliteral POSTPONE ! ENDOF |
| [ comp' clocal drop >definer ] literal |
[ comp' clocal drop ] literal >definer |
| OF POSTPONE laddr# >body @ lp-offset, POSTPONE c! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE c! ENDOF |
| [ comp' wlocal drop >definer ] literal |
[ comp' wlocal drop ] literal >definer |
| OF POSTPONE laddr# >body @ lp-offset, POSTPONE ! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE ! ENDOF |
| [ comp' dlocal drop >definer ] literal |
[ comp' dlocal drop ] literal >definer |
| OF POSTPONE laddr# >body @ lp-offset, POSTPONE 2! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE 2! ENDOF |
| [ comp' flocal drop >definer ] literal |
[ comp' flocal drop ] literal >definer |
| OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF |
OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF |
| -&32 throw |
-&32 throw |
| endcase ; |
endcase ; |