Diff for /gforth/see.fs between versions 1.70 and 1.74

version 1.70, 2010/05/01 20:36:59 version 1.74, 2010/08/28 10:04:34
Line 81  DEFER nlcount ' noop IS nlcount Line 81  DEFER nlcount ' noop IS nlcount
                 IF 2drop ELSE XPos +! C-Output @ IF emit ELSE drop THEN                  IF 2drop ELSE XPos +! C-Output @ IF emit ELSE drop THEN
                 THEN ;                  THEN ;
   
               
   Defer xt-see-xt ( xt -- )
   \ this one is just a forward declaration for indirect recursion
   
   : .defname ( xt c-addr u -- )
       rot look
       if ( c-addr u nfa )
           -rot type space .name
       else
           drop ." noname " type
       then
       space ;
   
   Defer discode ( addr u -- ) \ gforth
   \G hook for the disassembler: disassemble u bytes of code at addr
   ' dump IS discode
   
   : next-head ( addr1 -- addr2 ) \ gforth
       \G find the next header starting after addr1, up to here (unreliable).
       here swap u+do
           i head? -2 and if
               i unloop exit
           then
       cell +loop
       here ;
   
   [ifundef] umin \ !! bootstrapping help
   : umin ( u1 u2 -- u )
       2dup u>
       if
           swap
       then
       drop ;
   [then]
   
   : next-prim ( addr1 -- addr2 ) \ gforth
       \G find the next primitive after addr1 (unreliable)
       1+ >r -1 primstart
       begin ( umin head R: boundary )
           @ dup
       while
           tuck name>int >code-address ( head1 umin ca R: boundary )
           r@ - umin
           swap
       repeat
       drop dup r@ negate u>=
       \ "umin+boundary within [0,boundary)" = "umin within [-boundary,0)"
       if ( umin R: boundary ) \ no primitive found behind -> use a default length
           drop 31
       then
       r> + ;
   
 DEFER .string ( c-addr u n -- )  DEFER .string ( c-addr u n -- )
   
 [IFDEF] Green  [IFDEF] Green
Line 254  VARIABLE C-Pass Line 306  VARIABLE C-Pass
 : Scan? ( -- flag ) C-Pass @ 0= ;  : Scan? ( -- flag ) C-Pass @ 0= ;
 : Display? ( -- flag ) C-Pass @ 1 = ;  : Display? ( -- flag ) C-Pass @ 1 = ;
 : Debug? ( -- flag ) C-Pass @ 2 = ;  : Debug? ( -- flag ) C-Pass @ 2 = ;
   : ?.string  ( c-addr u n -- )   Display? if .string else 2drop drop then ;
   
 : back? ( addr target -- addr flag )  : back? ( addr target -- addr flag )
     over u< ;      over u< ;
Line 300  VARIABLE C-Pass Line 353  VARIABLE C-Pass
 [THEN]  [THEN]
   
 : c-lit ( addr1 -- addr2 )  : c-lit ( addr1 -- addr2 )
     Display? IF      dup @ dup body> dup cfaligned over = swap in-dictionary? and if
         dup @ dup body> dup cfaligned over = swap in-dictionary? and if          ( addr1 addr1@ )
             ( addr1 addr1@ )          dup body> @ dovar: = if
             dup body> @ dovar: = if              drop c-call EXIT
                 drop c-call EXIT  
             endif  
         endif          endif
         over 4 cells + over = if      endif
             over 1 cells + @ decompile-prim ['] call xt>threaded = >r      over 4 cells + over = if
             over 2 cells + @ ['] !does >body = >r          over 1 cells + @ decompile-prim ['] call xt>threaded = >r
             over 3 cells + @ decompile-prim ['] ;S xt>threaded =          over 3 cells + @ decompile-prim ['] ;S xt>threaded =
             r> and r> and          r> and if
             if  drop c-does>  4 cells + EXIT  endif              over 2 cells + @ ['] !does >body = if  drop
                   S" DOES> " Com# ?.string 4 cells + EXIT endif
         endif          endif
           [IFDEF] !;abi-code
               over 2 cells + @ ['] !;abi-code >body = if  drop
                   S" ;abi-code " Com# ?.string   4 cells +
                   c-stop on
                   Display? if
                       dup   dup  next-head   over - discode 
                       S" end-code" Com# ?.string 
                   then   EXIT
               endif
           [THEN]
       endif
       Display? if
         \ !! test for cfa here, and print "['] ..."          \ !! test for cfa here, and print "['] ..."
         dup abs 0 <# #S rot sign #> 0 .string bl cemit          dup abs 0 <# #S rot sign #> 0 .string bl cemit
     endif      else  drop  then
     cell+ ;      cell+ ;
   
 : c-lit+ ( addr1 -- addr2 )  : c-lit+ ( addr1 -- addr2 )
Line 650  c-extender ! Line 714  c-extender !
         c-stop @          c-stop @
     UNTIL drop ;      UNTIL drop ;
   
 Defer xt-see-xt ( xt -- )  
 \ this one is just a forward declaration for indirect recursion  
   
 : .defname ( xt c-addr u -- )  
     rot look  
     if ( c-addr u nfa )  
         -rot type space .name  
     else  
         drop ." noname " type  
     then  
     space ;  
   
 Defer discode ( addr u -- ) \ gforth  
 \G hook for the disassembler: disassemble u bytes of code at addr  
 ' dump IS discode  
   
 : next-head ( addr1 -- addr2 ) \ gforth  
     \G find the next header starting after addr1, up to here (unreliable).  
     here swap u+do  
         i head? -2 and if  
             i unloop exit  
         then  
     cell +loop  
     here ;  
   
 [ifundef] umin \ !! bootstrapping help  
 : umin ( u1 u2 -- u )  
     2dup u>  
     if  
         swap  
     then  
     drop ;  
 [then]  
   
 : next-prim ( addr1 -- addr2 ) \ gforth  
     \G find the next primitive after addr1 (unreliable)  
     1+ >r -1 primstart  
     begin ( umin head R: boundary )  
         @ dup  
     while  
         tuck name>int >code-address ( head1 umin ca R: boundary )  
         r@ - umin  
         swap  
     repeat  
     drop dup r@ negate u>=  
     \ "umin+boundary within [0,boundary)" = "umin within [-boundary,0)"  
     if ( umin R: boundary ) \ no primitive found behind -> use a default length  
         drop 31  
     then  
     r> + ;  
   
 : seecode ( xt -- )  : seecode ( xt -- )
     dup s" Code" .defname      dup s" Code" .defname
     >code-address      >code-address

Removed from v.1.70  
changed lines
  Added in v.1.74


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