This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #77496] tied gets scalars and globs confused
authorFather Chrysostomos <sprout@cpan.org>
Mon, 25 Oct 2010 01:14:47 +0000 (18:14 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 25 Oct 2010 01:30:13 +0000 (18:30 -0700)
Make pp_tied use the SvFAKE flag to distinguish between tied scalars
and tied handles. This is now possible as of change 2acc3314.

This fixes the problem of tied($scalar) ignoring the tie if the last
thing returned or assigned happened to be a glob.

pp_sys.c
t/op/tie.t

index 78b635f..f47395b 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -941,7 +941,7 @@ PP(pp_tied)
     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))))
        RETPUSHUNDEF;
 
     if ((mg = SvTIED_mg(sv, how))) {
index 6e52a6e..a9fb89e 100644 (file)
@@ -939,3 +939,17 @@ sub IO::File::TIEARRAY {
 fileno FOO; tie @a, "FOO"
 EXPECT
 Can't locate object method "TIEARRAY" via package "FOO" at - line 5.
+########
+
+# tied() should still work on tied scalars after glob assignment
+sub TIESCALAR {bless[]}
+sub FETCH {*foo}
+sub f::TIEHANDLE{bless[],f}
+tie *foo, "f";
+tie $rin, "";
+[$rin]; # call FETCH
+print ref tied $rin, "\n";
+print ref tied *$rin, "\n";
+EXPECT
+main
+f