direct threaded codeの無効と有効で切り分けられるようにしてみた。
無効にする場合は
#define DIRECT_THREADED_CODE
#include <stdio.h> #define MAX_ISEC 200 enum Ins { INS1 = 0, INS2 = 1, RETURN = 2 }; #define DIRECT_THREADED_CODE #ifdef DIRECT_THREADED_CODE #define SWITCH(v) #define CASE(LABEL) LABEL: #define BREAK goto *isec_addr[++pc] #else #define SWITCH(v) switch (v) #define CASE(LABEL) case LABEL: #define BREAK break #endif void eval(unsigned char *src, int line) { #ifdef DIRECT_THREADED_CODE void *tbl[] = { &&INS1, &&INS2, &&RETURN }; void *isec_addr[MAX_ISEC]; int i; for (i = 0; i < line; i++) { isec_addr[i] = tbl[src[i]]; } printf("use direct threaded code\n"); #endif int pc = 0; for (;;) { SWITCH(src[pc++]) { CASE(INS1) printf("ins1\n"); BREAK; CASE(INS2) printf("ins2\n"); BREAK; CASE(RETURN) printf("return\n"); return; BREAK; } } } int main(int argc, char **argv) { unsigned char src[] = { INS1, INS2, INS2, INS1, INS2, RETURN }; eval(src, sizeof(src) / sizeof(src[0])); return 0; }