summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2010-10-25 12:28:33 -0700
committerFather Chrysostomos <sprout@cpan.org>2010-10-25 13:02:57 -0700
commit830748013f81bcc28d145baf4024efd1b6537704 (patch)
tree5f00e0da567f9e02a342c8ec8b03f19f59094e83
parent8063d41989a6e13f8b6f0b167ce69eea83090912 (diff)
downloadperl-830748013f81bcc28d145baf4024efd1b6537704.tar.gz
Make untie check the FAKE flag on globs
This allows untie($scalar) to untie the scalar if the last assigned or returned happened to be a typeglob.
-rw-r--r--pp_sys.c2
-rw-r--r--t/op/tie.t14
2 files changed, 12 insertions, 4 deletions
diff --git a/pp_sys.c b/pp_sys.c
index 7fa9f02e31..2497ec2ce1 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -903,7 +903,7 @@ PP(pp_untie)
const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
- if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
+ if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
RETPUSHYES;
if ((mg = SvTIED_mg(sv, how))) {
diff --git a/t/op/tie.t b/t/op/tie.t
index 5acd9a9db0..6bad251d14 100644
--- a/t/op/tie.t
+++ b/t/op/tie.t
@@ -955,12 +955,20 @@ main
f
########
-# tie $glob_copy vs tie *$glob_copy
-sub TIESCALAR { print "TIESCALAR\n" }
-sub TIEHANDLE{ print "TIEHANDLE\n" }
+# (un)tie $glob_copy vs (un)tie *$glob_copy
+sub TIESCALAR { print "TIESCALAR\n"; bless [] }
+sub TIEHANDLE{ print "TIEHANDLE\n"; bless [] }
+sub FETCH { print "never called\n" }
$f = *foo;
tie *$f, "";
tie $f, "";
+untie $f;
+print "ok 1\n" if !tied $f;
+() = $f; # should not call FETCH
+untie *$f;
+print "ok 2\n" if !tied *foo;
EXPECT
TIEHANDLE
TIESCALAR
+ok 1
+ok 2