more testsuite smarts (many of them courtesy Ilya)
[p5sagit/p5-mst-13.2.git] / cc_runtime.h
index 9a01ff8..5b6d2c7 100644 (file)
        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