Next: Primitives, Previous: Portability, Up: Engine
GNU C's labels as values extension (available since gcc-2.0,
see Labels as Values)
makes it possible to take the address of label by writing
&&label. This address can then be used in a statement like
goto *address. I.e., goto *&&x is the same as
goto x.
With this feature an indirect threaded NEXT looks like:
cfa = *ip++;
ca = *cfa;
goto *ca;
For those unfamiliar with the names: ip is the Forth instruction
pointer; the cfa (code-field address) corresponds to ANS Forths
execution token and points to the code field of the next word to be
executed; The ca (code address) fetched from there points to some
executable code, e.g., a primitive or the colon definition handler
docol.
Direct threading is even simpler:
ca = *ip++;
goto *ca;
Of course we have packaged the whole thing neatly in macros called
NEXT and NEXT1 (the part of NEXT after fetching the cfa).