summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pp.c4
-rw-r--r--t/op/inc.t18
2 files changed, 21 insertions, 1 deletions
diff --git a/pp.c b/pp.c
index 31614ed0e6..78ed2867ab 100644
--- a/pp.c
+++ b/pp.c
@@ -899,6 +899,8 @@ PP(pp_postinc)
dVAR; dSP; dTARGET;
if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
Perl_croak_no_modify(aTHX);
+ if (SvROK(TOPs))
+ TARG = sv_newmortal();
sv_setsv(TARG, TOPs);
if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
&& SvIVX(TOPs) != IV_MAX)
@@ -921,6 +923,8 @@ PP(pp_postdec)
dVAR; dSP; dTARGET;
if (SvTYPE(TOPs) >= SVt_PVAV || isGV_with_GP(TOPs))
Perl_croak_no_modify(aTHX);
+ if (SvROK(TOPs))
+ TARG = sv_newmortal();
sv_setsv(TARG, TOPs);
if (!SvREADONLY(TOPs) && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)
&& SvIVX(TOPs) != IV_MIN)
diff --git a/t/op/inc.t b/t/op/inc.t
index 99123c79d6..8cbc63b163 100644
--- a/t/op/inc.t
+++ b/t/op/inc.t
@@ -2,7 +2,7 @@
# use strict;
-print "1..54\n";
+print "1..56\n";
my $test = 1;
@@ -281,3 +281,19 @@ ok (scalar eval { my $pvbm = PVBM; $pvbm-- });
ok (scalar eval { my $pvbm = PVBM; ++$pvbm });
ok (scalar eval { my $pvbm = PVBM; --$pvbm });
+# #9466
+
+# don't use pad TARG when the thing you're copying is a ref, or the referent
+# won't get freed.
+{
+ package P9466;
+ my $x;
+ sub DESTROY { $x = 1 }
+ for (0..1) {
+ $x = 0;
+ my $a = bless {};
+ my $b = $_ ? $a++ : $a--;
+ undef $a; undef $b;
+ ::ok ($x, $x, "9466 case $_");
+ }
+}