#include typedef void *Label; typedef Label *inst_t; Label *vm(inst_t *ip, long *sp) { if (ip==NULL) { static Label prims[] = {&&dummy0, &&plus, &&dummy1, &&dummy2, &&dummy3, &&dummy4, &&dummy5}; return prims; } goto ***ip++; dummy0: /* + */ sp[0]--; goto ***ip++; plus: /* + */ sp[1] += sp[0]; sp++; Label next = **ip; ip++; goto *next; dummy1: /* + */ sp[0] = 0; goto ***ip++; dummy2: /* + */ sp++; goto ***ip++; dummy3: /* + */ sp--; sp[0] = sp[1]; goto ***ip++; dummy4: /* + */ sp[1] = 0; goto ***ip++; dummy5: ip = (inst_t *)sp[0]; goto ***ip++; }