summaryrefslogtreecommitdiff
path: root/pad.c
diff options
context:
space:
mode:
Diffstat (limited to 'pad.c')
-rw-r--r--pad.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/pad.c b/pad.c
index f999cb324a..61bacc2376 100644
--- a/pad.c
+++ b/pad.c
@@ -457,8 +457,11 @@ Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags)
Safefree(padlist);
CvPADLIST_set(&cvbody, NULL);
}
- else if (CvISXSUB(&cvbody))
+ else if (CvISXSUB(&cvbody)) {
+ if (CvREFCOUNTED_ANYSV(&cvbody))
+ SvREFCNT_dec(CvXSUBANY(&cvbody).any_sv);
CvHSCXT(&cvbody) = NULL;
+ }
/* else is (!CvISXSUB(&cvbody) && !CvPADLIST(&cvbody)) {do nothing;} */
@@ -2201,6 +2204,8 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned)
if (UNLIKELY(CvISXSUB(proto))) {
CvXSUB(cv) = CvXSUB(proto);
CvXSUBANY(cv) = CvXSUBANY(proto);
+ if (CvREFCOUNTED_ANYSV(cv))
+ SvREFCNT_inc(CvXSUBANY(cv).any_sv);
}
else {
OP_REFCNT_LOCK;