diff options
author | Father Chrysostomos <sprout@cpan.org> | 2011-08-23 14:54:34 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2011-08-23 14:54:34 -0700 |
commit | e59953eb69409565f494ecd850cd487996d84637 (patch) | |
tree | 62e3924dda61c57069f07ab4b1ef213c3686d900 | |
parent | ce74145d973236b7a56fe8a090468f4c688c9062 (diff) | |
download | perl-e59953eb69409565f494ecd850cd487996d84637.tar.gz |
Stop readline($foo) from autovivifying
Currently <$foo> does not autovivify, but readline($foo) does, due to
the way pp_readline calls pp_rv2gv directly, with PL_op still holding
a pp_readline op, whose flags may have completely different meanings.
readline uses the OPf_SPECIAL flag to distinguish <$foo> from readline
($foo). rv2gv uses it to determine whether to autovivify; hence the
discrepancy.
-rw-r--r-- | pp.c | 5 | ||||
-rw-r--r-- | t/op/readline.t | 13 |
2 files changed, 15 insertions, 3 deletions
@@ -197,8 +197,9 @@ PP(pp_rv2gv) report_uninit(sv); RETSETUNDEF; } - if ((PL_op->op_flags & OPf_SPECIAL) && - !(PL_op->op_flags & OPf_MOD)) + if ( ((PL_op->op_flags & OPf_SPECIAL) && + !(PL_op->op_flags & OPf_MOD)) + || PL_op->op_type == OP_READLINE ) { STRLEN len; const char * const nambeg = SvPV_nomg_const(sv, len); diff --git a/t/op/readline.t b/t/op/readline.t index 81ac9e0f96..17567cd62f 100644 --- a/t/op/readline.t +++ b/t/op/readline.t @@ -6,7 +6,7 @@ BEGIN { require './test.pl'; } -plan tests => 25; +plan tests => 27; # [perl #19566]: sv_gets writes directly to its argument via # TARG. Test that we respect SvREADONLY. @@ -245,6 +245,17 @@ $two .= <DATA>; is( $one, "A: One\n", "rcatline works with tied scalars" ); is( $two, "B: Two\n", "rcatline works with tied scalars" ); +# mentioned in bug #97482 +# <$foo> versus readline($foo) should not affect vivification. +my $yunk = "brumbo"; +if (exists $::{$yunk}) { + die "Name $yunk already used. Please adjust this test." +} +<$yunk>; +ok !defined *$yunk, '<> does not autovivify'; +readline($yunk); +ok !defined *$yunk, "readline does not autovivify"; + __DATA__ moo moo |