Ap |void |save_sptr |NN SV** sptr
Xp |void |save_strlen |NN STRLEN* ptr
Ap |SV* |save_svref |NN SV** sptr
+AMpo |void |savetmps
Ap |void |save_pushptr |NULLOK void *const ptr|const int type
Ap |void |save_pushi32ptr|const I32 i|NULLOK void *const ptr|const int type
: Used by SAVESWITCHSTACK() in pp.c
#define PERL_ARGS_ASSERT_SAVESVPV \
assert(sv)
+PERL_CALLCONV void Perl_savetmps(pTHX);
PERL_CALLCONV OP* Perl_sawparens(pTHX_ OP* o);
PERL_CALLCONV OP* Perl_scalar(pTHX_ OP* o);
PERL_CALLCONV OP* Perl_scalarvoid(pTHX_ OP* o);
return save_scalar_at(sptr, SAVEf_SETMAGIC); /* XXX - FIXME - see #60360 */
}
+
+void
+Perl_savetmps(pTHX)
+{
+ dSS_ADD;
+ SS_ADD_IV(PL_tmps_floor);
+ PL_tmps_floor = PL_tmps_ix;
+ SS_ADD_UV(SAVEt_TMPSFLOOR);
+ SS_ADD_END(2);
+}
+
+
I32
Perl_save_alloc(pTHX_ I32 size, I32 pad)
{
case SAVEt_STRLEN: /* STRLEN/size_t ref */
*(STRLEN*)ARG0_PTR = (STRLEN)arg1.any_iv;
break;
+ case SAVEt_TMPSFLOOR: /* restore PL_tmps_floor */
+ PL_tmps_floor = (SSize_t)arg0.any_iv;
+ break;
case SAVEt_BOOL: /* bool reference */
*(bool*)ARG0_PTR = cBOOL(uv >> 8);
#ifdef NO_TAINT_SUPPORT
/* one arg */
-/*** SPARE 4 ***/
+#define SAVEt_TMPSFLOOR 4
#define SAVEt_BOOL 5
#define SAVEt_COMPILE_WARNINGS 6
#define SAVEt_COMPPAD 7
=cut
*/
-#define SAVETMPS Perl_save_strlen(aTHX_ (STRLEN *)&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
iv = POPIV(ss,ix);
TOPIV(nss,ix) = iv;
break;
+ case SAVEt_TMPSFLOOR:
+ iv = POPIV(ss,ix);
+ TOPIV(nss,ix) = iv;
+ break;
case SAVEt_HPTR: /* HV* reference */
case SAVEt_APTR: /* AV* reference */
case SAVEt_SPTR: /* SV* reference */