#define SAVEt_INT_SMALL 48
#define SAVEt_GVSV 49
#define SAVEt_FREECOPHH 50
+#define SAVEt_CLEARPADRANGE 51
#define SAVEf_SETMAGIC 1
#define SAVEf_KEEPOLDELEM 2
#define ENTER_with_name(name) ENTER
#define LEAVE_with_name(name) LEAVE
#endif
-#define LEAVE_SCOPE(old) if (PL_savestack_ix > old) leave_scope(old)
+#define LEAVE_SCOPE(old) STMT_START { \
+ if (PL_savestack_ix > old) leave_scope(old); \
+ } STMT_END
#define SAVEI8(i) save_I8((I8*)&(i))
#define SAVEI16(i) save_I16((I16*)&(i))
#define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
#ifdef USE_ITHREADS
-# define SAVECOPSTASH(c) (SAVEPPTR(CopSTASHPV(c)), \
- SAVEI32(CopSTASH_len(c)))
-# define SAVECOPSTASH_FREE(c) (SAVESHAREDPV(CopSTASHPV(c)), \
- SAVEI32(CopSTASH_len(c)))
+# define SAVECOPSTASH_FREE(c) SAVEIV((c)->cop_stashoff)
# define SAVECOPFILE(c) SAVEPPTR(CopFILE(c))
# define SAVECOPFILE_FREE(c) SAVESHAREDPV(CopFILE(c))
#else
-# define SAVECOPSTASH(c) SAVESPTR(CopSTASH(c))
-# define SAVECOPSTASH_FREE(c) SAVECOPSTASH(c) /* XXX not refcounted */
+# /* XXX not refcounted */
+# define SAVECOPSTASH_FREE(c) SAVESPTR(CopSTASH(c))
# define SAVECOPFILE(c) SAVESPTR(CopFILEGV(c))
# define SAVECOPFILE_FREE(c) SAVEGENERICSV(CopFILEGV(c))
#endif
#define save_freesv(op) save_pushptr((void *)(op), SAVEt_FREESV)
#define save_mortalizesv(op) save_pushptr((void *)(op), SAVEt_MORTALIZESV)
-#define save_freeop(op) save_pushptr((void *)(op), SAVEt_FREEOP)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define save_freeop(op) \
+ ({ \
+ OP * const _o = (OP *)(op); \
+ assert(!_o->op_savefree); \
+ _o->op_savefree = 1; \
+ save_pushptr((void *)(_o), SAVEt_FREEOP); \
+ })
+#else
+# define save_freeop(op) \
+ ( \
+ PL_Xpv = (XPV *)(op), \
+ assert_(!((OP *)PL_Xpv)->op_savefree) \
+ ((OP *)PL_Xpv)->op_savefree = 1, \
+ save_pushptr((void *)(PL_Xpv), SAVEt_FREEOP) \
+ )
+#endif
#define save_freepv(pv) save_pushptr((void *)(pv), SAVEt_FREEPV)
#define save_op() save_pushptr((void *)(PL_op), SAVEt_OP)