Re: [ID 20001018.008] flip-flop bug when there's no <FH>
Hugo van der Sanden [Wed, 18 Oct 2000 23:25:58 +0000 (00:25 +0100)]
Message-Id: <200010182225.XAA20330@crypt.compulink.co.uk>

p4raw-id: //depot/perl@7365

pp_ctl.c
pp_hot.c
t/op/flip.t
t/pragma/warn/pp_hot

index d69aaa8..cf2000e 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1005,10 +1005,17 @@ PP(pp_flip)
     else {
        dTOPss;
        SV *targ = PAD_SV(PL_op->op_targ);
-
-       if ((PL_op->op_private & OPpFLIP_LINENUM)
-         ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
-         : SvTRUE(sv) ) {
+       int flip;
+
+       if (PL_op->op_private & OPpFLIP_LINENUM) {
+           struct io *gp_io;
+           flip = PL_last_in_gv
+               && (gp_io = GvIOp(PL_last_in_gv))
+               && SvIV(sv) == (IV)IoLINES(gp_io);
+       } else {
+           flip = SvTRUE(sv);
+       }
+       if (flip) {
            sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
            if (PL_op->op_flags & OPf_SPECIAL) {
                sv_setiv(targ, 1);
index 6f582c0..9b0573b 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1412,7 +1412,8 @@ Perl_do_readline(pTHX)
        }
     }
     if (!fp) {
-       if (ckWARN2(WARN_GLOB,WARN_CLOSED) && io && !(IoFLAGS(io) & IOf_START)) {
+       if (ckWARN2(WARN_GLOB, WARN_CLOSED)
+               && (!io || !(IoFLAGS(io) & IOf_START))) {
            if (type == OP_GLOB)
                Perl_warner(aTHX_ WARN_GLOB,
                            "glob failed (can't start child: %s)",
index 20167f3..f66af27 100755 (executable)
@@ -2,7 +2,7 @@
 
 # $RCSfile: flip.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:52 $
 
-print "1..9\n";
+print "1..10\n";
 
 @a = (1,2,3,4,5,6,7,8,9,10,11,12);
 
@@ -27,3 +27,10 @@ if ($x eq 3) {print "ok 8\n";} else {print "not ok 8 $x:$foo:\n";}
 
 $x = 3.14;
 if (($x...$x) eq "1") {print "ok 9\n";} else {print "not ok 9\n";}
+
+{
+    # coredump reported in bug 20001018.008
+    readline(UNKNOWN);
+    $. = 1;
+    print "ok 10\n" unless 1 .. 10;
+}
index 3c3cc60..4268205 100644 (file)
@@ -33,6 +33,9 @@
   readline() on closed filehandle %s           [Perl_do_readline]
     close STDIN ; $a = <STDIN>;
 
+  readline() on closed filehandle %s           [Perl_do_readline]
+    readline(NONESUCH);
+
   glob failed (child exited with status %d%s)  [Perl_do_readline] <<TODO
 
   Deep recursion on subroutine \"%s\"          [Perl_sub_crush_depth]