| \ LOOK.FS xt -> lfa 22may93jaw |
\ LOOK.FS xt -> lfa 22may93jaw |
| |
|
| \ Copyright (C) 1995,1996,1997,2000 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,2000,2003 Free Software Foundation, Inc. |
| |
|
| \ This file is part of Gforth. |
\ This file is part of Gforth. |
| |
|
| \ Gforth is free software; you can redistribute it and/or |
\ Gforth is free software; you can redistribute it and/or |
| \ modify it under the terms of the GNU General Public License |
\ modify it under the terms of the GNU General Public License |
| \ as published by the Free Software Foundation; either version 2 |
\ as published by the Free Software Foundation, either version 3 |
| \ of the License, or (at your option) any later version. |
\ of the License, or (at your option) any later version. |
| |
|
| \ This program is distributed in the hope that it will be useful, |
\ This program is distributed in the hope that it will be useful, |
| \ GNU General Public License for more details. |
\ GNU General Public License for more details. |
| |
|
| \ You should have received a copy of the GNU General Public License |
\ You should have received a copy of the GNU General Public License |
| \ along with this program; if not, write to the Free Software |
\ along with this program. If not, see http://www.gnu.org/licenses/. |
| \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
| |
|
| \ Look checks first if the word is a primitive. If yes then the |
\ Look checks first if the word is a primitive. If yes then the |
| \ vocabulary in the primitive area is beeing searched, meaning |
\ vocabulary in the primitive area is beeing searched, meaning |
| @ |
@ |
| then ; |
then ; |
| |
|
| : (look) ( xt startlfa -- lfa flag ) |
: search-name ( xt startlfa -- nt|0 ) |
| swap decompile-prim false rot |
\ look up name of primitive with code at xt |
| |
swap |
| |
>r false swap |
| BEGIN |
BEGIN |
| @ dup |
@ dup |
| WHILE |
WHILE |
| dup name>int xt>threaded |
dup name>int |
| 3 pick = IF |
r@ = IF |
| nip dup |
nip dup |
| THEN |
THEN |
| REPEAT |
REPEAT |
| drop nip |
drop rdrop ; |
| dup 0<> ; |
|
| |
|
| |
: threaded>xt ( ca -- xt|0 ) |
| |
\G For the code address ca of a primitive, find the xt (or 0). |
| |
[IFDEF] decompile-prim |
| |
decompile-prim |
| |
[THEN] |
| |
\ walk through the array of primitive CAs |
| |
>r ['] noop begin |
| |
dup @ while |
| |
dup xt>threaded r@ = if |
| |
rdrop exit |
| |
endif |
| |
cell+ |
| |
repeat |
| |
drop rdrop 0 ; |
| |
|
| \ !!! nicht optimal! |
\ !!! nicht optimal! |
| [IFUNDEF] look |
[IFUNDEF] look |
| |
|
| has? rom |
has? rom |
| [IF] |
[IF] |
| : look |
: prim>name ( xt -- nt|0 ) |
| |
forth-wordlist @ search-name ; |
| |
|
| |
: look ( xt -- lfa flag ) |
| dup [ unlock rom-dictionary area lock ] |
dup [ unlock rom-dictionary area lock ] |
| literal literal within |
literal literal within |
| IF |
IF |
| >head-noprim dup ?? <> |
>head-noprim dup ?? <> |
| ELSE |
ELSE |
| forth-wordlist @ (look) |
prim>name dup 0<> |
| THEN ; |
THEN ; |
| [ELSE] |
[ELSE] |
| : look ( cfa -- lfa flag ) |
: look ( cfa -- lfa flag ) |
| |
|
| : PrimStart ['] true >head-noprim ; |
: PrimStart ['] true >head-noprim ; |
| |
|
| : look ( cfa -- lfa flag ) |
: prim>name ( xt -- nt|0 ) |
| |
PrimStart search-name ; |
| |
|
| |
: look ( xt -- lfa flag ) |
| dup in-dictionary? |
dup in-dictionary? |
| IF |
IF |
| >head-noprim dup ??? <> |
>head-noprim dup ??? <> |
| ELSE |
ELSE |
| PrimStart (look) |
prim>name dup 0<> |
| THEN ; |
THEN ; |
| |
|
| [THEN] |
[THEN] |
| [THEN] |
[THEN] |
| |
|
| : >head ( cfa -- nt|0 ) \ gforth to-head |
: threaded>name ( ca -- nt|0 ) |
| \G tries to find the name token nt of the word represented by cfa; |
threaded>xt prim>name ; |
| \G returns 0 if it fails. This word is not absolutely reliable, |
|
| \G it may give false positives and produce wrong nts. |
: >name ( xt -- nt|0 ) \ gforth to-name |
| |
\G tries to find the name token @var{nt} of the word represented |
| |
\G by @var{xt}; returns 0 if it fails. This word is not |
| |
\G absolutely reliable, it may give false positives and produce |
| |
\G wrong nts. |
| look and ; |
look and ; |
| |
|
| ' >head ALIAS >name \ gforth to-name |
' >name ALIAS >head \ gforth to-head |
| \G old name of @code{>head} |
\G another name of @code{>name} |