version 1.28, 1996/09/30 13:16:10
|
version 1.35, 1997/10/04 17:33:53
|
Line 85
|
Line 85
|
\ Currently locals may only be |
\ Currently locals may only be |
\ defined at the outer level and TO is not supported. |
\ defined at the outer level and TO is not supported. |
|
|
require search-order.fs |
require search.fs |
require float.fs |
require float.fs |
|
|
: compile-@local ( n -- ) \ gforth compile-fetch-local |
: compile-@local ( n -- ) \ gforth compile-fetch-local |
Line 319 previous
|
Line 319 previous
|
true abort" this should not happen: new-locals-reveal" ; |
true abort" this should not happen: new-locals-reveal" ; |
|
|
create new-locals-map ( -- wordlist-map ) |
create new-locals-map ( -- wordlist-map ) |
' new-locals-find A, ' new-locals-reveal A, |
' new-locals-find A, |
|
' new-locals-reveal A, |
|
' drop A, \ rehash method |
|
' drop A, |
|
|
slowvoc @ |
slowvoc @ |
slowvoc on |
slowvoc on |
Line 330 new-locals-map ' new-locals >body cell+
|
Line 333 new-locals-map ' new-locals >body cell+
|
variable old-dpp |
variable old-dpp |
|
|
\ and now, finally, the user interface words |
\ and now, finally, the user interface words |
: { ( -- addr wid 0 ) \ gforth open-brace |
: { ( -- lastxt wid 0 ) \ gforth open-brace |
dp old-dpp ! |
dp old-dpp ! |
locals-dp dpp ! |
locals-dp dpp ! |
|
lastxt get-current |
also new-locals |
also new-locals |
also get-current locals definitions locals-types |
also locals definitions locals-types |
0 TO locals-wordlist |
0 TO locals-wordlist |
0 postpone [ ; immediate |
0 postpone [ ; immediate |
|
|
locals-types definitions |
locals-types definitions |
|
|
: } ( addr wid 0 a-addr1 xt1 ... -- ) \ gforth close-brace |
: } ( lastxt wid 0 a-addr1 xt1 ... -- ) \ gforth close-brace |
\ ends locals definitions |
\ ends locals definitions |
] old-dpp @ dpp ! |
] old-dpp @ dpp ! |
begin |
begin |
Line 350 locals-types definitions
|
Line 354 locals-types definitions
|
repeat |
repeat |
drop |
drop |
locals-size @ alignlp-f locals-size ! \ the strictest alignment |
locals-size @ alignlp-f locals-size ! \ the strictest alignment |
set-current |
|
previous previous |
previous previous |
|
set-current lastcfa ! |
locals-list TO locals-wordlist ; |
locals-list TO locals-wordlist ; |
|
|
: -- ( addr wid 0 ... -- ) \ gforth dash-dash |
: -- ( addr wid 0 ... -- ) \ gforth dash-dash |
Line 495 forth definitions
|
Line 499 forth definitions
|
\ 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 |
Line 614 forth definitions
|
Line 619 forth definitions
|
\ 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 ; |
Line 631 forth definitions
|
Line 635 forth definitions
|
then ; |
then ; |
|
|
:noname |
:noname |
' dup >definer [ ' locals-wordlist >definer ] literal = |
' dup >definer [ ' locals-wordlist ] literal >definer = |
if |
if |
>body ! |
>body ! |
else |
else |
Line 641 forth definitions
|
Line 645 forth definitions
|
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 |
|
\ !! dependent on c: etc. being does>-defining words |
|
\ this works, because >definer uses >does-code in this case, |
|
\ which produces a relocatable address |
[ comp' clocal drop >definer ] literal |
[ comp' clocal drop >definer ] literal |
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 >definer ] literal |