hush warnings about malformed EBCDIC text
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index dc5e3b6..b0d53bc 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -172,8 +172,12 @@ PP(pp_concat)
                /* Take a copy since we're about to overwrite TARG */
                olds = s = (U8*)savepvn((char*)s, len);
            }
-           if (!SvOK(left) && SvTYPE(left) <= SVt_PVMG)
-               sv_setpv(left, "");     /* Suppress warning. */
+           if (!SvOK(left) && SvTYPE(left) <= SVt_PVMG) {
+               if (SvREADONLY(left))
+                   left = sv_2mortal(newSVsv(left));
+               else
+                   sv_setpv(left, ""); /* Suppress warning. */
+           }
             l = (U8*)SvPV(left, targlen);
            left_utf |= DO_UTF8(left);
             if (TARG != left)
@@ -1339,7 +1343,7 @@ Perl_do_readline(pTHX)
                        }
                        else {
                           PerlIO_rewind(tmpfp);
-                          IoTYPE(io) = '<';
+                          IoTYPE(io) = IoTYPE_RDONLY;
                           IoIFP(io) = fp = tmpfp;
                           IoFLAGS(io) &= ~IOf_UNTAINT;  /* maybe redundant */
                        }
@@ -1393,7 +1397,7 @@ Perl_do_readline(pTHX)
        else if (type == OP_GLOB)
            SP--;
        else if (ckWARN(WARN_IO)        /* stdout/stderr or other write fh */
-                && (IoTYPE(io) == '>' || fp == PerlIO_stdout()
+                && (IoTYPE(io) == IoTYPE_WRONLY || fp == PerlIO_stdout()
                     || fp == PerlIO_stderr()))
        {
            /* integrate with report_evil_fh()? */
@@ -1412,7 +1416,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)",
@@ -1445,6 +1450,13 @@ Perl_do_readline(pTHX)
        offset = 0;
     }
 
+    /* This should not be marked tainted if the fp is marked clean */
+#define MAYBE_TAINT_LINE(io, sv) \
+    if (!(IoFLAGS(io) & IOf_UNTAINT)) { \
+       TAINT;                          \
+       SvTAINTED_on(sv);               \
+    }
+
 /* delay EOF state for a snarfed empty file */
 #define SNARF_EOF(gimme,rs,io,sv) \
     (gimme != G_SCALAR || SvCUR(sv)                                    \
@@ -1473,13 +1485,10 @@ Perl_do_readline(pTHX)
                (void)SvOK_off(TARG);
                PUSHTARG;
            }
+           MAYBE_TAINT_LINE(io, sv);
            RETURN;
        }
-       /* This should not be marked tainted if the fp is marked clean */
-       if (!(IoFLAGS(io) & IOf_UNTAINT)) {
-           TAINT;
-           SvTAINTED_on(sv);
-       }
+       MAYBE_TAINT_LINE(io, sv);
        IoLINES(io)++;
        IoFLAGS(io) |= IOf_NOLINE;
        SvSETMAGIC(sv);