From: Bo Lindbergh Date: Mon, 28 May 2007 20:26:00 +0000 (+0200) Subject: Re: localising hash element by variable X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b20961491ccfb20bc7f9545285ddbacc783afb53;p=p5sagit%2Fp5-mst-13.2.git Re: localising hash element by variable Message-Id: p4raw-id: //depot/perl@31301 --- diff --git a/scope.c b/scope.c index 4b68f1b..964a3b9 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 5aea967..489f409 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); +} +