X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=scope.h;h=29bc4c6e276934251fb3429f568f0a61faf08530;hb=32babee08ee923133079392c9eae66cc543e1115;hp=6cfe1247e01c5a2aeca6eeef730333682a0d9c1a;hpb=d6376244c2261025775e8b11a6a64d7c9e0d1612;p=p5sagit%2Fp5-mst-13.2.git diff --git a/scope.h b/scope.h index 6cfe124..29bc4c6 100644 --- a/scope.h +++ b/scope.h @@ -1,6 +1,7 @@ /* scope.h * - * Copyright (c) 1997-2002, Larry Wall + * Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999, + * 2000, 2001, 2002, 2004, by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -45,20 +46,26 @@ #define SAVEt_PADSV 35 #define SAVEt_MORTALIZESV 36 #define SAVEt_SHARED_PVREF 37 +#define SAVEt_BOOL 38 +#define SAVEt_SET_SVFLAGS 39 +#define SAVEt_SAVESWITCHSTACK 40 #ifndef SCOPE_SAVES_SIGNAL_MASK #define SCOPE_SAVES_SIGNAL_MASK 0 #endif -#define SSCHECK(need) if (PL_savestack_ix + need > PL_savestack_max) savestack_grow() +#define SSCHECK(need) if (PL_savestack_ix + (need) > PL_savestack_max) savestack_grow() +#define SSGROW(need) if (PL_savestack_ix + (need) > PL_savestack_max) savestack_grow_cnt(need) #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i)) #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i)) +#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p)) #define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i)) #define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p)) #define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p)) #define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p)) #define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32) #define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long) +#define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool) #define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv) #define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr) #define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr) @@ -91,13 +98,11 @@ Closing bracket on a callback. See C and L. #define ENTER \ STMT_START { \ push_scope(); \ - DEBUG_l(WITH_THR(Perl_deb(aTHX_ "ENTER scope %ld at %s:%d\n", \ - PL_scopestack_ix, __FILE__, __LINE__))); \ + DEBUG_SCOPE("ENTER") \ } STMT_END #define LEAVE \ STMT_START { \ - DEBUG_l(WITH_THR(Perl_deb(aTHX_ "LEAVE scope %ld at %s:%d\n", \ - PL_scopestack_ix, __FILE__, __LINE__))); \ + DEBUG_SCOPE("LEAVE") \ pop_scope(); \ } STMT_END #else @@ -116,6 +121,7 @@ Closing bracket on a callback. See C and L. #define SAVEINT(i) save_int(SOFT_CAST(int*)&(i)) #define SAVEIV(i) save_iv(SOFT_CAST(IV*)&(i)) #define SAVELONG(l) save_long(SOFT_CAST(long*)&(l)) +#define SAVEBOOL(b) save_bool(SOFT_CAST(bool*)&(b)) #define SAVESPTR(s) save_sptr((SV**)&(s)) #define SAVEPPTR(s) save_pptr(SOFT_CAST(char**)&(s)) #define SAVEVPTR(s) save_vptr((void*)&(s)) @@ -128,6 +134,7 @@ Closing bracket on a callback. See C and L. #define SAVEGENERICSV(s) save_generic_svref((SV**)&(s)) #define SAVEGENERICPV(s) save_generic_pvref((char**)&(s)) #define SAVESHAREDPV(s) save_shared_pvref((char**)&(s)) +#define SAVESETSVFLAGS(sv,mask,val) save_set_svflags(sv,mask,val) #define SAVEDELETE(h,k,l) \ save_delete(SOFT_CAST(HV*)(h), SOFT_CAST(char*)(k), (I32)(l)) #define SAVEDESTRUCTOR(f,p) \ @@ -146,27 +153,31 @@ Closing bracket on a callback. See C and L. #define SAVEOP() save_op() #define SAVEHINTS() \ - STMT_START { \ - if (PL_hints & HINT_LOCALIZE_HH) \ - save_hints(); \ - else { \ - SSCHECK(2); \ - SSPUSHINT(PL_hints); \ - SSPUSHINT(SAVEt_HINTS); \ - } \ + STMT_START { \ + SSCHECK(3); \ + if (PL_hints & HINT_LOCALIZE_HH) { \ + SSPUSHPTR(GvHV(PL_hintgv)); \ + GvHV(PL_hintgv) = newHVhv(GvHV(PL_hintgv)); \ + } \ + SSPUSHINT(PL_hints); \ + SSPUSHINT(SAVEt_HINTS); \ } STMT_END #define SAVECOMPPAD() \ STMT_START { \ - if (PL_comppad && PL_curpad == AvARRAY(PL_comppad)) { \ - SSCHECK(2); \ - SSPUSHPTR((SV*)PL_comppad); \ - SSPUSHINT(SAVEt_COMPPAD); \ - } \ - else { \ - SAVEVPTR(PL_curpad); \ - SAVESPTR(PL_comppad); \ - } \ + SSCHECK(2); \ + SSPUSHPTR((SV*)PL_comppad); \ + SSPUSHINT(SAVEt_COMPPAD); \ + } STMT_END + +#define SAVESWITCHSTACK(f,t) \ + STMT_START { \ + SSCHECK(3); \ + SSPUSHPTR((SV*)(f)); \ + SSPUSHPTR((SV*)(t)); \ + SSPUSHINT(SAVEt_SAVESWITCHSTACK); \ + SWITCHSTACK((f),(t)); \ + PL_curstackinfo->si_stack = (t); \ } STMT_END #ifdef USE_ITHREADS @@ -181,7 +192,7 @@ Closing bracket on a callback. See C and L. # define SAVECOPFILE_FREE(c) SAVEGENERICSV(CopFILEGV(c)) #endif -#define SAVECOPLINE(c) SAVEI16(CopLINE(c)) +#define SAVECOPLINE(c) SAVEI32(CopLINE(c)) /* SSNEW() temporarily allocates a specified number of bytes of data on the * savestack. It returns an integer index into the savestack, because a @@ -383,7 +394,11 @@ typedef void *(CPERLscope(*protect_proc_t)) (pTHX_ volatile JMPENV *pcur_env, } STMT_END #define JMPENV_POP \ - STMT_START { PL_top_env = cur_env.je_prev; } STMT_END + STMT_START { \ + DEBUG_l(Perl_deb(aTHX_ "popping jumplevel was %p, now %p\n", \ + PL_top_env, cur_env.je_prev)); \ + PL_top_env = cur_env.je_prev; \ + } STMT_END #define JMPENV_JUMP(v) \ STMT_START { \