summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Mitchell <davem@fdisolutions.com>2002-05-04 01:34:18 +0100
committerJarkko Hietaniemi <jhi@iki.fi>2002-05-06 13:13:00 +0000
commitc39e6ab0a7545b7ae425e21f045aa689291b268e (patch)
treea66b15f7fe920bd9109a3291f8a347a43a0d213e
parent2c74c289a09a24de36af47eb52526438ffa7fdd6 (diff)
downloadperl-c39e6ab0a7545b7ae425e21f045aa689291b268e.tar.gz
[proposed PATCH] correctly unlocalise exists on tied/%ENV
Message-ID: <20020504003418.F22026@fdgroup.com> p4raw-id: //depot/perl@16431
-rw-r--r--pp_hot.c7
-rwxr-xr-xt/op/local.t1
2 files changed, 7 insertions, 1 deletions
diff --git a/pp_hot.c b/pp_hot.c
index 30653a76b7..f2387b4ce0 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1644,7 +1644,12 @@ PP(pp_helem)
if (SvTYPE(hv) == SVt_PVHV) {
if (PL_op->op_private & OPpLVAL_INTRO)
- preeminent = SvRMAGICAL(hv) ? 1 : hv_exists_ent(hv, keysv, 0);
+ preeminent =
+ ( SvRMAGICAL(hv)
+ && !mg_find((SV*)hv, PERL_MAGIC_tied)
+ && !mg_find((SV*)hv, PERL_MAGIC_env)
+ ) ? 1 : hv_exists_ent(hv, keysv, 0);
+
he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
svp = he ? &HeVAL(he) : 0;
}
diff --git a/t/op/local.t b/t/op/local.t
index 9f977b2cd4..d23b200022 100755
--- a/t/op/local.t
+++ b/t/op/local.t
@@ -130,6 +130,7 @@ print +(!defined $a[0]) ? "" : "not ", "ok 41\n";
sub TIEHASH { bless {}, $_[0] }
sub STORE { print "# STORE [@_]\n"; $_[0]->{$_[1]} = $_[2] }
sub FETCH { my $v = $_[0]->{$_[1]}; print "# FETCH [@_=$v]\n"; $v }
+ sub EXISTS { print "# EXISTS [@_]\n"; exists $_[0]->{$_[1]}; }
sub DELETE { print "# DELETE [@_]\n"; delete $_[0]->{$_[1]}; }
sub CLEAR { print "# CLEAR [@_]\n"; %{$_[0]} = (); }
}