Diff for /gforth/glocals.fs between versions 1.28 and 1.35

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

Removed from v.1.28  
changed lines
  Added in v.1.35


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>