diff options
author | Father Chrysostomos <sprout@cpan.org> | 2010-10-25 12:28:33 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2010-10-25 13:02:57 -0700 |
commit | 830748013f81bcc28d145baf4024efd1b6537704 (patch) | |
tree | 5f00e0da567f9e02a342c8ec8b03f19f59094e83 | |
parent | 8063d41989a6e13f8b6f0b167ce69eea83090912 (diff) | |
download | perl-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.c | 2 | ||||
-rw-r--r-- | t/op/tie.t | 14 |
2 files changed, 12 insertions, 4 deletions
@@ -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 |