[gforth] / gforth / wordinfo.fs  

gforth: gforth/wordinfo.fs


1 : anton 1.1 \ WORDINFO.FS V1.0 17may93jaw
2 :    
3 : anton 1.28 \ Copyright (C) 1995,1996,1998,2000,2003,2007 Free Software Foundation, Inc.
4 : anton 1.8
5 :     \ This file is part of Gforth.
6 :    
7 :     \ Gforth is free software; you can redistribute it and/or
8 :     \ modify it under the terms of the GNU General Public License
9 : anton 1.27 \ as published by the Free Software Foundation, either version 3
10 : anton 1.8 \ of the License, or (at your option) any later version.
11 :    
12 :     \ This program is distributed in the hope that it will be useful,
13 :     \ but WITHOUT ANY WARRANTY; without even the implied warranty of
14 :     \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 :     \ GNU General Public License for more details.
16 :    
17 :     \ You should have received a copy of the GNU General Public License
18 : anton 1.27 \ along with this program. If not, see http://www.gnu.org/licenses/.
19 : anton 1.8
20 : anton 1.1 \ May be cross-compiled
21 :     \ If you want check values then exclude comments,
22 :     \ but keep in mind that this can't be cross-compiled
23 :    
24 : anton 1.19 require look.fs
25 : anton 1.1
26 :     \ Wordinfo is a tool that checks a nfa
27 :     \ and finds out what wordtype we have
28 :     \ it is used in SEE.FS
29 :    
30 : anton 1.9 \ the old alias? did not work and it is not used, so I changed
31 :     \ it in many respects - anton
32 :     : alias? ( nfa1 -- nfa2|0 )
33 : anton 1.20 \ if nfa1 is an alias, nfa2 is the name of the original word.
34 :     \ if the original word has no name, return 0.
35 : anton 1.23 dup cell+ @ alias-mask and 0=
36 : anton 1.12 IF ( nfa1 )
37 : anton 1.20 ((name>)) @ >name
38 : anton 1.9 ELSE
39 :     drop 0
40 :     THEN ;
41 : anton 1.1
42 :     : var? ( nfa -- flag )
43 : anton 1.12 ((name>)) >code-address dovar: = ;
44 : anton 1.1
45 :     : con? ( nfa -- flag )
46 : anton 1.12 ((name>)) >code-address docon: = ;
47 : anton 1.1
48 : pazsan 1.5 : user? ( nfa -- flag )
49 : anton 1.12 ((name>)) >code-address douser: = ;
50 : pazsan 1.5
51 : anton 1.1 : does? ( nfa -- flag )
52 : anton 1.12 ((name>))
53 : anton 1.13 >does-code 0<> ;
54 : anton 1.1
55 :     : defered? ( nfa -- flag )
56 : anton 1.12 ((name>)) >code-address dodefer: = ;
57 : anton 1.1
58 :     : colon? ( nfa -- flag )
59 : anton 1.12 ((name>)) >code-address docol: = ;
60 : anton 1.7
61 :     \ the above words could be factored with create-does>, but this would
62 :     \ probably make this file incompatible with cross.
63 : anton 1.1
64 : jwilke 1.14 [IFDEF] forthstart
65 :     : xtprim? ( xt -- flag )
66 : anton 1.18 in-dictionary? 0= ; \ !! does not work for CODE words
67 : jwilke 1.14 [ELSE]
68 :     : xtprim? ( xt -- flag )
69 : anton 1.15 dup >body swap >code-address = ; \ !! works only for indirect threaded code
70 :     \ !! does not work for primitives
71 : jwilke 1.14 [THEN]
72 : anton 1.1 : prim? ( nfa -- flag )
73 : jwilke 1.14 name>int xtprim? ;
74 : anton 1.1
75 :     \ None nestable IDs:
76 :    
77 :     1 CONSTANT Pri# \ Primitives
78 :     2 CONSTANT Con# \ Constants
79 :     3 CONSTANT Var# \ Variables
80 :     4 CONSTANT Val# \ Values
81 :    
82 :     \ Nestabe IDs:
83 :    
84 :     5 CONSTANT Doe# \ Does part
85 :     6 CONSTANT Def# \ Defer
86 :     7 CONSTANT Col# \ Colon def
87 : pazsan 1.5 8 CONSTANT Use# \ User variable
88 : anton 1.1
89 :     \ Nobody knows:
90 :    
91 : pazsan 1.5 9 CONSTANT Ali# \ Alias
92 : anton 1.1
93 : pazsan 1.5 10 CONSTANT Str# \ Structure words
94 : anton 1.1
95 : pazsan 1.5 11 CONSTANT Com# \ Compiler directives : ; POSTPONE
96 : anton 1.1
97 :     CREATE InfoTable
98 : pazsan 1.5 ' Prim? A, Pri# ,
99 :     ' Alias? A, Ali# ,
100 :     ' Con? A, Con# ,
101 :     ' Var? A, Var# ,
102 :     \ ' Value? A, Val# ,
103 : anton 1.1 ' Defered? A, Def# ,
104 : pazsan 1.5 ' Does? A, Doe# ,
105 :     ' Colon? A, Col# ,
106 :     ' User? A, Use# ,
107 : anton 1.1 0 ,
108 :    
109 :     : WordInfo ( nfa --- code )
110 :     InfoTable
111 :     BEGIN dup @ dup
112 :     WHILE swap 2 cells + swap
113 :     2 pick swap execute
114 :     UNTIL
115 :     1 cells - @ nip
116 :     ELSE
117 :     2drop drop 0
118 :     THEN ;
119 :    

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help