X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=scope.h;h=a65cb628a9983e6579bc45563639863e87f604d2;hb=39e571d41067215a80f26089b260f1418caeb36b;hp=debe1f88a7fc903f22342cdf78070011a83897ec;hpb=22921e25517d6c195d0fab9eb946bfafb563c256;p=p5sagit%2Fp5-mst-13.2.git diff --git a/scope.h b/scope.h index debe1f8..a65cb62 100644 --- a/scope.h +++ b/scope.h @@ -22,6 +22,7 @@ #define SAVEt_REGCONTEXT 21 #define SAVEt_STACK_POS 22 #define SAVEt_I16 23 +#define SAVEt_OP 24 #define SSCHECK(need) if (savestack_ix + need > savestack_max) savestack_grow() #define SSPUSHINT(i) (savestack[savestack_ix++].any_i32 = (I32)(i)) @@ -37,9 +38,6 @@ #define SAVETMPS save_int((int*)&tmps_floor), tmps_floor = tmps_ix #define FREETMPS if (tmps_ix > tmps_floor) free_tmps() -#ifdef DEPRECATED -#define FREE_TMPS() FREETMPS -#endif #define ENTER push_scope() #define LEAVE pop_scope() @@ -69,7 +67,7 @@ SSPUSHINT(stack_sp - stack_base); \ SSPUSHINT(SAVEt_STACK_POS); \ } STMT_END - +#define SAVEOP() save_op() /* A jmpenv packages the state required to perform a proper non-local jump. * Note that there is a start_env initialized when perl starts, and top_env @@ -95,11 +93,21 @@ struct jmpenv { typedef struct jmpenv JMPENV; +#ifdef OP_IN_REGISTER +#define OP_REG_TO_MEM opsave = op +#define OP_MEM_TO_REG op = opsave +#else +#define OP_REG_TO_MEM NOOP +#define OP_MEM_TO_REG NOOP +#endif + #define dJMPENV JMPENV cur_env #define JMPENV_PUSH(v) \ STMT_START { \ cur_env.je_prev = top_env; \ + OP_REG_TO_MEM; \ cur_env.je_ret = Sigsetjmp(cur_env.je_buf, 1); \ + OP_MEM_TO_REG; \ top_env = &cur_env; \ cur_env.je_mustcatch = FALSE; \ (v) = cur_env.je_ret; \ @@ -108,6 +116,7 @@ typedef struct jmpenv JMPENV; STMT_START { top_env = cur_env.je_prev; } STMT_END #define JMPENV_JUMP(v) \ STMT_START { \ + OP_REG_TO_MEM; \ if (top_env->je_prev) \ Siglongjmp(top_env->je_buf, (v)); \ if ((v) == 2) \