X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=scope.h;h=3ac4a59d51045225da90c13090cfe8827298f262;hb=771c48746478d09364a137ddcf848a480cc787fe;hp=d9fe15a0a3af24a53defc55d5d30a801a5bbc527;hpb=462e5cf694f345fbf34a1f95e9a82957e59dcc2b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/scope.h b/scope.h index d9fe15a..3ac4a59 100644 --- a/scope.h +++ b/scope.h @@ -22,7 +22,10 @@ #define SAVEt_REGCONTEXT 21 #define SAVEt_STACK_POS 22 #define SAVEt_I16 23 -#define SAVEt_OP 24 +#define SAVEt_AELEM 24 +#define SAVEt_HELEM 25 +#define SAVEt_OP 26 +#define SAVEt_HINTS 27 #define SSCHECK(need) if (savestack_ix + need > savestack_max) savestack_grow() #define SSPUSHINT(i) (savestack[savestack_ix++].any_i32 = (I32)(i)) @@ -38,12 +41,24 @@ #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 +#ifdef DEBUGGING +#define ENTER \ + STMT_START { \ + push_scope(); \ + DEBUG_l(WITH_THR(deb("ENTER scope %ld at %s:%d\n", \ + scopestack_ix, __FILE__, __LINE__))); \ + } STMT_END +#define LEAVE \ + STMT_START { \ + DEBUG_l(WITH_THR(deb("LEAVE scope %ld at %s:%d\n", \ + scopestack_ix, __FILE__, __LINE__))); \ + pop_scope(); \ + } STMT_END +#else #define ENTER push_scope() #define LEAVE pop_scope() +#endif #define LEAVE_SCOPE(old) if (savestack_ix > old) leave_scope(old) /* @@ -63,15 +78,38 @@ #define SAVECLEARSV(sv) save_clearsv(SOFT_CAST(SV**)&(sv)) #define SAVEDELETE(h,k,l) \ save_delete(SOFT_CAST(HV*)(h), SOFT_CAST(char*)(k), (I32)(l)) +#ifdef PERL_OBJECT +#define CALLDESTRUCTOR this->*SSPOPDPTR #define SAVEDESTRUCTOR(f,p) \ - save_destructor(SOFT_CAST(void(*)_((void*)))(f),SOFT_CAST(void*)(p)) -#define SAVESTACK_POS() STMT_START { \ - SSCHECK(2); \ - SSPUSHINT(stack_sp - stack_base); \ - SSPUSHINT(SAVEt_STACK_POS); \ - } STMT_END + save_destructor((DESTRUCTORFUNC)(FUNC_NAME_TO_PTR(f)), \ + SOFT_CAST(void*)(p)) +#else +#define CALLDESTRUCTOR *SSPOPDPTR +#define SAVEDESTRUCTOR(f,p) \ + save_destructor(SOFT_CAST(void(*)_((void*)))(FUNC_NAME_TO_PTR(f)), \ + SOFT_CAST(void*)(p)) +#endif + +#define SAVESTACK_POS() \ + STMT_START { \ + SSCHECK(2); \ + SSPUSHINT(stack_sp - stack_base); \ + SSPUSHINT(SAVEt_STACK_POS); \ + } STMT_END + #define SAVEOP() save_op() +#define SAVEHINTS() \ + STMT_START { \ + if (hints & HINT_LOCALIZE_HH) \ + save_hints(); \ + else { \ + SSCHECK(2); \ + SSPUSHINT(hints); \ + SSPUSHINT(SAVEt_HINTS); \ + } \ + } STMT_END + /* 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 * points to this initially, so top_env should always be non-null. @@ -109,7 +147,7 @@ typedef struct jmpenv JMPENV; STMT_START { \ cur_env.je_prev = top_env; \ OP_REG_TO_MEM; \ - cur_env.je_ret = Sigsetjmp(cur_env.je_buf, 1); \ + cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, 1); \ OP_MEM_TO_REG; \ top_env = &cur_env; \ cur_env.je_mustcatch = FALSE; \ @@ -121,11 +159,11 @@ typedef struct jmpenv JMPENV; STMT_START { \ OP_REG_TO_MEM; \ if (top_env->je_prev) \ - Siglongjmp(top_env->je_buf, (v)); \ + PerlProc_longjmp(top_env->je_buf, (v)); \ if ((v) == 2) \ - exit(STATUS_NATIVE_EXPORT); \ + PerlProc_exit(STATUS_NATIVE_EXPORT); \ PerlIO_printf(PerlIO_stderr(), "panic: top_env\n"); \ - exit(1); \ + PerlProc_exit(1); \ } STMT_END #define CATCH_GET (top_env->je_mustcatch)