direct threaded code

実装してみた。gccじゃないとコンパイルできない。

#include <stdio.h>

#define MAX_ISEC 200

enum Ins {
    INS1   = 0,
    INS2   = 1,
    RETURN = 2
};

void eval(unsigned char *src, int line)
{
    void *tbl[] = {
	&&INS1, &&INS2, &&RETURN
    };
    int i, pc = 0;
    void *isec_addr[MAX_ISEC];

    for (i = 0; i < line; i++) {
	isec_addr[i] =  tbl[src[i]];
    }
    
 INS1:
    printf("ins1\n");
    goto *isec_addr[++pc];

 INS2:
    printf("ins2\n");
    goto *isec_addr[++pc];

 RETURN:   
    printf("return\n");
    return;
}

int main(int argc, char **argv) 
{
    unsigned char src[] = {
	INS1,
	INS2,
	INS2,
	INS1,
	INS2,
	RETURN
    };
    eval(src, sizeof(src) / sizeof(src[0]));
    return 0;
}