summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo van der Sanden <hv@crypt.org>2000-10-19 00:25:58 +0100
committerJarkko Hietaniemi <jhi@iki.fi>2000-10-18 23:36:24 +0000
commit790090df87a94d63cdbf866bce162581c29c2abf (patch)
tree7d03d55c31794f3ab5ccb6e9fd7ce500ddb28e2f
parent177e2d42271d33bb6d33298a0190fe4d19a3bb61 (diff)
downloadperl-790090df87a94d63cdbf866bce162581c29c2abf.tar.gz
Re: [ID 20001018.008] flip-flop bug when there's no <FH>
Message-Id: <200010182225.XAA20330@crypt.compulink.co.uk> p4raw-id: //depot/perl@7365
-rw-r--r--pp_ctl.c15
-rw-r--r--pp_hot.c3
-rwxr-xr-xt/op/flip.t9
-rw-r--r--t/pragma/warn/pp_hot3
4 files changed, 24 insertions, 6 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index d69aaa8a96..cf2000e5c6 100644
--- 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);
diff --git a/pp_hot.c b/pp_hot.c
index 6f582c097b..9b0573bb03 100644
--- 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)",
diff --git a/t/op/flip.t b/t/op/flip.t
index 20167f3333..f66af27d4d 100755
--- a/t/op/flip.t
+++ b/t/op/flip.t
@@ -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;
+}
diff --git a/t/pragma/warn/pp_hot b/t/pragma/warn/pp_hot
index 3c3cc6021f..426820550c 100644
--- a/t/pragma/warn/pp_hot
+++ b/t/pragma/warn/pp_hot
@@ -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]