diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2002-05-08 01:11:02 +0100 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2002-05-07 22:24:59 +0000 |
commit | bfc4de9ff33050d7c71e12b604bc53895468baad (patch) | |
tree | 6c3e5220924d3e7de4228a28d745ca21503f2c79 /scope.c | |
parent | 8d1f198fe997a3eac9dc901e973cdc46ac8bbdec (diff) | |
download | perl-bfc4de9ff33050d7c71e12b604bc53895468baad.tar.gz |
Re: [PATCH scope.c] Re: local($tied->{foo}) leaks
Message-ID: <20020508001102.D4118@fdgroup.com>
p4raw-id: //depot/perl@16456
Diffstat (limited to 'scope.c')
-rw-r--r-- | scope.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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 |