diff options
-rw-r--r-- | pp_hot.c | 22 | ||||
-rw-r--r-- | scope.c | 16 |
2 files changed, 18 insertions, 20 deletions
@@ -1699,17 +1699,8 @@ PP(pp_helem) STRLEN keylen; char *key = SvPV(keysv, keylen); SAVEDELETE(hv, savepvn(key,keylen), keylen); - } else { - SV *sv; + } else save_helem(hv, keysv, svp); - sv = *svp; - /* If we're localizing a tied hash element, this new - * sv won't actually be stored in the hash - so it - * won't get reaped when the localize ends. Ensure it - * gets reaped by mortifying it instead. DAPM */ - if (SvTIED_mg(sv, PERL_MAGIC_tiedelem)) - sv_2mortal(sv); - } } } else if (PL_op->op_private & OPpDEREF) @@ -2964,17 +2955,8 @@ PP(pp_aelem) PUSHs(lv); RETURN; } - if (PL_op->op_private & OPpLVAL_INTRO) { - SV *sv; + if (PL_op->op_private & OPpLVAL_INTRO) save_aelem(av, elem, svp); - sv = *svp; - /* If we're localizing a tied array element, this new sv - * won't actually be stored in the array - so it won't get - * reaped when the localize ends. Ensure it gets reaped by - * mortifying it instead. DAPM */ - if (SvTIED_mg(sv, PERL_MAGIC_tiedelem)) - sv_2mortal(sv); - } else if (PL_op->op_private & OPpDEREF) vivify_ref(*svp, PL_op->op_private & OPpDEREF); } @@ -587,23 +587,39 @@ Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p) void Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr) { + SV *sv; SSCHECK(4); SSPUSHPTR(SvREFCNT_inc(av)); SSPUSHINT(idx); SSPUSHPTR(SvREFCNT_inc(*sptr)); SSPUSHINT(SAVEt_AELEM); save_scalar_at(sptr); + sv = *sptr; + /* If we're localizing a tied array element, this new sv + * won't actually be stored in the array - so it won't get + * reaped when the localize ends. Ensure it gets reaped by + * mortifying it instead. DAPM */ + if (SvTIED_mg(sv, PERL_MAGIC_tiedelem)) + sv_2mortal(sv); } void Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr) { + SV *sv; SSCHECK(4); SSPUSHPTR(SvREFCNT_inc(hv)); SSPUSHPTR(SvREFCNT_inc(key)); SSPUSHPTR(SvREFCNT_inc(*sptr)); SSPUSHINT(SAVEt_HELEM); save_scalar_at(sptr); + sv = *sptr; + /* If we're localizing a tied hash element, this new sv + * won't actually be stored in the hash - so it won't get + * reaped when the localize ends. Ensure it gets reaped by + * mortifying it instead. DAPM */ + if (SvTIED_mg(sv, PERL_MAGIC_tiedelem)) + sv_2mortal(sv); } void |