Change 19126 by [EMAIL PROTECTED] on 2003/04/01 18:39:43

        Fix bug #21742. require should be always invoked in
        scalar context. This wasn't the case when called from
        an eval(""), because the void context doesn't propagate
        through the leaveeval op. Instead of making scalarvoid()
        handle OP_LEAVEEVAL -- this breaks AutoLoader -- implement
        a workaround in doeval().

Affected files ...

... //depot/perl/pp_ctl.c#351 edit
... //depot/perl/t/comp/require.t#24 edit

Differences ...

==== //depot/perl/pp_ctl.c#351 (text) ====
Index: perl/pp_ctl.c
--- perl/pp_ctl.c#350~19064~    Wed Mar 26 11:48:32 2003
+++ perl/pp_ctl.c       Tue Apr  1 10:39:43 2003
@@ -2884,7 +2884,13 @@
        *startop = PL_eval_root;
     } else
        SAVEFREEOP(PL_eval_root);
-    if (gimme & G_VOID)
+    if (gimme & G_VOID && ! PL_in_eval & EVAL_INREQUIRE)
+       /*
+        * EVAL_INREQUIRE (the code is being required) is special-cased :
+        * in this case we want scalar context to be forced, instead
+        * of void context, so a proper return value is returned from
+        * C<require> via this leaveeval op.
+        */
        scalarvoid(PL_eval_root);
     else if (gimme & G_ARRAY)
        list(PL_eval_root);

==== //depot/perl/t/comp/require.t#24 (xtext) ====
Index: perl/t/comp/require.t
--- perl/t/comp/require.t#23~15584~     Thu Mar 28 07:52:30 2002
+++ perl/t/comp/require.t       Tue Apr  1 10:39:43 2003
@@ -11,8 +11,8 @@
 
 my $Is_EBCDIC = (ord('A') == 193) ? 1 : 0;
 my $Is_UTF8   = (${^OPEN} || "") =~ /:utf8/;
-my $total_tests = 23;
-if ($Is_EBCDIC || $Is_UTF8) { $total_tests = 20; }
+my $total_tests = 29;
+if ($Is_EBCDIC || $Is_UTF8) { $total_tests = 26; }
 print "1..$total_tests\n";
 
 sub do_require {
@@ -129,6 +129,22 @@
 dofile();
 sub dofile { do "bleah.do"; };
 print $x;
+
+# Test that scalar context is forced for require
+
+write_file('bleah.pm', <<'**BLEAH**'
+print "not " if !defined wantarray || wantarray ne '';
+print "ok $i - require() context\n";
+1;
+**BLEAH**
+);
+                              delete $INC{"bleah.pm"}; ++$::i;
+$foo = eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
[EMAIL PROTECTED] = eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
+       eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
+$foo = eval  {require bleah}; delete $INC{"bleah.pm"}; ++$::i;
[EMAIL PROTECTED] = eval  {require bleah}; delete $INC{"bleah.pm"}; ++$::i;
+       eval  {require bleah};
 
 # UTF-encoded things - skipped on EBCDIC machines and on UTF-8 input
 
End of Patch.

Reply via email to