summaryrefslogtreecommitdiff
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
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.
-rw-r--r--mro.c2
-rw-r--r--sv.c12
2 files changed, 8 insertions, 6 deletions
diff --git a/mro.c b/mro.c
index 2d1d887fe8..be2038f4e7 100644
--- a/mro.c
+++ b/mro.c
@@ -578,6 +578,7 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
revmeta->cache_gen++;
if(revmeta->mro_nextmethod)
hv_clear(revmeta->mro_nextmethod);
+ if (!SvOBJECT(revstash)) SvSTASH(revstash) = NULL;
(void)
hv_store(
@@ -1356,6 +1357,7 @@ Perl_mro_method_changed_in(pTHX_ HV *stash)
mrometa->cache_gen++;
if(mrometa->mro_nextmethod)
hv_clear(mrometa->mro_nextmethod);
+ if (!SvOBJECT(revstash)) SvSTASH(revstash) = NULL;
}
}
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 */
}