Change 19851 by [EMAIL PROTECTED] on 2003/06/25 19:25:47

        Fix [perl #21742] :
        require() should always be called in scalar context,
        even when it's the last statement in an eval("").

Affected files ...

... //depot/perl/pp_ctl.c#361 edit
... //depot/perl/t/comp/require.t#26 edit

Differences ...

==== //depot/perl/pp_ctl.c#361 (text) ====
Index: perl/pp_ctl.c
--- perl/pp_ctl.c#360~19819~    Thu Jun 19 07:08:13 2003
+++ perl/pp_ctl.c       Wed Jun 25 12:25:47 2003
@@ -2828,8 +2828,7 @@
     else
        sv_setpv(ERRSV,"");
     if (yyparse() || PL_error_count || !PL_eval_root) {
-       SV **newsp;
-       I32 gimme;
+       SV **newsp;                     /* Used by POPBLOCK. */
        PERL_CONTEXT *cx;
        I32 optype = 0;                 /* Might be reset by POPEVAL. */
        STRLEN n_a;
@@ -2873,7 +2872,16 @@
        *startop = PL_eval_root;
     } else
        SAVEFREEOP(PL_eval_root);
-    if (gimme & G_VOID)
+
+    /* Set the context for this new optree.
+     * If the last op is an OP_REQUIRE, force scalar context.
+     * Otherwise, propagate the context from the eval(). */
+    if (PL_eval_root->op_type == OP_LEAVEEVAL
+           && cUNOPx(PL_eval_root)->op_first->op_type == OP_LINESEQ
+           && cLISTOPx(cUNOPx(PL_eval_root)->op_first)->op_last->op_type
+           == OP_REQUIRE)
+       scalar(PL_eval_root);
+    else if (gimme & G_VOID)
        scalarvoid(PL_eval_root);
     else if (gimme & G_ARRAY)
        list(PL_eval_root);

==== //depot/perl/t/comp/require.t#26 (xtext) ====
Index: perl/t/comp/require.t
--- perl/t/comp/require.t#25~19801~     Mon Jun 16 15:47:28 2003
+++ perl/t/comp/require.t       Wed Jun 25 12:25:47 2003
@@ -11,7 +11,7 @@
 
 my $Is_EBCDIC = (ord('A') == 193) ? 1 : 0;
 my $Is_UTF8   = (${^OPEN} || "") =~ /:utf8/;
-my $total_tests = 29;
+my $total_tests = 30;
 if ($Is_EBCDIC || $Is_UTF8) { $total_tests = 26; }
 print "1..$total_tests\n";
 
@@ -134,8 +134,7 @@
 
 write_file('bleah.pm', <<'**BLEAH**'
 print "not " if !defined wantarray || wantarray ne '';
-my $TODO = $i == 23 ? " # TODO bug #21742" : "";
-print "ok $i - require() context$TODO\n";
+print "ok $i - require() context\n";
 1;
 **BLEAH**
 );
@@ -143,6 +142,7 @@
 $foo = eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
 @foo = eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
        eval q{require bleah}; delete $INC{"bleah.pm"}; ++$::i;
+       eval q{$_=$_+2;require bleah}; delete $INC{"bleah.pm"}; ++$::i;
 $foo = eval  {require bleah}; delete $INC{"bleah.pm"}; ++$::i;
 @foo = eval  {require bleah}; delete $INC{"bleah.pm"}; ++$::i;
        eval  {require bleah};
End of Patch.

Reply via email to