summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBo Lindbergh <blgl@hagernas.com>2007-05-28 22:26:00 +0200
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2007-05-29 08:41:09 +0000
commitb20961491ccfb20bc7f9545285ddbacc783afb53 (patch)
tree60c7061e36316152be0d6b504599476a39f5226e
parent13631a739e1ca9d4bd60d030c52c026ea442b52e (diff)
downloadperl-b20961491ccfb20bc7f9545285ddbacc783afb53.tar.gz
Re: localising hash element by variable
Message-Id: <BC2C451F-B286-4D38-923E-E3B473F7B5E1@hagernas.com> p4raw-id: //depot/perl@31301
-rw-r--r--scope.c2
-rwxr-xr-xt/op/local.t17
2 files changed, 17 insertions, 2 deletions
diff --git a/scope.c b/scope.c
index 4b68f1b1c8..964a3b92e8 100644
--- a/scope.c
+++ b/scope.c
@@ -545,7 +545,7 @@ Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
SvGETMAGIC(*sptr);
SSCHECK(4);
SSPUSHPTR(SvREFCNT_inc_simple(hv));
- SSPUSHPTR(SvREFCNT_inc_simple(key));
+ SSPUSHPTR(newSVsv(key));
SSPUSHPTR(SvREFCNT_inc(*sptr));
SSPUSHINT(SAVEt_HELEM);
save_scalar_at(sptr);
diff --git a/t/op/local.t b/t/op/local.t
index 5aea967280..489f409a59 100755
--- a/t/op/local.t
+++ b/t/op/local.t
@@ -5,7 +5,7 @@ BEGIN {
@INC = qw(. ../lib);
require './test.pl';
}
-plan tests => 114;
+plan tests => 117;
my $list_assignment_supported = 1;
@@ -428,3 +428,18 @@ sub f { ok(0 == $[); }
}
+# when localising a hash element, the key should be copied, not referenced
+
+{
+ my %h=('k1' => 111);
+ my $k='k1';
+ {
+ local $h{$k}=222;
+
+ is($h{'k1'},222);
+ $k='k2';
+ }
+ ok(! exists($h{'k2'}));
+ is($h{'k1'},111);
+}
+