Go to the first, previous, next, last section, table of contents.


Threading

GNU C's labels as values extension (available since gcc-2.0, see section `Labels as Values' in GNU C Manual) 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).


Go to the first, previous, next, last section, table of contents.