diff options
author | Father Chrysostomos <sprout@cpan.org> | 2012-11-20 13:47:27 -0800 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2012-11-20 17:58:57 -0800 |
commit | c07f9fb2c73bebcf70fabbf464c0c3452af4fcbf (patch) | |
tree | 6139cd0ddf1c0065f321095bb1be9ea86e7419a1 /sv.c | |
parent | fef5350ad7ccf261f50ed1b6cb771ee5bb4f6ade (diff) | |
download | perl-c07f9fb2c73bebcf70fabbf464c0c3452af4fcbf.tar.gz |
Revert "Revert "8c34e50dc slowed down detruction with no DESTROY""
This reverts commit 95f9781bc2fad025553db0160ef9c2c5363312a1.
Now that the crash has been fixed by the preceding commit, we can
reinstate 7cc6787e9db.
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -6338,12 +6338,12 @@ S_curse(pTHX_ SV * const sv, const bool check_refcnt) { if (!destructor) { GV * const gv = gv_fetchmeth_autoload(stash, "DESTROY", 7, 0); - if (gv && (destructor = GvCV(gv))) { - if (!SvOBJECT(stash)) - SvSTASH(stash) = (HV *)destructor; - } + if (gv) destructor = GvCV(gv); + if (!SvOBJECT(stash)) + SvSTASH(stash) = + destructor ? (HV *)destructor : ((HV *)0)+1; } - if (destructor + if (destructor && destructor != ((CV *)0)+1 /* A constant subroutine can have no side effects, so don't bother calling it. */ && !CvCONST(destructor) @@ -12000,7 +12000,7 @@ S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param) SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param)); } else if (SvMAGIC(dstr)) SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param)); - if (SvSTASH(dstr)) + if (SvOBJECT(dstr) && SvSTASH(dstr)) SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param)); else SvSTASH_set(dstr, 0); /* don't copy DESTROY cache */ } |