Mercurial > hg > CbC > CbC_gcc
view CbC-examples/c-next.c @ 136:4627f235cf2a
fix c-next example
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Nov 2018 14:11:56 +0900 |
parents | 71d4882a9ac3 |
children | d22083d7f10b |
line wrap: on
line source
#define NEXT_OP(i) (i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op) typedef unsigned short MVMuint16; typedef unsigned char MVMuint8; typedef long* MVMRegister; typedef void* MVMCompUnit; typedef void* MVMCallsite; typedef struct MVMThreadContext { MVMuint8 **interp_cur_op; MVMuint8 **interp_bytecode_start; MVMRegister **interp_reg_base; MVMCompUnit **interp_cu; } MVMThreadContext; typedef struct interp { MVMuint16 op; /* Points to the place in the bytecode right after the current opcode. */ /* See the NEXT_OP macro for making sense of this */ MVMuint8 *cur_op; /* The current frame's bytecode start. */ MVMuint8 *bytecode_start; /* Points to the base of the current register set for the frame we * * are presently in. */ MVMRegister *reg_base; /* Points to the current compilation unit. */ MVMCompUnit *cu; /* The current call site we're constructing. */ MVMCallsite *cur_callsite; MVMThreadContext *tc; __code (*ret)(int, void*); __code (*main_ret)(int, void*); void *env; } INTER,*INTERP; __code cbc_next(INTERP i); __code cbc_no_op(INTERP i){ goto cbc_next(i); } __code cbc_exit(INTERP i){ goto i->main_ret(0,i->env); } __code (* CODES[])(INTERP) = { cbc_no_op, cbc_no_op, cbc_exit, }; __code cbc_next(INTERP i){ __code (*c)(INTERP); c = CODES[NEXT_OP(i)]; goto c(i); } int interp_run(MVMThreadContext *tc){ return 0; } int main(int argc, char **argv){ INTER inter = {0,0,0,0,0,0,0,0,0}; INTERP i = &inter; MVMuint8 cur_ops[] = {0,1,2,0,3,2}; i->main_ret = _CbC_return; i->env = _CbC_environment; i->cur_op = cur_ops; MVMThreadContext tc0, *tc; tc = &tc0; tc->interp_cur_op = &i->cur_op; tc->interp_bytecode_start = &i->bytecode_start; tc->interp_reg_base = &i->reg_base; tc->interp_cu = &i->cu; goto cbc_next(i); // return 0; }