Next: , Previous: Portability, Up: Engine


14.2 Threading

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).