-
Notifications
You must be signed in to change notification settings - Fork 560
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tied gets scalars and globs confused #10584
Comments
From @cpansprout(I must be tired today. This is the second bug report I’ve muddled up. I sent it first without the perlbug output. It disappeared, but—who knows?—it may pop up again someday.) In trying to write a test for an assignment bug, I came across this anomaly with tied(): sub TIESCALAR {bless[]} tied returns undef, so this prints ‘bad’. tied checks first to see whether its argument is a glob. If it is, it returns undef if the IO slot is empty. So the the tiedness, according to tied(), varies depending on what the last value happened to be that was returned or assigned. Flags: Site configuration information for perl 5.13.4: Configured by sprout at Fri Aug 20 23:24:53 PDT 2010. Summary of my perl5 (revision 5 version 13 subversion 4 patch v5.13.4-16-g16c9153) configuration: Locally applied patches: @INC for perl 5.13.4: Environment for perl 5.13.4: |
From @cpansproutOn Aug 29, 2010, at 1:38 PM, Father Chrysostomos wrote:
There should be a patch attached hereto. I put the explanation of OPf_SPECIAL above OP_HELEM to avoid a conflict with the patch for bug #20444. |
From @cpansproutFrom: Father Chrysostomos <sprout@cpan.org> [perl #77496] tied gets scalars and globs confused • Give a tied op a special flag if the RHS is an rv2gv. This fixes the problem of tied($scalar) ignoring the tie if the last Inline Patchdiff -Nup blead-77362-glob2lv8/op.c blead-77362-glob2lv9.tied/op.c
--- blead-77362-glob2lv8/op.c 2010-08-20 18:55:11.000000000 -0700
+++ blead-77362-glob2lv9.tied/op.c 2010-08-27 22:10:24.000000000 -0700
@@ -7155,6 +7155,9 @@ Perl_ck_fun(pTHX_ OP *o)
return too_many_arguments(o,OP_DESC(o));
#endif
listkids(o);
+
+ if (type == OP_TIED && cLISTOPo->op_first->op_type == OP_RV2GV)
+ o->op_flags |= OPf_SPECIAL;
}
else if (PL_opargs[type] & OA_DEFGV) {
#ifdef PERL_MAD
diff -Nup blead-77362-glob2lv8/op.h blead-77362-glob2lv9.tied/op.h
--- blead-77362-glob2lv8/op.h 2010-08-20 18:55:11.000000000 -0700
+++ blead-77362-glob2lv9.tied/op.h 2010-08-27 22:00:46.000000000 -0700
@@ -139,6 +139,7 @@ Deprecated. Use C<GIMME_V> instead.
/* On OP_ANONHASH and OP_ANONLIST, create a
reference to the new anon hash or array */
/* On OP_ENTER, store caller context */
+ /* On OP_TIED, RHS is a handle */
/* On OP_HELEM and OP_HSLICE, localization will be followed
by assignment, so do not wipe the target if it is special
(e.g. a glob or a magic SV) */
diff -Nup blead-77362-glob2lv8/pp_sys.c blead-77362-glob2lv9.tied/pp_sys.c
--- blead-77362-glob2lv8/pp_sys.c 2010-08-25 18:03:31.000000000 -0700
+++ blead-77362-glob2lv9.tied/pp_sys.c 2010-08-27 23:02:50.000000000 -0700
@@ -941,7 +941,8 @@ 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) && (PL_op->op_flags & OPf_SPECIAL || !SvFAKE(sv))
+ && !(sv = MUTABLE_SV(GvIOp(sv))))
RETPUSHUNDEF;
if ((mg = SvTIED_mg(sv, how))) {
diff -Nurp blead-77362-glob2lv8/t/op/tie.t blead-77362-glob2lv9.tied/t/op/tie.t
--- blead-77362-glob2lv8/t/op/tie.t 2010-08-11 04:53:10.000000000 -0700
+++ blead-77362-glob2lv9.tied/t/op/tie.t 2010-08-27 17:47:48.000000000 -0700
@@ -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 |
From @cpansproutOn Sun Aug 29 13:43:32 2010, sprout wrote:
I have applied a simplified version as 8752206. (2acc331 allows pp_tied |
From [Unknown Contact. See original ticket]On Sun Aug 29 13:43:32 2010, sprout wrote:
I have applied a simplified version as 8752206. (2acc331 allows pp_tied |
@cpansprout - Status changed from 'new' to 'resolved' |
@cpansprout - Status changed from 'resolved' to 'open' |
From @cpansproutI’ve re-opened this, since the fix was reverted for 5.14. See #79528. |
From @cpansproutOn Wed Apr 20 14:32:56 2011, sprout wrote:
And now I’m closing it, as the revert was reverted as 4be76e1. |
@cpansprout - Status changed from 'open' to 'resolved' |
Migrated from rt.perl.org#77496 (status was 'resolved')
Searchable as RT77496$
The text was updated successfully, but these errors were encountered: