Diff for /gforth/see.fs between versions 1.2 and 1.40

version 1.2, 1994/05/03 19:10:36 version 1.40, 2002/04/01 15:34:34
Line 1 Line 1
 \ SEE.FS       highend SEE for ANSforth                16may93jaw  \ SEE.FS       highend SEE for ANSforth                16may93jaw
   
   \ Copyright (C) 1995,2000 Free Software Foundation, Inc.
   
   \ This file is part of Gforth.
   
   \ Gforth is free software; you can redistribute it and/or
   \ modify it under the terms of the GNU General Public License
   \ as published by the Free Software Foundation; either version 2
   \ of the License, or (at your option) any later version.
   
   \ This program is distributed in the hope that it will be useful,
   \ but WITHOUT ANY WARRANTY; without even the implied warranty of
   \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   \ GNU General Public License for more details.
   
   \ You should have received a copy of the GNU General Public License
   \ along with this program; if not, write to the Free Software
   \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
   
   
 \ May be cross-compiled  \ May be cross-compiled
   
 \ I'm sorry. This is really not "forthy" enough.  \ I'm sorry. This is really not "forthy" enough.
   
 \ Ideas:        Level should be a stack  \ Ideas:        Level should be a stack
   
   require look.fs
   require termsize.fs
   require wordinfo.fs
   [IFUNDEF] .name
   : id. ( nt -- ) \ gforth
       \G Print the name of the word represented by @var{nt}.
       \ this name comes from fig-Forth
       name>string type space ;
   
   ' id. alias .id ( nt -- )
   \G F83 name for @code{id.}.
   
   ' id. alias .name ( nt -- )
   \G Gforth <=0.5.0 name for @code{id.}.
   
   [THEN]
   
 decimal  decimal
   
 \ Screen format words                                   16may93jaw  \ Screen format words                                   16may93jaw
Line 29  VARIABLE Level Line 65  VARIABLE Level
 : level-        -7 Level +! ;  : level-        -7 Level +! ;
   
 VARIABLE nlflag  VARIABLE nlflag
   VARIABLE uppercase      \ structure words are in uppercase
   
 DEFER nlcount ' noop IS nlcount  DEFER nlcount ' noop IS nlcount
   
 : nl            nlflag on ;  : nl            nlflag on ;
 : (nl)          nlcount  : (nl)          nlcount
                 XPos @ Level @ = ?Exit                  XPos @ Level @ = IF EXIT THEN \ ?Exit
                 C-Formated @ IF                  C-Formated @ IF
                 C-Output @                  C-Output @
                 IF C-Clearline @ IF 80 XPos @ - spaces                  IF C-Clearline @ IF cols XPos @ - spaces
                                  ELSE cr THEN                                   ELSE cr THEN
                 1 YPos +! 0 XPos !                  1 YPos +! 0 XPos !
                 Level @ spaces                  Level @ spaces
Line 45  DEFER nlcount ' noop IS nlcount Line 82  DEFER nlcount ' noop IS nlcount
   
 : warp?         ( len -- len )  : warp?         ( len -- len )
                 nlflag @ IF (nl) nlflag off THEN                  nlflag @ IF (nl) nlflag off THEN
                 XPos @ over + 79 u> IF (nl) THEN ;                  XPos @ over + cols u>= IF (nl) THEN ;
   
   : c-to-upper ( c1 -- c2 ) \ gforth
       \ nac05feb1999 there is a primitive, toupper, with this function
       dup [char] a >= over [char] z <= and if  bl -  then ;
   
 : ctype         ( adr len -- )  : ctype         ( adr len -- )
                 warp? dup XPos +! C-Output @ IF type ELSE 2drop THEN ;                  warp? dup XPos +! C-Output @ 
                   IF uppercase @ IF bounds ?DO i c@ c-to-upper emit LOOP
                                     uppercase off ELSE type THEN
                   ELSE 2drop THEN ;
   
 : cemit         1 warp?  : cemit         1 warp?
                 over bl = Level @ XPos @ = and                  over bl = Level @ XPos @ = and
                 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 .string  DEFER .string ( c-addr u n -- )
   
 [IFDEF] Green  [IFDEF] Green
 VARIABLE Colors Colors on  VARIABLE Colors Colors on
Line 77  VARIABLE Colors Colors on Line 121  VARIABLE Colors Colors on
 ' (.string) IS .string  ' (.string) IS .string
   
   
 : .struc        Str# .string ;  : .struc        
           uppercase on Str# .string ;
   
 \ CODES                                                 15may93jaw  \ CODES (Branchtypes)                                    15may93jaw
   
 21 CONSTANT RepeatCode  21 CONSTANT RepeatCode
 22 CONSTANT AgainCode  22 CONSTANT AgainCode
Line 89  VARIABLE Colors Colors on Line 134  VARIABLE Colors Colors on
 11 CONSTANT AheadCode  11 CONSTANT AheadCode
 13 CONSTANT WhileCode2  13 CONSTANT WhileCode2
 14 CONSTANT Disable  14 CONSTANT Disable
   15 CONSTANT LeaveCode
   
   
 \ FORMAT WORDS                                          13jun93jaw  \ FORMAT WORDS                                          13jun93jaw
   
 VARIABLE C-Stop  VARIABLE C-Stop
 VARIABLE Branches  VARIABLE Branches
   
 VARIABLE BranchPointer  VARIABLE BranchPointer  \ point to the end of branch table
 VARIABLE SearchPointer  VARIABLE SearchPointer
 CREATE BranchTable 500 allot  
   \ The branchtable consists of three entrys:
   \ address of branch , branch destination , branch type
   
   CREATE BranchTable 128 cells allot
 here 3 cells -  here 3 cells -
 ACONSTANT MaxTable  ACONSTANT MaxTable
   
 : FirstBranch BranchTable cell+ SearchPointer ! ;  : FirstBranch BranchTable cell+ SearchPointer ! ;
   
 : (BranchAddr?) ( a-addr -- a-addr true | false )  : (BranchAddr?) ( a-addr1 -- a-addr2 true | false )
   \ searches a branch with destination a-addr1
   \ a-addr1: branch destination
   \ a-addr2: pointer in branch table
         SearchPointer @          SearchPointer @
         BEGIN   dup BranchPointer @ u<          BEGIN   dup BranchPointer @ u<
         WHILE          WHILE
Line 132  ACONSTANT MaxTable Line 186  ACONSTANT MaxTable
         2drop true          2drop true
         THEN ;          THEN ;
   
   : MyBranch      ( a-addr -- a-addr a-addr2 )
   \ finds branch table entry for branch at a-addr
                   dup @ over +
                   BranchAddr?
                   BEGIN
                   WHILE 1 cells - @
                         over <>
                   WHILE dup @ over +
                         MoreBranchAddr?
                   REPEAT
                   SearchPointer @ 3 cells -
                   ELSE    true ABORT" SEE: Table failure"
                   THEN ;
   
 \  \
 \                 addrw               addrt  \                 addrw               addrt
 \       BEGIN ... WHILE ... AGAIN ... THEN  \       BEGIN ... WHILE ... AGAIN ... THEN
Line 180  VARIABLE C-Pass Line 248  VARIABLE C-Pass
 : back? ( n -- flag ) 0< ;  : back? ( n -- flag ) 0< ;
 : ahead? ( n -- flag ) 0> ;  : ahead? ( n -- flag ) 0> ;
   
 : c-(compile)  
         Display? IF s" POSTPONE " Com# .string  
                     dup @ look 0= ABORT" SEE: No valid XT"  
                     cell+ count $1F and 0 .string bl cemit  
                  THEN  
         cell+ ;  
   
 : c-lit  : c-lit
         Display? IF dup @ dup abs 0 <# #S rot sign #> 0 .string bl cemit THEN      Display? IF
         cell+ ;          dup @ dup abs 0 <# #S rot sign #> 0 .string bl cemit
       THEN
 : c-s"      cell+ ;
         count 2dup + aligned -rot  
         Display?  : .word ( addr xt -- addr )
         IF      [char] S cemit [char] " cemit bl cemit 0 .string      look 0= IF
                 [char] " cemit bl cemit          drop dup 1 cells - @ dup body> look
         ELSE    2drop          IF
         THEN ;              nip dup ." <" name>string rot wordinfo .string ." >"
           ELSE
 : c-."              drop ." <" 0 .r ." >"
         count 2dup + aligned -rot          THEN
         Display?      ELSE
         IF      [char] . cemit          dup cell+ @ immediate-mask and
                 [char] " cemit bl cemit 0 .string          IF
                 [char] " cemit bl cemit              bl cemit  ." POSTPONE "
         ELSE    2drop          THEN
         THEN ;          dup name>string rot wordinfo .string
       THEN ;
   
   : c-call
       Display? IF  ." call " dup @ body> .word bl cemit  THEN  cell+ ;
   
   : .name-without ( addr -- addr )
   \ prints a name without () e.g. (+LOOP) or (s")
     dup 1 cells - @ look 
     IF   name>string over c@ '( = IF 1 /string THEN
          2dup + 1- c@ ') = IF 1- THEN .struc ELSE drop 
     THEN ;
   
 : c-c"  : c-c"
           Display? IF nl .name-without THEN
         count 2dup + aligned -rot          count 2dup + aligned -rot
         Display?          Display?
         IF      [char] C cemit [char] " cemit bl cemit 0 .string          IF      bl cemit 0 .string
                 [char] " cemit bl cemit                  [char] " cemit bl cemit
         ELSE    2drop          ELSE    2drop
         THEN ;          THEN ;
   
   
 : Forward? ( a-addr true | false -- )  : Forward? ( a-addr true | false -- a-addr true | false )
   \ a-addr1 is pointer into branch table
   \ returns true when jump is a forward jump
         IF      dup dup @ swap 1 cells - @ -          IF      dup dup @ swap 1 cells - @ -
                 Ahead? IF true ELSE drop false THEN                  Ahead? IF true ELSE drop false THEN
                 \ only if forward jump                  \ only if forward jump
         ELSE    false THEN ;          ELSE    false THEN ;
   
 : RepeatCheck  : RepeatCheck ( a-addr1 a-addr2 true | false -- false )
         IF  BEGIN  2dup          IF  BEGIN  2dup
                    1 cells - @ swap dup @ +                     1 cells - @ swap dup @ +
                    u<=                     u<=
Line 262  VARIABLE C-Pass Line 337  VARIABLE C-Pass
                         IF      drop S" REPEAT " .struc nl                          IF      drop S" REPEAT " .struc nl
                         ELSE    S" AGAIN " .struc nl                          ELSE    S" AGAIN " .struc nl
                         THEN                          THEN
                 ELSE    dup cell+ BranchAddr? Forward?                  ELSE    MyBranch cell+ @ LeaveCode =
                         IF      dup cell+ @ WhileCode2 =                          IF      S" LEAVE " .struc
                                 IF nl S" ELSE" .struc level+                          ELSE
                                 ELSE level- nl S" ELSE" .struc level+ THEN                                  dup cell+ BranchAddr? Forward?
                                 cell+ Disable swap !                                  IF      dup cell+ @ WhileCode2 =
                         ELSE    S" AHEAD" .struc level+                                          IF nl S" ELSE" .struc level+
                         THEN                                          ELSE level- nl S" ELSE" .struc level+ THEN
                                           cell+ Disable swap !
                                   ELSE    S" AHEAD" .struc level+
                                   THEN
                           THEN
                 THEN                  THEN
         THEN          THEN
         Debug?          Debug?
Line 276  VARIABLE C-Pass Line 355  VARIABLE C-Pass
         ELSE    cell+          ELSE    cell+
         THEN ;          THEN ;
   
 : MyBranch      ( a-addr -- a-addr a-addr2 )  
                 dup @ over +  
                 BranchAddr?  
                 BEGIN  
                 WHILE 1 cells - @  
                       over <>  
                 WHILE dup @ over +  
                       MoreBranchAddr?  
                 REPEAT  
                 SearchPointer @ 3 cells -  
                 ELSE    true ABORT" SEE: Table failure"  
                 THEN ;  
   
 : DebugBranch  : DebugBranch
         Debug?          Debug?
         IF      dup @ over + swap THEN ; \ return 2 different addresses          IF      dup @ over + swap THEN ; \ return 2 different addresses
Line 309  VARIABLE C-Pass Line 375  VARIABLE C-Pass
                                          IF WhileCode2 swap !                                           IF WhileCode2 swap !
                                          ELSE drop THEN                                           ELSE drop THEN
                                 level- nl                                  level- nl
                                 S" WHILE" .struc                                  S" WHILE " .struc
                                 level+                                  level+
                         ELSE    nl S" IF" .struc level+                          ELSE    MyBranch cell+ @ LeaveCode =
                                   IF   s" 0= ?LEAVE " .struc
                                   ELSE nl S" IF " .struc level+
                                   THEN
                         THEN                          THEN
                 THEN                  THEN
         THEN          THEN
         DebugBranch          DebugBranch
         cell+ ;          cell+ ;
   
 : c-do  
         Display? IF nl S" DO" .struc level+ THEN ;  
   
 : c-?do  
         Display? IF nl S" ?DO" .struc level+ THEN  
         DebugBranch cell+ ;  
   
 : c-for  : c-for
         Display? IF nl S" FOR" .struc level+ THEN ;          Display? IF nl S" FOR" .struc level+ THEN ;
   
 : c-next  
         Display? IF level- nl S" NEXT " .struc nl THEN  
         DebugBranch cell+ cell+ ;  
   
 : c-loop  : c-loop
         Display? IF level- nl S" LOOP " .struc nl THEN          Display? IF level- nl .name-without bl cemit nl THEN
         DebugBranch cell+ cell+ ;          DebugBranch cell+ 
           Scan? 
           IF      dup BranchAddr? 
                   BEGIN   WHILE cell+ LeaveCode swap !
                           dup MoreBranchAddr?
                   REPEAT
           THEN
           cell+ ;
   
 : c-+loop  : c-do
         Display? IF level- nl S" +LOOP " .struc nl THEN          Display? IF nl .name-without level+ THEN ;
         DebugBranch cell+ cell+ ;  
   
 : c-leave  
         Display? IF S" LEAVE " .struc THEN  
         Debug? IF dup @ + THEN cell+ ;  
   
 : c-?leave  : c-?do
         Display? IF S" ?LEAVE " .struc THEN          Display? IF nl S" ?DO" .struc level+ THEN
         cell+ DebugBranch swap cell+ swap cell+ ;          DebugBranch cell+ ;
   
 : c-exit  dup 1 cells -  : c-exit  dup 1 cells -
         CheckEnd          CheckEnd
Line 357  VARIABLE C-Pass Line 416  VARIABLE C-Pass
         THEN          THEN
         Debug? IF drop THEN ;          Debug? IF drop THEN ;
   
 : c-;code               \ end of create part  
         Display? IF S" DOES> " Com# .string THEN  
         Cell+ cell+ ;  
   
 : c-abort"  : c-abort"
         count 2dup + aligned -rot          count 2dup + aligned -rot
         Display?          Display?
Line 370  VARIABLE C-Pass Line 425  VARIABLE C-Pass
         ELSE    2drop          ELSE    2drop
         THEN ;          THEN ;
   
   [IFDEF] (does>)
   : c-does>               \ end of create part
           Display? IF S" DOES> " Com# .string THEN
           maxaligned /does-handler + ;
   [THEN]
   
   [IFDEF] (compile)
   : c-(compile)
       Display?
       IF
           s" POSTPONE " Com# .string
           dup @ look 0= ABORT" SEE: No valid XT"
           name>string 0 .string bl cemit
       THEN
       cell+ ;
   [THEN]
   
 CREATE C-Table  CREATE C-Table
         ' lit A,         ' c-lit A,                  ' lit A,            ' c-lit A,
         ' (s") A,        ' c-s" A,  [IFDEF] call    ' call A,           ' c-call A, [THEN]
         ' (.") A,        ' c-." A,                  ' (s") A,           ' c-c" A,
         ' "lit A,        ' c-c" A,                   ' (.") A,          ' c-c" A,
         ' ?branch A,     ' c-?branch A,                  ' "lit A,           ' c-c" A,
         ' branch A,      ' c-branch A,  [IFDEF] (c")    ' (c") A,           ' c-c" A, [THEN]
         ' leave A,       ' c-leave A,                  ' (do) A,           ' c-do A,
         ' ?leave A,      ' c-?leave A,  [IFDEF] (+do)   ' (+do) A,          ' c-do A, [THEN]
         ' (do) A,        ' c-do A,  [IFDEF] (u+do)  ' (u+do) A,         ' c-do A, [THEN]
         ' (?do) A,       ' c-?do A,  [IFDEF] (-do)   ' (-do) A,          ' c-do A, [THEN]
         ' (for) A,       ' c-for A,  [IFDEF] (u-do)  ' (u-do) A,         ' c-do A, [THEN]
         ' (loop) A,      ' c-loop A,                  ' (?do) A,          ' c-?do A,
         ' (+loop) A,     ' c-+loop A,                  ' (for) A,          ' c-for A,
         ' (next) A,      ' c-next A,                  ' ?branch A,        ' c-?branch A,
         ' ;s A,          ' c-exit A,                  ' branch A,         ' c-branch A,
         ' (;code) A,     ' c-;code A,                  ' (loop) A,         ' c-loop A,
         ' (abort") A,    ' c-abort" A,                  ' (+loop) A,        ' c-loop A,
         ' (compile) A,   ' c-(compile) A,  [IFDEF] (s+loop) ' (s+loop) A,       ' c-loop A, [THEN]
         0 ,  [IFDEF] (-loop) ' (-loop) A,        ' c-loop A, [THEN]
                   ' (next) A,         ' c-loop A,
                   ' ;s A,             ' c-exit A,
                   ' (abort") A,       ' c-abort" A,
   \ only defined if compiler is loaded
   [IFDEF] (compile) ' (compile) A,      ' c-(compile) A, [THEN]
   [IFDEF] (does>) ' (does>) A,        ' c-does> A, [THEN]
                   0 ,             here 0 ,
   
   avariable c-extender
   c-extender !
   
 \ DOTABLE                                               15may93jaw  \ DOTABLE                                               15may93jaw
   
 : DoTable ( cfa -- flag )  : DoTable ( cfa -- flag )
         C-Table          C-Table
         BEGIN   dup @ dup          BEGIN   dup @ dup 0= 
         WHILE   2 pick <>                  IF drop cell+ @ dup 
                     IF ( next table!) dup @ ELSE 
                           ( end!) 2drop false EXIT THEN 
                   THEN
                   \ jump over to extender, if any 26jan97jaw
                   2 pick <>
         WHILE   2 cells +          WHILE   2 cells +
         REPEAT          REPEAT
         nip cell+ @ EXECUTE          nip cell+ perform
         true          true
         ELSE          ;
         2drop drop false  
         THEN ;  
   
 : BranchTo? ( a-addr -- a-addr )  : BranchTo? ( a-addr -- a-addr )
         Display?  IF     dup BranchAddr?          Display?  IF    dup BranchAddr?
                         IF BEGIN cell+ @ dup 20 u>                          IF
                                   BEGIN cell+ @ dup 20 u>
                                 IF drop nl S" BEGIN " .struc level+                                  IF drop nl S" BEGIN " .struc level+
                                 ELSE                                  ELSE
                                   dup Disable <>                                    dup Disable <> over LeaveCode <> and
                                   IF   WhileCode2 =                                    IF   WhileCode2 =
                                        IF nl S" THEN " .struc nl ELSE                                         IF nl S" THEN " .struc nl ELSE
                                        level- nl S" THEN " .struc nl THEN                                         level- nl S" THEN " .struc nl THEN
Line 423  CREATE C-Table Line 508  CREATE C-Table
                   THEN ;                    THEN ;
   
 : analyse ( a-addr1 -- a-addr2 )  : analyse ( a-addr1 -- a-addr2 )
         Branches @ IF BranchTo? THEN      Branches @ IF BranchTo? THEN
         dup cell+ swap @      dup cell+ swap @
         dup >r DoTable r> swap IF drop EXIT THEN      dup >r DoTable r> swap IF drop EXIT THEN
         Display?      Display?
         IF look 0= ABORT" SEE: Bua!"      IF
            cell+ dup count 31 and rot wordinfo .string bl cemit          .word bl cemit
         ELSE drop      ELSE
         THEN ;          drop
       THEN ;
   
 : c-init  : c-init
         0 YPos ! 0 XPos !          0 YPos ! 0 XPos !
Line 440  CREATE C-Table Line 526  CREATE C-Table
         Branches on ;          Branches on ;
   
 : makepass ( a-addr -- )  : makepass ( a-addr -- )
         c-stop off      c-stop off
         BEGIN      BEGIN
                 analyse          analyse
                 c-stop @          c-stop @
         UNTIL drop ;      UNTIL drop ;
   
 DEFER dosee  Defer xt-see-xt ( xt -- )
   \ this one is just a forward declaration for indirect recursion
 : dopri .name ." is primitive" cr ;  
 : dovar .name ." is variable" cr ;  : .defname ( xt c-addr u -- )
 : docon  dup .name ." is constant, value: "      rot look
          cell+ (name>) >body @ . cr ;      if ( c-addr u nfa )
 : doval .name ." is value" cr ;          -rot type space .name
 : dodef .name ." is defered word, is: "      else
          here @ look 0= ABORT" SEE: No valid xt in defered word"          drop ." noname " type
         .name cr here @ look drop dosee ;      then
 : dodoe .name ." is created word" cr      space ;
         S" DOES> " Com# .string XPos @ Level !  
         here @ dup C-Pass @ DebugMode = IF ScanMode c-pass ! EXIT THEN  Defer discode ( addr u -- ) \ gforth
         ScanMode c-pass ! dup makepass  \G hook for the disassembler: disassemble code at addr of length u
         DisplayMode c-pass ! makepass ;  ' dump IS discode
 : doali .name ." is alias of "  
         here @ .name cr  : next-head ( addr1 -- addr2 ) \ gforth
         here @ dosee ;      \G find the next header starting after addr1, up to here (unreliable).
 : docol S" : " Com# .string      here swap u+do
         cell+ dup count $1F and 2 pick wordinfo .string bl cemit bl cemit          i head?
         ( XPos @ ) 2 Level !          if
         name> >body              i unloop exit
         C-Pass @ DebugMode = IF ScanMode c-pass ! EXIT THEN          then
         ScanMode c-pass ! dup makepass      cell +loop
         DisplayMode c-pass ! makepass ;      here ;
   
 create wordtypes  : umin ( u1 u2 -- u )
         Pri# ,   ' dopri A,      2dup u>
         Var# ,   ' dovar A,      if
         Con# ,   ' docon A,          swap
         Val# ,   ' doval A,      then
         Def# ,   ' dodef A,      drop ;
         Doe# ,   ' dodoe A,          
         Ali# ,   ' doali A,  : next-prim ( addr1 -- addr2 ) \ gforth
         Col# ,   ' docol A,      \G find the next primitive after addr1 (unreliable)
         0 ,      1+ >r -1 primstart
       begin ( umin head R: boundary )
 : (dosee) ( lfa -- )          @ dup
         dup cell+ dup c@ 32 and IF over .name ." is an immediate word" cr THEN      while
         wordinfo          tuck name>int >code-address ( head1 umin ca R: boundary )
         wordtypes          r@ - umin
         BEGIN dup @ dup          swap
         WHILE 2 pick = IF cell+ @ nip EXECUTE EXIT THEN      repeat
               2 cells +      drop dup r@ negate u>=
         REPEAT      \ "umin+boundary within [0,boundary)" = "umin within [-boundary,0)"
         2drop      if ( umin R: boundary ) \ no primitive found behind -> use a default length
         .name ." Don't know how to handle" cr ;          drop 31
       then
 ' (dosee) IS dosee      r> + ;
   
 : see   name find cr 0= IF ." Word unknown" cr drop exit THEN  : seecode ( xt -- )
         >name c-init      dup s" Code" .defname
         dosee ;      >code-address
       dup in-dictionary? \ user-defined code word?
 : xtc ( xt -- )       \ do see at xt      if
         Look 0= ABORT" SEE: No valid XT"          dup next-head
         cr c-init      else
         dosee ;          dup next-prim
       then
 : lfc   cr c-init cell+ dosee ;      over - discode
 : nfc   cr c-init dosee ;      ." end-code" cr ;
   : seevar ( xt -- )
       s" Variable" .defname cr ;
   : seeuser ( xt -- )
       s" User" .defname cr ;
   : seecon ( xt -- )
       dup >body ?
       s" Constant" .defname cr ;
   : seevalue ( xt -- )
       dup >body ?
       s" Value" .defname cr ;
   : seedefer ( xt -- )
       dup >body @ xt-see-xt cr
       dup s" Defer" .defname cr
       >name ?dup-if
           ." IS " .name cr
       else
           ." lastxt >body !"
       then ;
   : see-threaded ( addr -- )
       C-Pass @ DebugMode = IF
           ScanMode c-pass !
           EXIT
       THEN
       ScanMode c-pass ! dup makepass
       DisplayMode c-pass ! makepass ;
   : seedoes ( xt -- )
       dup s" create" .defname cr
       S" DOES> " Com# .string XPos @ Level !
       >does-code see-threaded ;
   : seecol ( xt -- )
       dup s" :" .defname nl
       2 Level !
       >body see-threaded ;
   : seefield ( xt -- )
       dup >body ." 0 " ? ." 0 0 "
       s" Field" .defname cr ;
   
   : xt-see ( xt -- ) \ gforth
       \G Decompile the definition represented by @i{xt}.
       cr c-init
       dup >does-code
       if
           seedoes EXIT
       then
       dup xtprim?
       if
           seecode EXIT
       then
       dup >code-address
       CASE
           docon: of seecon endof
           docol: of seecol endof
           dovar: of seevar endof
   [ [IFDEF] douser: ]
           douser: of seeuser endof
   [ [THEN] ]
   [ [IFDEF] dodefer: ]
           dodefer: of seedefer endof
   [ [THEN] ]
   [ [IFDEF] dofield: ]
           dofield: of seefield endof
   [ [THEN] ]
           over       of seecode endof \ direct threaded code words
           over >body of seecode endof \ indirect threaded code words
           2drop abort" unknown word type"
       ENDCASE ;
   
   : (xt-see-xt) ( xt -- )
       xt-see cr ." lastxt" ;
   ' (xt-see-xt) is xt-see-xt
   
   : (.immediate) ( xt -- )
       ['] execute = if
           ."  immediate"
       then ;
   
   : name-see ( nfa -- )
       dup name>int >r
       dup name>comp 
       over r@ =
       if \ normal or immediate word
           swap xt-see (.immediate)
       else
           r@ ['] ticking-compile-only-error =
           if \ compile-only word
               swap xt-see (.immediate) ."  compile-only"
           else \ interpret/compile word
               r@ xt-see-xt cr
               swap xt-see-xt cr
               ." interpret/compile " over .name (.immediate)
           then
       then
       rdrop drop ;
   
   : see ( "<spaces>name" -- ) \ tools
       \G Locate @var{name} using the current search order. Display the
       \G definition of @var{name}. Since this is achieved by decompiling
       \G the definition, the formatting is mechanised and some source
       \G information (comments, interpreted sequences within definitions
       \G etc.) is lost.
       name find-name dup 0=
       IF
           drop -&13 throw
       THEN
       name-see ;
   
   

Removed from v.1.2  
changed lines
  Added in v.1.40


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