78 lines
2.4 KiB
Diff
78 lines
2.4 KiB
Diff
|
From 13f27cb3dee86772eeed5d7d9b47746395ee603c Mon Sep 17 00:00:00 2001
|
|||
|
From: Father Chrysostomos <sprout@cpan.org>
|
|||
|
Date: Wed, 19 Sep 2012 21:53:51 -0700
|
|||
|
Subject: [PATCH] Stop my vars with attrs from leaking
|
|||
|
MIME-Version: 1.0
|
|||
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|||
|
Ported to 5.16.1:
|
|||
|
|
|||
|
commit 9fa29fa7929b4167c5491b792c5cc7e4365a2839
|
|||
|
Author: Father Chrysostomos <sprout@cpan.org>
|
|||
|
Date: Wed Sep 19 21:53:51 2012 -0700
|
|||
|
|
|||
|
[perl #114764] Stop my vars with attrs from leaking
|
|||
|
|
|||
|
S_apply_attrs was creating a SV containing a stash name, that was
|
|||
|
later to be put in a const op, which would take care of freeing it.
|
|||
|
But it didn’t free it for a my variable, because the branch where that
|
|||
|
const op was created didn’t apply. So move the creation of that SV
|
|||
|
inside the branch that uses it, otherwise it leaks. This leak was the
|
|||
|
result of commit 95f0a2f1ffc6.
|
|||
|
---
|
|||
|
op.c | 4 ++--
|
|||
|
t/op/svleak.t | 5 ++++-
|
|||
|
2 files changed, 6 insertions(+), 3 deletions(-)
|
|||
|
|
|||
|
diff --git a/op.c b/op.c
|
|||
|
index 24d5ecb..017580d 100644
|
|||
|
--- a/op.c
|
|||
|
+++ b/op.c
|
|||
|
@@ -2279,13 +2279,11 @@ STATIC void
|
|||
|
S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my)
|
|||
|
{
|
|||
|
dVAR;
|
|||
|
- SV *stashsv;
|
|||
|
|
|||
|
PERL_ARGS_ASSERT_APPLY_ATTRS;
|
|||
|
|
|||
|
/* fake up C<use attributes $pkg,$rv,@attrs> */
|
|||
|
ENTER; /* need to protect against side-effects of 'use' */
|
|||
|
- stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
|
|||
|
|
|||
|
#define ATTRSMODULE "attributes"
|
|||
|
#define ATTRSMODULE_PM "attributes.pm"
|
|||
|
@@ -2300,6 +2298,8 @@ S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my)
|
|||
|
newSVpvs(ATTRSMODULE), NULL);
|
|||
|
}
|
|||
|
else {
|
|||
|
+ SV * const stashsv =
|
|||
|
+ stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
|
|||
|
Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
|
|||
|
newSVpvs(ATTRSMODULE),
|
|||
|
NULL,
|
|||
|
diff --git a/t/op/svleak.t b/t/op/svleak.t
|
|||
|
index df10953..6cfee2e 100644
|
|||
|
--- a/t/op/svleak.t
|
|||
|
+++ b/t/op/svleak.t
|
|||
|
@@ -13,7 +13,7 @@ BEGIN {
|
|||
|
or skip_all("XS::APItest not available");
|
|||
|
}
|
|||
|
|
|||
|
-plan tests => 21;
|
|||
|
+plan tests => 22;
|
|||
|
|
|||
|
# run some code N times. If the number of SVs at the end of loop N is
|
|||
|
# greater than (N-1)*delta at the end of loop 1, we've got a leak
|
|||
|
@@ -160,3 +160,6 @@ leak(2, 0,
|
|||
|
}
|
|||
|
|
|||
|
leak(2,0,sub { !$^V }, '[perl #109762] version object in boolean context');
|
|||
|
+
|
|||
|
+# [perl #114764] Attributes leak scalars
|
|||
|
+leak(2, 0, sub { eval 'my $x : shared' }, 'my $x :shared used to leak');
|
|||
|
--
|
|||
|
1.7.11.4
|
|||
|
|