diff options
-rw-r--r-- | pp.c | 4 | ||||
-rw-r--r-- | t/op/inc.t | 18 |
2 files changed, 21 insertions, 1 deletions
@@ -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 $_"); + } +} |