読者です 読者をやめる 読者になる 読者になる

スレッデッド・コード

void *code_table[10];
int pc;

static void *label_table[3];

void
threaded()
{
        int my_pc;
        static const void *labels[] = {
                &&L01,
                &&L02,
                &&L03,
        };

        if ( label_table[0] == 0 ) {
                int i;
                for( i = 0; i < sizeof(labels)/sizeof(void *); ++i ) {
                        label_table[i] = (void *)labels[i];
                }
                return;
        }
        my_pc = pc;

        goto *code_table[my_pc++];

L01:
        printf("L01\n");
        goto *code_table[my_pc++];

L02:
        printf("L02\n");
        goto *code_table[my_pc++];

L03:
        printf("L03\n");
        pc = my_pc;
        return;
}

int
main(int argc, char **argv)
{
        threaded();

        code_table[0] = label_table[0];
        code_table[1] = label_table[1];
        code_table[2] = label_table[0];
        code_table[3] = label_table[1];
        code_table[4] = label_table[2];
        pc = 0;

        threaded();
}