[OpenBIOS] [PATCH 7/10] Apple local variables implementation in Forth
William Hahne
will07c5 at gmail.com
Wed Aug 10 17:43:02 CEST 2011
On Wed, Aug 10, 2011 at 5:57 AM, Mark Cave-Ayland <
mark.cave-ayland at siriusit.co.uk> wrote:
> On 09/08/11 22:55, William Hahne wrote:
>
> This is an implementation of Apple local variables which is required to
>> execute the Forth scripts in BootX
>>
>> Index: forth/bootstrap/bootstrap.fs
>> ==============================**==============================**=======
>> --- forth/bootstrap/bootstrap.fs (revision 1041)
>> +++ forth/bootstrap/bootstrap.fs (working copy)
>> @@ -1413,10 +1413,135 @@
>> here last @ , latest ! \ write backlink and set latest
>> ;
>> +\
>> +\ Defer required by BootX
>> +\
>> +defer spin
>> +
>> +\
>> +\ Local Variables (Apple specific)
>> +\
>> +
>> +\
>> +: has-locals ( -- true/false )
>> + skipws
>> + ib >in @ + c@ 7b <>
>> + if false exit then
>> + ib >in @ + 1+ c@ 20 >
>> + if false exit then
>> +
>> + true
>> + ;
>> +
>> +: comp-str-char ( str len char -- true/false )
>> + swap 1 <> if 2drop false exit then
>> + swap c@ <> if false exit then
>> + true
>> + ;
>> +
>> +variable locals_wordlist
>> +variable locals_state \ 0 - reading args
>> + \ 1 - ;
>> + \ 2 - reading vars
>> +: read-locals ( -- addr0 .. addrN addrCount )
>> + has-locals
>> + not if 0 false exit then \ no locals
>> +
>> + 0 locals_state !
>> + 0 >r
>> +
>> + s" get-current" $find drop execute
>> + s" wordlist" $find drop execute
>> + dup locals_wordlist !
>> + s" set-current" $find drop execute
>> +
>> + parse-word 2drop \ ditch the {
>> +
>> + begin
>> + parse-word
>> +
>> + 2dup 3b comp-str-char \ check for ;
>> + if 1 locals_state ! then
>> +
>> + 2dup 7d comp-str-char \ check for }
>> + not
>> + while
>> + locals_state @ 1 <> if \ the ; is not a local variable so ignore it
>> + header
>> +
>> + locals_state @ 0= if \ only save the address if it is an arg
>> + r>
>> + here na1+ >r
>> + 1+ >r
>> + then
>> +
>> + 3 , 0 ,
>> + reveal
>> + else \ if we hit a ; then move to next state
>> + 2drop
>> + 2 locals_state !
>> + then
>> + repeat
>> +
>> + 2drop
>> +
>> + s" set-current" $find drop execute
>> +
>> + r> 0
>> + begin
>> + 2dup
>> + >
>> + while
>> + r> -rot
>> + 1+
>> + repeat
>> +
>> + drop
>> +
>> + true
>> + ;
>> +
>> +: begin-locals ( addr0 .. addrN count hasLocals -- )
>> + not if drop exit then
>> +
>> + dup 0> if
>> + 0 do
>> + ['] (lit) , , ['] ! ,
>> + loop
>> + else drop then
>> +
>> + s" get-order" $find drop execute
>> + locals_wordlist @
>> + swap 1+
>> + s" set-order" $find drop execute
>> + ;
>> +
>> +: end-locals ( -- )
>> + locals_wordlist @ 0= if exit then
>> +
>> + 0 locals_wordlist !
>> +
>> + s" get-order" $find drop execute
>> + swap drop 1-
>> + s" set-order" $find drop execute
>> + ;
>> +
>> +: -> parse-word $find drop na1+
>> + ['] (lit) , , ['] ! ,
>> + ; immediate
>> +
>> +\
>> +\ 7.3.9.1 Defining words
>> +\
>> +
>> : :
>> - parse-word header
>> - 1 , ]
>> + parse-word >r >r
>> + read-locals
>> + r> r> header
>> + 1 ,
>> + begin-locals
>> + ]
>> ;
>> : :noname
>> @@ -1426,6 +1551,7 @@
>> ;
>> : ;
>> + end-locals
>> ['] (semis) , reveal ['] [ execute
>> ; immediate
>>
>>
> Very interesting. I think this needs someone with quite strong Forth-fu
> (Stefan) to review this one. Also I can't see any related documentation with
> this patch related to locals support?
>
>
This is an Apple specific thing. See
http://www.openfirmware.info/How_Local_Variables_in_Forth_Work_---_Using_Apple%E2%80%99s_Open_Firmware_Implementation
>
> ATB,
>
> Mark.
>
> --
> Mark Cave-Ayland - Senior Technical Architect
> PostgreSQL - PostGIS
> Sirius Corporation plc - control through freedom
> http://www.siriusit.co.uk
> t: +44 870 608 0063
>
> Sirius Labs: http://www.siriusit.co.uk/labs
>
> --
> OpenBIOS http://openbios.org/
> Mailinglist: http://lists.openbios.org/**mailman/listinfo<http://lists.openbios.org/mailman/listinfo>
> Free your System - May the Forth be with you
>
William Hahne
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openbios.org/pipermail/openbios/attachments/20110810/0b63f441/attachment.html>
More information about the OpenBIOS
mailing list