A direct-threaded representation of program code is simply a vector of procedure pointers to call, in the order they appear. In x86 assembly language, the "inner interpreter" of such a representation is drop-dead trivially simple:
LODSD JMP EAXThis assumes that ESI contains the program's next-PC value.
Direct call threading (usually referred to as just "call threading") is also possible:
; in x86 assembly runVM: MOV EAX,[ESI] ADD ESI,4 CALL EAX JMP runVM /* In C; if global state is kept in global variables, then there is no need for a specific environment. */ void runVM(Instruction *virtualIP, Environment *env) { while(ShouldNotQuit?(env)) { (*virtualIP++)(env); } }Note that some C compilers permit computed goto expressions, such as GCC. If these are available, then C can also be used to implement a true direct threaded interpreter as well, thus avoiding the overheads of subroutine threading.
Contrast with IndirectThreadedCode, SubroutineThreadedCode, TokenThreadedCode