#define NUM2PTR(x) ((SCM *) (SCM_UNPACK(x) & ~2)) { //C trampolines int ret; SCM *spp; const SCM *vec; int (*subr)(SCM **spp, int nargs, const SCM *closure, const SCM *end); vm_c_call: //printf("c call!\n"); vec = SCM_I_VECTOR_ELTS(SCM_CDR(program)); //VM_HANDLE_INTERRUPTS; //SYNC_REGISTER (); spp = sp; SCM *sp_old = sp; //printf("dp %p\n",sp); subr = (subr_type) NUM2PTR(vec[0]); ret = subr(&spp,nargs,vec + 1,stack_limit); //CACHE_REGISTER (); sp = spp; if(ret<0) { //printf("return call\n"); sp = sp + ret - 2; sp[0] = sp[-ret + 2]; //printf("dp %p, n = %d\n",(void *)(sp_old-sp), nargs); program = SCM_FRAME_PROGRAM (fp); NEXT; } nargs = ret; program = sp[-nargs]; if(SCM_CONSP(program) && scm_is_eq(SCM_CAR(program),c_closure_tag)) goto vm_c_call; goto vm_call; vm_c_tail_call: vec = SCM_I_VECTOR_ELTS(SCM_CDR(program)); subr = (subr_type) NUM2PTR(vec[0]); //printf("c tail call!\n"); //VM_HANDLE_INTERRUPTS; //SYNC_REGISTER (); spp = sp; ret = subr(&spp, nargs, vec + 1, stack_limit); //CACHE_REGISTER (); sp = spp; if(ret<0) { sp = sp + ret + 1; goto vm_return; } nargs = ret; program = sp[-nargs]; if(SCM_CONSP(program) && scm_is_eq(SCM_CAR(program),c_closure_tag)) goto vm_c_tail_call; goto vm_tail_call; }