X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cc_runtime.h;h=5b6d2c7287b962c284f81b0d58f30377d3513a81;hb=45c0de28763808112fd2f46ea311b6bb0c6050b3;hp=9a01ff83359d48cad592fe1b7bd33fa29a46c03c;hpb=8af582d578f31fcecd6dac626ec996749605282e;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cc_runtime.h b/cc_runtime.h index 9a01ff8..5b6d2c7 100644 --- a/cc_runtime.h +++ b/cc_runtime.h @@ -59,13 +59,39 @@ SPAGAIN; \ } while (0) -#define PP_ENTERTRY(jmpbuf,label) do { \ - dJMPENV; \ +#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; \ - JMPENV_PUSH(ret); \ + B_JMPENV_PUSH(jmpbuf,ret); \ switch (ret) { \ - case 1: JMPENV_POP; JMPENV_JUMP(1); \ - case 2: JMPENV_POP; JMPENV_JUMP(2); \ - case 3: JMPENV_POP; SPAGAIN; goto label;\ - } \ + 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