--- gforth/glocals.fs 1994/07/08 15:00:43 1.4 +++ gforth/glocals.fs 1995/04/29 14:51:19 1.12 @@ -61,22 +61,22 @@ \ Currently locals may only be \ defined at the outer level and TO is not supported. -include float.fs include search-order.fs +include float.fs -: compile-@local ( n -- ) +: compile-@local ( n -- ) \ new compile-fetch-local case - 0 of postpone @local0 endof - 4 of postpone @local4 endof - 8 of postpone @local8 endof - 12 of postpone @local12 endof + 0 of postpone @local0 endof + 1 cells of postpone @local1 endof + 2 cells of postpone @local2 endof + 3 cells of postpone @local3 endof ( otherwise ) dup postpone @local# , endcase ; -: compile-f@local ( n -- ) +: compile-f@local ( n -- ) \ new compile-f-fetch-local case - 0 of postpone f@local0 endof - 8 of postpone f@local8 endof + 0 of postpone f@local0 endof + 1 floats of postpone f@local1 endof ( otherwise ) dup postpone f@local# , endcase ; @@ -87,8 +87,11 @@ include search-order.fs \ lp must have the strictest alignment (usually float) across calls; \ for simplicity we align it strictly for every group. +slowvoc @ +slowvoc on \ we want a linked list for the vocabulary locals vocabulary locals \ this contains the local variables ' locals >body ' locals-list >body ! +slowvoc ! create locals-buffer 1000 allot \ !! limited and unsafe \ here the names of the local variables are stored @@ -131,9 +134,10 @@ variable locals-dp \ so here's the speci postpone lp@ postpone c! ; : create-local ( " name" -- a-addr ) - \ defines the local "name"; the offset of the local shall be stored in a-addr + \ defines the local "name"; the offset of the local shall be + \ stored in a-addr create - immediate + immediate restrict here 0 , ( place for the offset ) ; : lp-offset ( n1 -- n2 ) @@ -260,7 +264,7 @@ locals-types definitions : -- ( addr wid 0 ... -- ) } - [char] } word drop ; + [char] } parse 2drop ; forth definitions @@ -494,16 +498,21 @@ forth definitions OF POSTPONE laddr# >body @ lp-offset, POSTPONE d! ENDOF [ ' flocal >definer ] literal OF POSTPONE laddr# >body @ lp-offset, POSTPONE f! ENDOF - abort" can only store TO value or local value" + -&32 throw endcase else [ ' locals-wordlist >definer ] literal = if >body ! else - abort" can only store TO value" + -&32 throw endif endif ; immediate -\ : locals| -\ !! should lie around somewhere +: locals| + BEGIN + name 2dup s" |" compare 0<> + WHILE + (local) + REPEAT + drop 0 (local) ; immediate restrict