X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/a3444cc5f8f286b7d8760d1675a39eb29de51067..HEAD:/scope.h diff --git a/scope.h b/scope.h index 5854850..49177e3 100644 --- a/scope.h +++ b/scope.h @@ -8,58 +8,76 @@ * */ -#define SAVEt_ITEM 0 -#define SAVEt_SV 1 -#define SAVEt_AV 2 -#define SAVEt_HV 3 -#define SAVEt_INT 4 -#define SAVEt_LONG 5 -#define SAVEt_I32 6 -#define SAVEt_IV 7 -#define SAVEt_SPTR 8 -#define SAVEt_APTR 9 -#define SAVEt_HPTR 10 -#define SAVEt_PPTR 11 -#define SAVEt_NSTAB 12 -#define SAVEt_SVREF 13 -#define SAVEt_GP 14 -#define SAVEt_FREESV 15 -#define SAVEt_FREEOP 16 -#define SAVEt_FREEPV 17 -#define SAVEt_CLEARSV 18 -#define SAVEt_DELETE 19 -#define SAVEt_DESTRUCTOR 20 -#define SAVEt_REGCONTEXT 21 -#define SAVEt_STACK_POS 22 -#define SAVEt_I16 23 -#define SAVEt_AELEM 24 -#define SAVEt_HELEM 25 -#define SAVEt_OP 26 -#define SAVEt_HINTS 27 -#define SAVEt_ALLOC 28 -#define SAVEt_GENERIC_SVREF 29 -#define SAVEt_DESTRUCTOR_X 30 -#define SAVEt_VPTR 31 -#define SAVEt_I8 32 -#define SAVEt_COMPPAD 33 -#define SAVEt_GENERIC_PVREF 34 -#define SAVEt_PADSV_AND_MORTALIZE 35 -#define SAVEt_MORTALIZESV 36 -#define SAVEt_SHARED_PVREF 37 -#define SAVEt_BOOL 38 -#define SAVEt_SET_SVFLAGS 39 +/* *** Update arg_counts[] in scope.c if you modify these */ + +/* zero args */ + +#define SAVEt_ALLOC 0 +#define SAVEt_CLEARPADRANGE 1 +#define SAVEt_CLEARSV 2 +#define SAVEt_REGCONTEXT 3 + +/* one arg */ + +#define SAVEt_TMPSFLOOR 4 +#define SAVEt_BOOL 5 +#define SAVEt_COMPILE_WARNINGS 6 +#define SAVEt_COMPPAD 7 +#define SAVEt_FREECOPHH 8 +#define SAVEt_FREEOP 9 +#define SAVEt_FREEPV 10 +#define SAVEt_FREESV 11 +#define SAVEt_I16 12 +#define SAVEt_I32_SMALL 13 +#define SAVEt_I8 14 +#define SAVEt_INT_SMALL 15 +#define SAVEt_MORTALIZESV 16 +#define SAVEt_NSTAB 17 +#define SAVEt_OP 18 +#define SAVEt_PARSER 19 +#define SAVEt_STACK_POS 20 +#define SAVEt_READONLY_OFF 21 +#define SAVEt_FREEPADNAME 22 +#define SAVEt_STRLEN_SMALL 23 + +/* two args */ + +#define SAVEt_AV 24 +#define SAVEt_DESTRUCTOR 25 +#define SAVEt_DESTRUCTOR_X 26 +#define SAVEt_GENERIC_PVREF 27 +#define SAVEt_GENERIC_SVREF 28 +#define SAVEt_GP 29 +#define SAVEt_GVSV 30 +#define SAVEt_HINTS 31 +#define SAVEt_HPTR 32 +#define SAVEt_HV 33 +#define SAVEt_I32 34 +#define SAVEt_INT 35 +#define SAVEt_ITEM 36 +#define SAVEt_IV 37 +#define SAVEt_LONG 38 +#define SAVEt_PPTR 39 #define SAVEt_SAVESWITCHSTACK 40 -#define SAVEt_RE_STATE 42 -#define SAVEt_COMPILE_WARNINGS 43 -#define SAVEt_STACK_CXPOS 44 -#define SAVEt_PARSER 45 -#define SAVEt_ADELETE 46 -#define SAVEt_I32_SMALL 47 -#define SAVEt_INT_SMALL 48 -#define SAVEt_GVSV 49 -#define SAVEt_FREECOPHH 50 -#define SAVEt_CLEARPADRANGE 51 +#define SAVEt_SHARED_PVREF 41 +#define SAVEt_SPTR 42 +#define SAVEt_STRLEN 43 +#define SAVEt_SV 44 +#define SAVEt_SVREF 45 +#define SAVEt_VPTR 46 +#define SAVEt_ADELETE 47 +#define SAVEt_APTR 48 + +/* three args */ + +#define SAVEt_HELEM 49 +#define SAVEt_PADSV_AND_MORTALIZE 50 +#define SAVEt_SET_SVFLAGS 51 #define SAVEt_GVSLOT 52 +#define SAVEt_AELEM 53 +#define SAVEt_DELETE 54 +#define SAVEt_HINTS_HH 55 + #define SAVEf_SETMAGIC 1 #define SAVEf_KEEPOLDELEM 2 @@ -78,8 +96,8 @@ * macros */ #define SS_MAXPUSH 4 -#define SSCHECK(need) if (PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max) savestack_grow() -#define SSGROW(need) if (PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max) savestack_grow_cnt(need + SS_MAXPUSH) +#define SSCHECK(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow() +#define SSGROW(need) if (UNLIKELY(PL_savestack_ix + (I32)(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)) @@ -97,21 +115,23 @@ * of the grow() can be done. These changes reduce the code of something * like save_pushptrptr() to half its former size. * Of course, doing the size check *after* pushing means we must always - * ensure there are SS_MAXPUSH free slots on the savestack + * ensure there are SS_MAXPUSH free slots on the savestack. This ensured + * bt savestack_grow() and savestack_grow_cnt always allocating SS_MAXPUSH + * slots more than asked for, or that it sets PL_savestack_max to * * These are for internal core use only and are subject to change */ #define dSS_ADD \ I32 ix = PL_savestack_ix; \ - ANY *ssp = &PL_savestack[ix]; + ANY *ssp = &PL_savestack[ix] #define SS_ADD_END(need) \ assert((need) <= SS_MAXPUSH); \ ix += (need); \ PL_savestack_ix = ix; \ - assert(ix <= PL_savestack_max); \ - if ((ix + SS_MAXPUSH) > PL_savestack_max) savestack_grow(); \ - assert(PL_savestack_ix + SS_MAXPUSH <= PL_savestack_max); + assert(ix <= PL_savestack_max + SS_MAXPUSH); \ + if (UNLIKELY(ix > PL_savestack_max)) savestack_grow(); \ + assert(PL_savestack_ix <= PL_savestack_max); #define SS_ADD_INT(i) ((ssp++)->any_i32 = (I32)(i)) #define SS_ADD_LONG(i) ((ssp++)->any_long = (long)(i)) @@ -133,69 +153,66 @@ /* -=head1 Callback Functions +=for apidoc_section $callback -=for apidoc Ams||SAVETMPS -Opening bracket for temporaries on a callback. See C and +=for apidoc Amns||SAVETMPS +Opening bracket for temporaries on a callback. See C> and L. -=for apidoc Ams||FREETMPS -Closing bracket for temporaries on a callback. See C and +=for apidoc Amns||FREETMPS +Closing bracket for temporaries on a callback. See C> and L. -=for apidoc Ams||ENTER -Opening bracket on a callback. See C and L. - -=for apidoc Ams||LEAVE -Closing bracket on a callback. See C and L. +=for apidoc Amns||ENTER +Opening bracket on a callback. See C> and L. -=over +=for apidoc Amns||LEAVE +Closing bracket on a callback. See C> and L. -=item ENTER_with_name(name) +=for apidoc Ams||ENTER_with_name|"name" -Same as C, but when debugging is enabled it also associates the +Same as C>, but when debugging is enabled it also associates the given literal string with the new scope. -=item LEAVE_with_name(name) +=for apidoc Ams||LEAVE_with_name|"name" -Same as C, but when debugging is enabled it first checks that the -scope has the given name. Name must be a literal string. - -=back +Same as C>, but when debugging is enabled it first checks that the +scope has the given name. C must be a literal string. =cut */ -#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix +#define SAVETMPS Perl_savetmps(aTHX) + #define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps() #ifdef DEBUGGING #define ENTER \ STMT_START { \ - push_scope(); \ - DEBUG_SCOPE("ENTER") \ + push_scope(); \ + DEBUG_SCOPE("ENTER") \ } STMT_END #define LEAVE \ STMT_START { \ - DEBUG_SCOPE("LEAVE") \ - pop_scope(); \ + DEBUG_SCOPE("LEAVE") \ + pop_scope(); \ } STMT_END #define ENTER_with_name(name) \ STMT_START { \ - push_scope(); \ - if (PL_scopestack_name) \ - PL_scopestack_name[PL_scopestack_ix-1] = name; \ - DEBUG_SCOPE("ENTER \"" name "\"") \ + push_scope(); \ + if (PL_scopestack_name) \ + PL_scopestack_name[PL_scopestack_ix-1] = name; \ + DEBUG_SCOPE("ENTER \"" name "\"") \ } STMT_END #define LEAVE_with_name(name) \ STMT_START { \ - DEBUG_SCOPE("LEAVE \"" name "\"") \ - if (PL_scopestack_name) { \ - assert(((char*)PL_scopestack_name[PL_scopestack_ix-1] \ - == (char*)name) \ - || strEQ(PL_scopestack_name[PL_scopestack_ix-1], name)); \ - } \ - pop_scope(); \ + DEBUG_SCOPE("LEAVE \"" name "\"") \ + if (PL_scopestack_name) { \ + assert(((char*)PL_scopestack_name[PL_scopestack_ix-1] \ + == (char*)name) \ + || strEQ(PL_scopestack_name[PL_scopestack_ix-1], name)); \ + } \ + pop_scope(); \ } STMT_END #else #define ENTER push_scope() @@ -204,7 +221,7 @@ scope has the given name. Name must be a literal string. #define LEAVE_with_name(name) LEAVE #endif #define LEAVE_SCOPE(old) STMT_START { \ - if (PL_savestack_ix > old) leave_scope(old); \ + if (PL_savestack_ix > old) leave_scope(old); \ } STMT_END #define SAVEI8(i) save_I8((I8*)&(i)) @@ -219,6 +236,7 @@ scope has the given name. Name must be a literal string. #define SAVEVPTR(s) save_vptr((void*)&(s)) #define SAVEPADSVANDMORTALIZE(s) save_padsv_and_mortalize(s) #define SAVEFREESV(s) save_freesv(MUTABLE_SV(s)) +#define SAVEFREEPADNAME(s) save_pushptr((void *)(s), SAVEt_FREEPADNAME) #define SAVEMORTALIZESV(s) save_mortalizesv(MUTABLE_SV(s)) #define SAVEFREEOP(o) save_freeop((OP*)(o)) #define SAVEFREEPV(p) save_freepv((char*)(p)) @@ -229,16 +247,16 @@ scope has the given name. Name must be a literal string. #define SAVESETSVFLAGS(sv,mask,val) save_set_svflags(sv,mask,val) #define SAVEFREECOPHH(h) save_pushptr((void *)(h), SAVEt_FREECOPHH) #define SAVEDELETE(h,k,l) \ - save_delete(MUTABLE_HV(h), (char*)(k), (I32)(l)) + save_delete(MUTABLE_HV(h), (char*)(k), (I32)(l)) #define SAVEHDELETE(h,s) \ - save_hdelete(MUTABLE_HV(h), (s)) + save_hdelete(MUTABLE_HV(h), (s)) #define SAVEADELETE(a,k) \ - save_adelete(MUTABLE_AV(a), (I32)(k)) + save_adelete(MUTABLE_AV(a), (SSize_t)(k)) #define SAVEDESTRUCTOR(f,p) \ - save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p)) + save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p)) #define SAVEDESTRUCTOR_X(f,p) \ - save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p)) + save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p)) #define SAVESTACK_POS() \ STMT_START { \ @@ -256,9 +274,9 @@ scope has the given name. Name must be a literal string. #define SAVESWITCHSTACK(f,t) \ STMT_START { \ - save_pushptrptr(MUTABLE_SV(f), MUTABLE_SV(t), SAVEt_SAVESWITCHSTACK); \ - SWITCHSTACK((f),(t)); \ - PL_curstackinfo->si_stack = (t); \ + save_pushptrptr(MUTABLE_SV(f), MUTABLE_SV(t), SAVEt_SAVESWITCHSTACK); \ + SWITCHSTACK((f),(t)); \ + PL_curstackinfo->si_stack = (t); \ } STMT_END /* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV", @@ -268,15 +286,6 @@ scope has the given name. Name must be a literal string. save stack. */ #define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS) -#define SAVESTACK_CXPOS() \ - STMT_START { \ - dSS_ADD; \ - SS_ADD_INT(cxstack[cxstack_ix].blk_oldsp); \ - SS_ADD_INT(cxstack_ix); \ - SS_ADD_UV(SAVEt_STACK_CXPOS); \ - SS_ADD_END(3); \ - } STMT_END - #define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER) #ifdef USE_ITHREADS @@ -293,7 +302,7 @@ scope has the given name. Name must be a literal string. #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 + * savestack. It returns an I32 index into the savestack, because a * pointer would get broken if the savestack is moved on reallocation. * SSNEWa() works like SSNEW(), but also aligns the data to the specified * number of bytes. MEM_ALIGNBYTES is perhaps the most useful. The @@ -326,11 +335,5 @@ STMT_START { \ #define save_op() save_pushptr((void *)(PL_op), SAVEt_OP) /* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - * * ex: set ts=8 sts=4 sw=4 et: */