実装してみた。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;
}