summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-11-20 13:47:27 -0800
committerFather Chrysostomos <sprout@cpan.org>2012-11-20 17:58:57 -0800
commitc07f9fb2c73bebcf70fabbf464c0c3452af4fcbf (patch)
tree6139cd0ddf1c0065f321095bb1be9ea86e7419a1 /sv.c
parentfef5350ad7ccf261f50ed1b6cb771ee5bb4f6ade (diff)
downloadperl-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.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/sv.c b/sv.c
index 9f5c157a87..a7914988e7 100644
--- a/sv.c
+++ b/sv.c
@@ -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 */
}