-#define DOOP(ppname) PUTBACK; op = ppname(); SPAGAIN
+#define DOOP(ppname) PUTBACK; PL_op = ppname(ARGS); SPAGAIN
#define PP_LIST(g) do { \
dMARK; \
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
#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