X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cc_runtime.h;h=5b6d2c7287b962c284f81b0d58f30377d3513a81;hb=45c0de28763808112fd2f46ea311b6bb0c6050b3;hp=475af3bb9ba64f92dbc6ce3b0cace36751c3348c;hpb=f64a6365a4321eb92de65e5c2074b53cd29e0ca6;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cc_runtime.h b/cc_runtime.h index 475af3b..5b6d2c7 100644 --- a/cc_runtime.h +++ b/cc_runtime.h @@ -1,4 +1,4 @@ -#define DOOP(ppname) PUTBACK; op = ppname(); SPAGAIN +#define DOOP(ppname) PUTBACK; PL_op = ppname(ARGS); SPAGAIN #define PP_LIST(g) do { \ dMARK; \ @@ -6,13 +6,13 @@ if (++MARK <= SP) \ *MARK = *SP; \ else \ - *MARK = &sv_undef; \ + *MARK = &PL_sv_undef; \ SP = MARK; \ } \ } while (0) #define MAYBE_TAINT_SASSIGN_SRC(sv) \ - if (tainting && tainted && (!SvGMAGICAL(left) || !SvSMAGICAL(left) || \ + if (PL_tainting && PL_tainted && (!SvGMAGICAL(left) || !SvSMAGICAL(left) || \ !((mg=mg_find(left, 't')) && mg->mg_len & 1)))\ TAINT_NOT @@ -28,47 +28,70 @@ #define PP_UNSTACK do { \ TAINT_NOT; \ - stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp; \ + PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp; \ FREETMPS; \ - oldsave = scopestack[scopestack_ix - 1]; \ + oldsave = PL_scopestack[PL_scopestack_ix - 1]; \ LEAVE_SCOPE(oldsave); \ SPAGAIN; \ } while(0) -#if PATCHLEVEL < 3 -#define RUN() run() -#else -#define RUN() runops() -#endif - /* Anyone using eval "" deserves this mess */ #define PP_EVAL(ppaddr, nxt) do { \ - Sigjmp_buf oldtop; \ - Copy(top_env,oldtop,1,Sigjmp_buf); \ + dJMPENV; \ + int ret; \ PUTBACK; \ - switch (Sigsetjmp(top_env,1)) { \ + JMPENV_PUSH(ret); \ + switch (ret) { \ case 0: \ - op = ppaddr(); \ - retstack[retstack_ix - 1] = Nullop; \ - Copy(oldtop,top_env,1,Sigjmp_buf); \ - if (op != nxt) RUN(); \ + PL_op = ppaddr(ARGS); \ + PL_retstack[PL_retstack_ix - 1] = Nullop; \ + if (PL_op != nxt) CALLRUNOPS(); \ + JMPENV_POP; \ break; \ - case 1: Copy(oldtop,top_env,1,Sigjmp_buf); Siglongjmp(top_env,1); \ - case 2: Copy(oldtop,top_env,1,Sigjmp_buf); Siglongjmp(top_env,2); \ + case 1: JMPENV_POP; JMPENV_JUMP(1); \ + case 2: JMPENV_POP; JMPENV_JUMP(2); \ case 3: \ - Copy(oldtop,top_env,1,Sigjmp_buf); \ - if (restartop != nxt) \ - Siglongjmp(top_env, 3); \ + JMPENV_POP; \ + if (PL_restartop != nxt) \ + JMPENV_JUMP(3); \ } \ - op = nxt; \ + PL_op = nxt; \ SPAGAIN; \ } while (0) -#define PP_ENTERTRY(jmpbuf,label) do { \ - Copy(top_env,jmpbuf,1,Sigjmp_buf); \ - switch (Sigsetjmp(top_env,1)) { \ - case 1: Copy(jmpbuf,top_env,1,Sigjmp_buf); Siglongjmp(top_env,1); \ - case 2: Copy(jmpbuf,top_env,1,Sigjmp_buf); Siglongjmp(top_env,2); \ - case 3: Copy(jmpbuf,top_env,1,Sigjmp_buf); SPAGAIN; goto label; \ - } \ +#define B_JMPENV_PUSH(cur_env,v) \ + STMT_START { \ + cur_env.je_prev = PL_top_env; \ + OP_REG_TO_MEM; \ + cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, 1); \ + OP_MEM_TO_REG; \ + PL_top_env = &cur_env; \ + cur_env.je_mustcatch = FALSE; \ + (v) = cur_env.je_ret; \ + } STMT_END +#define B_JMPENV_POP(cur_env) \ + STMT_START { PL_top_env = cur_env.je_prev; } STMT_END + +#define B_JMPENV_JUMP(cur_env,v) \ + STMT_START { \ + OP_REG_TO_MEM; \ + if (PL_top_env->je_prev) \ + PerlProc_longjmp(PL_top_env->je_buf, (v)); \ + if ((v) == 2) \ + PerlProc_exit(STATUS_NATIVE_EXPORT); \ + PerlIO_printf(PerlIO_stderr(), "panic: top_env\n"); \ + PerlProc_exit(1); \ + } STMT_END + + +#define PP_ENTERTRY(jmpbuf,label) { \ + int ret; \ + B_JMPENV_PUSH(jmpbuf,ret); \ + switch (ret) { \ + case 1: B_JMPENV_POP(jmpbuf); B_JMPENV_JUMP(jmpbuf,1); \ + case 2: B_JMPENV_POP(jmpbuf); B_JMPENV_JUMP(jmpbuf,2); \ + case 3: B_JMPENV_POP(jmpbuf); SPAGAIN; goto label;\ + } \ } while (0) + +#define PP_LEAVETRY PL_top_env=PL_top_env->je_prev