#define SAVEt_COMPILE_WARNINGS 43
#define SAVEt_STACK_CXPOS 44
#define SAVEt_PARSER 45
+#define SAVEt_ADELETE 46
#define SAVEf_SETMAGIC 1
+#define SAVEf_KEEPOLDELEM 2
+#define save_aelem(av,idx,sptr) save_aelem_flags(av,idx,sptr,SAVEf_SETMAGIC)
#define save_helem(hv,key,sptr) save_helem_flags(hv,key,sptr,SAVEf_SETMAGIC)
#ifndef SCOPE_SAVES_SIGNAL_MASK
#define SAVESETSVFLAGS(sv,mask,val) save_set_svflags(sv,mask,val)
#define SAVEDELETE(h,k,l) \
save_delete(MUTABLE_HV(h), (char*)(k), (I32)(l))
+#define SAVEHDELETE(h,s) \
+ save_hdelete(MUTABLE_HV(h), (s))
+#define SAVEADELETE(a,k) \
+ save_adelete(MUTABLE_AV(a), (I32)(k))
#define SAVEDESTRUCTOR(f,p) \
save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p))
#define SAVEOP() save_op()
-#define SAVEHINTS() \
- STMT_START { \
- SSCHECK(4); \
- if (PL_hints & HINT_LOCALIZE_HH) { \
- SSPUSHPTR(GvHV(PL_hintgv)); \
- GvHV(PL_hintgv) = Perl_hv_copy_hints_hv(aTHX_ GvHV(PL_hintgv)); \
- } \
- if (PL_compiling.cop_hints_hash) { \
- HINTS_REFCNT_LOCK; \
- PL_compiling.cop_hints_hash->refcounted_he_refcnt++; \
- HINTS_REFCNT_UNLOCK; \
- } \
- SSPUSHPTR(PL_compiling.cop_hints_hash); \
- SSPUSHINT(PL_hints); \
- SSPUSHINT(SAVEt_HINTS); \
- } STMT_END
+#define SAVEHINTS() save_hints()
-#define SAVECOMPPAD() \
- STMT_START { \
- SSCHECK(2); \
- SSPUSHPTR(MUTABLE_SV(PL_comppad)); \
- SSPUSHINT(SAVEt_COMPPAD); \
- } STMT_END
+#define SAVECOMPPAD() save_pushptr(MUTABLE_SV(PL_comppad), SAVEt_COMPPAD)
#define SAVESWITCHSTACK(f,t) \
STMT_START { \
- SSCHECK(3); \
- SSPUSHPTR(MUTABLE_SV(f)); \
- SSPUSHPTR(MUTABLE_SV(t)); \
- SSPUSHINT(SAVEt_SAVESWITCHSTACK); \
+ save_pushptrptr(MUTABLE_SV(f), MUTABLE_SV(t), SAVEt_SAVESWITCHSTACK); \
SWITCHSTACK((f),(t)); \
PL_curstackinfo->si_stack = (t); \
} STMT_END
-#define SAVECOPARYBASE(c) \
- STMT_START { \
- SSCHECK(3); \
- SSPUSHINT(CopARYBASE_get(c)); \
- SSPUSHPTR(c); \
- SSPUSHINT(SAVEt_COP_ARYBASE); \
- } STMT_END
+#define SAVECOPARYBASE(c) save_pushi32ptr(CopARYBASE_get(c), c, SAVEt_COP_ARYBASE);
/* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV",
because realloc() means that the value can actually change. Possibly
could have done savefreesharedpvREF, but this way actually seems cleaner,
as it simplifies the code that does the saves, and reduces the load on the
save stack. */
-#define SAVECOMPILEWARNINGS() \
- STMT_START { \
- SSCHECK(2); \
- SSPUSHPTR(PL_compiling.cop_warnings); \
- SSPUSHINT(SAVEt_COMPILE_WARNINGS); \
- } STMT_END
+#define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS)
#define SAVESTACK_CXPOS() \
STMT_START { \
SSPUSHINT(SAVEt_STACK_CXPOS); \
} STMT_END
-#define SAVEPARSER(p) \
- STMT_START { \
- SSCHECK(2); \
- SSPUSHPTR(p); \
- SSPUSHINT(SAVEt_PARSER); \
- } STMT_END
+#define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
#ifdef USE_ITHREADS
# define SAVECOPSTASH(c) SAVEPPTR(CopSTASHPV(c))
#define SSNEW(size) Perl_save_alloc(aTHX_ (size), 0)
#define SSNEWt(n,t) SSNEW((n)*sizeof(t))
#define SSNEWa(size,align) Perl_save_alloc(aTHX_ (size), \
- (align - ((int)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
+ (I32)(align - ((size_t)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
#define SSNEWat(n,t,align) SSNEWa((n)*sizeof(t), align)
#define SSPTR(off,type) ((type) ((char*)PL_savestack + off))