This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Document SvGAMAGIC(), and its significance w.r.t. the side effects of
[perl5.git] / pp_ctl.c
index d7d3fda..f88d401 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -113,7 +113,7 @@ PP(pp_regcomp)
        tmpstr = POPs;
 
     if (SvROK(tmpstr)) {
-       SV *sv = SvRV(tmpstr);
+       SV * const sv = SvRV(tmpstr);
        if(SvMAGICAL(sv))
            mg = mg_find(sv, PERL_MAGIC_qr);
     }
@@ -125,14 +125,14 @@ PP(pp_regcomp)
     else {
        STRLEN len;
        const char *t = SvPV_const(tmpstr, len);
+       regexp * const re = PM_GETRE(pm);
 
        /* Check against the last compiled regexp. */
-       if (!PM_GETRE(pm) || !PM_GETRE(pm)->precomp ||
-           PM_GETRE(pm)->prelen != (I32)len ||
-           memNE(PM_GETRE(pm)->precomp, t, len))
+       if (!re || !re->precomp || re->prelen != (I32)len ||
+           memNE(re->precomp, t, len))
        {
-           if (PM_GETRE(pm)) {
-               ReREFCNT_dec(PM_GETRE(pm));
+           if (re) {
+               ReREFCNT_dec(re);
                PM_SETRE(pm, NULL);     /* crucial if regcomp aborts */
            }
            if (PL_op->op_flags & OPf_SPECIAL)
@@ -831,7 +831,11 @@ PP(pp_formline)
            /* Formats aren't yet marked for locales, so assume "yes". */
            {
                STORE_NUMERIC_STANDARD_SET_LOCAL();
+#ifdef USE_SNPRINTF
+               snprintf(t, SvLEN(PL_formtarget) - (t - SvPVX(PL_formtarget)), fmt, (int) fieldsize, (int) arg & 255, value);
+#else
                sprintf(t, fmt, (int) fieldsize, (int) arg & 255, value);
+#endif /* ifdef USE_SNPRINTF */
                RESTORE_NUMERIC_STANDARD();
            }
            t += fieldsize;
@@ -1450,7 +1454,7 @@ Perl_qerror(pTHX_ SV *err)
     else if (PL_errors)
        sv_catsv(PL_errors, err);
     else
-       Perl_warn(aTHX_ "%"SVf, err);
+       Perl_warn(aTHX_ "%"SVf, (void*)err);
     ++PL_error_count;
 }
 
@@ -1925,7 +1929,7 @@ PP(pp_leaveloop)
 
     TAINT_NOT;
     if (gimme == G_VOID)
-       /*EMPTY*/; /* do nothing */
+       NOOP;
     else if (gimme == G_SCALAR) {
        if (mark < SP)
            *++newsp = sv_mortalcopy(*SP);
@@ -2012,7 +2016,7 @@ PP(pp_return)
            /* Unassume the success we assumed earlier. */
            SV * const nsv = cx->blk_eval.old_namesv;
            (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
-           DIE(aTHX_ "%"SVf" did not return a true value", nsv);
+           DIE(aTHX_ "%"SVf" did not return a true value", (void*)nsv);
        }
        break;
     case CXt_FORMAT:
@@ -2320,7 +2324,7 @@ PP(pp_goto)
                        goto retry;
                    tmpstr = sv_newmortal();
                    gv_efullname3(tmpstr, gv, NULL);
-                   DIE(aTHX_ "Goto undefined subroutine &%"SVf"",tmpstr);
+                   DIE(aTHX_ "Goto undefined subroutine &%"SVf"",(void*)tmpstr);
                }
                DIE(aTHX_ "Goto undefined subroutine");
            }
@@ -2769,8 +2773,13 @@ Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, const char *code, PAD** padp)
        len = SvCUR(sv);
     }
     else
+#ifdef USE_SNPRINTF
+       len = snprintf(tmpbuf, sizeof(tbuf), "_<(%.10s_eval %lu)", code,
+                      (unsigned long)++PL_evalseq);
+#else
        len = my_sprintf(tmpbuf, "_<(%.10s_eval %lu)", code,
                         (unsigned long)++PL_evalseq);
+#endif /* ifdef USE_SNPRINTF */
     SAVECOPFILE_FREE(&PL_compiling);
     CopFILE_set(&PL_compiling, tmpbuf+2);
     SAVECOPLINE(&PL_compiling);
@@ -2898,6 +2907,7 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
     /* set up a scratch pad */
 
     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE);
+    PL_op = NULL; /* avoid PL_op and PL_curpad referring to different CVs */
 
 
     if (!PL_madskills)
@@ -2994,7 +3004,7 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
     DEBUG_x(dump_eval());
 
     /* Register with debugger: */
-    if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
+    if (PERLDB_INTER && saveop && saveop->op_type == OP_REQUIRE) {
        CV * const cv = get_cv("DB::postponed", FALSE);
        if (cv) {
            dSP;
@@ -3016,10 +3026,11 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
 }
 
 STATIC PerlIO *
-S_check_type_and_open(pTHX_ const char *name, const char *mode)
+S_check_type_and_open(const char *name, const char *mode)
 {
     Stat_t st;
     const int st_rc = PerlLIO_stat(name, &st);
+
     if (st_rc < 0 || S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
        return NULL;
     }
@@ -3067,6 +3078,7 @@ PP(pp_require)
     const I32 gimme = GIMME_V;
     int filter_has_file = 0;
     PerlIO *tryrsfp = NULL;
+    SV *filter_cache = NULL;
     SV *filter_state = NULL;
     SV *filter_sub = NULL;
     SV *hook_sv = NULL;
@@ -3085,12 +3097,12 @@ PP(pp_require)
        if (cUNOP->op_first->op_type == OP_CONST && cUNOP->op_first->op_private & OPpCONST_NOVER) {
            if ( vcmp(sv,PL_patchlevel) < 0 )
                DIE(aTHX_ "Perls since %"SVf" too modern--this is %"SVf", stopped",
-                   vnormal(sv), vnormal(PL_patchlevel));
+                   (void*)vnormal(sv), (void*)vnormal(PL_patchlevel));
        }
        else {
            if ( vcmp(sv,PL_patchlevel) > 0 )
                DIE(aTHX_ "Perl %"SVf" required--this is only %"SVf", stopped",
-                   vnormal(sv), vnormal(PL_patchlevel));
+                   (void*)vnormal(sv), (void*)vnormal(PL_patchlevel));
        }
 
            RETPUSHYES;
@@ -3136,7 +3148,7 @@ PP(pp_require)
        {
            namesv = newSV(0);
            for (i = 0; i <= AvFILL(ar); i++) {
-               SV *dirsv = *av_fetch(ar, i, TRUE);
+               SV * const dirsv = *av_fetch(ar, i, TRUE);
 
                if (SvROK(dirsv)) {
                    int count;
@@ -3174,12 +3186,22 @@ PP(pp_require)
                        SP -= count - 1;
                        arg = SP[i++];
 
+                       if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV)
+                           && !isGV_with_GP(SvRV(arg))) {
+                           filter_cache = SvRV(arg);
+                           SvREFCNT_inc_void_NN(filter_cache);
+
+                           if (i < count) {
+                               arg = SP[i++];
+                           }
+                       }
+
                        if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
                            arg = SvRV(arg);
                        }
 
                        if (SvTYPE(arg) == SVt_PVGV) {
-                           IO *io = GvIO((GV *)arg);
+                           IO * const io = GvIO((GV *)arg);
 
                            ++filter_has_file;
 
@@ -3205,11 +3227,11 @@ PP(pp_require)
                                filter_state = SP[i];
                                SvREFCNT_inc_simple_void(filter_state);
                            }
+                       }
 
-                           if (!tryrsfp) {
-                               tryrsfp = PerlIO_open(BIT_BUCKET,
-                                                     PERL_SCRIPT_MODE);
-                           }
+                       if (!tryrsfp && (filter_cache || filter_sub)) {
+                           tryrsfp = PerlIO_open(BIT_BUCKET,
+                                                 PERL_SCRIPT_MODE);
                        }
                        SP--;
                    }
@@ -3224,6 +3246,10 @@ PP(pp_require)
                    }
 
                    filter_has_file = 0;
+                   if (filter_cache) {
+                       SvREFCNT_dec(filter_cache);
+                       filter_cache = NULL;
+                   }
                    if (filter_state) {
                        SvREFCNT_dec(filter_state);
                        filter_state = NULL;
@@ -3361,11 +3387,12 @@ PP(pp_require)
     SAVESPTR(PL_compiling.cop_io);
     PL_compiling.cop_io = NULL;
 
-    if (filter_sub) {
+    if (filter_sub || filter_cache) {
        SV * const datasv = filter_add(S_run_user_filter, NULL);
        IoLINES(datasv) = filter_has_file;
        IoTOP_GV(datasv) = (GV *)filter_state;
        IoBOTTOM_GV(datasv) = (GV *)filter_sub;
+       IoFMT_GV(datasv) = (GV *)filter_cache;
     }
 
     /* switch to eval mode */
@@ -3405,6 +3432,10 @@ PP(pp_entereval)
     CV* runcv;
     U32 seq;
     HV *saved_hh = NULL;
+    const char * const fakestr = "_<(eval )";
+#ifdef HAS_STRLCPY
+    const int fakelen = 9 + 1;
+#endif
     
     if (PL_op->op_private & OPpEVAL_HAS_HH) {
        saved_hh = (HV*) SvREFCNT_inc(POPs);
@@ -3430,7 +3461,11 @@ PP(pp_entereval)
        len = SvCUR(temp_sv);
     }
     else
+#ifdef USE_SNPRINTF
+       len = snprintf(tmpbuf, sizeof(tbuf), "_<(eval %lu)", (unsigned long)++PL_evalseq);
+#else
        len = my_sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
+#endif /* ifdef USE_SNPRINTF */
     SAVECOPFILE_FREE(&PL_compiling);
     CopFILE_set(&PL_compiling, tmpbuf+2);
     SAVECOPLINE(&PL_compiling);
@@ -3483,7 +3518,12 @@ PP(pp_entereval)
     ret = doeval(gimme, NULL, runcv, seq);
     if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */
        && ret != PL_op->op_next) {     /* Successive compilation. */
-       strcpy(safestr, "_<(eval )");   /* Anything fake and short. */
+       /* Copy in anything fake and short. */
+#ifdef HAS_STRLCPY
+       strlcpy(safestr, fakestr, fakelen);
+#else
+       strcpy(safestr, fakestr);
+#endif /* #ifdef HAS_STRLCPY */
     }
     return DOCATCH(ret);
 }
@@ -3544,7 +3584,7 @@ PP(pp_leaveeval)
        /* Unassume the success we assumed earlier. */
        SV * const nsv = cx->blk_eval.old_namesv;
        (void)hv_delete(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv), G_DISCARD);
-       retop = Perl_die(aTHX_ "%"SVf" did not return a true value", nsv);
+       retop = Perl_die(aTHX_ "%"SVf" did not return a true value", (void*)nsv);
        /* die_where() did LEAVE, or we won't be here */
     }
     else {
@@ -3605,7 +3645,7 @@ Perl_create_eval_scope(pTHX_ U32 flags)
 PP(pp_entertry)
 {
     dVAR;
-    PERL_CONTEXT *cx = create_eval_scope(0);
+    PERL_CONTEXT * const cx = create_eval_scope(0);
     cx->blk_eval.retop = cLOGOP->op_other->op_next;
     return DOCATCH(PL_op->op_next);
 }
@@ -3875,7 +3915,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
        if (c == 0)
            PUSHs(&PL_sv_no);
        else if (SvTEMP(TOPs))
-           SvREFCNT_inc(TOPs);
+           SvREFCNT_inc_void(TOPs);
        FREETMPS;
        LEAVE;
        RETURN;
@@ -4116,7 +4156,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
        if (c == 0)
            PUSHs(&PL_sv_undef);
        else if (SvTEMP(TOPs))
-           SvREFCNT_inc(TOPs);
+           SvREFCNT_inc_void(TOPs);
 
        if (SM_OTHER_REF(PVCV)) {
            /* This one has to be null-proto'd too.
@@ -4127,7 +4167,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            if (c == 0)
                PUSHs(&PL_sv_undef);
            else if (SvTEMP(TOPs))
-               SvREFCNT_inc(TOPs);
+               SvREFCNT_inc_void(TOPs);
            FREETMPS;
            LEAVE;
            PUTBACK;
@@ -4519,15 +4559,15 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
     SV * const filter_state = (SV *)IoTOP_GV(datasv);
     SV * const filter_sub = (SV *)IoBOTTOM_GV(datasv);
     int status = 0;
-    /* Filter API says that the filter appends to the contents of the buffer.
-       Usually the buffer is "", so the details don't matter. But if it's not,
-       then clearly what it contains is already filtered by this filter, so we
-       don't want to pass it in a second time.
-       I'm going to use a mortal in case the upstream filter croaks.  */
     SV *upstream;
     STRLEN got_len;
-    const char *got_p;
+    const char *got_p = NULL;
     const char *prune_from = NULL;
+    bool read_from_cache = FALSE;
+    STRLEN umaxlen;
+
+    assert(maxlen >= 0);
+    umaxlen = maxlen;
 
     /* I was having segfault trouble under Linux 2.2.5 after a
        parse error occured.  (Had to hack around it with a test
@@ -4541,13 +4581,13 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
            const char *cache_p = SvPV(cache, cache_len);
            STRLEN take = 0;
 
-           if (maxlen) {
+           if (umaxlen) {
                /* Running in block mode and we have some cached data already.
                 */
-               if (cache_len >= maxlen) {
+               if (cache_len >= umaxlen) {
                    /* In fact, so much data we don't even need to call
                       filter_read.  */
-                   take = maxlen;
+                   take = umaxlen;
                }
            } else {
                const char *const first_nl = memchr(cache_p, '\n', cache_len);
@@ -4563,23 +4603,28 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
            }
 
            sv_catsv(buf_sv, cache);
-           if (maxlen) {
-               maxlen -= cache_len;
+           if (umaxlen) {
+               umaxlen -= cache_len;
            }
            SvOK_off(cache);
+           read_from_cache = TRUE;
        }
     }
 
+    /* Filter API says that the filter appends to the contents of the buffer.
+       Usually the buffer is "", so the details don't matter. But if it's not,
+       then clearly what it contains is already filtered by this filter, so we
+       don't want to pass it in a second time.
+       I'm going to use a mortal in case the upstream filter croaks.  */
     upstream = ((SvOK(buf_sv) && sv_len(buf_sv)) || SvGMAGICAL(buf_sv))
        ? sv_newmortal() : buf_sv;
     SvUPGRADE(upstream, SVt_PV);
        
     if (filter_has_file) {
-       status = FILTER_READ(idx+1, upstream, maxlen);
+       status = FILTER_READ(idx+1, upstream, 0);
     }
 
-    assert(filter_sub);
-    if (status >= 0) {
+    if (filter_sub && status >= 0) {
        dSP;
        int count;
 
@@ -4590,7 +4635,7 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
 
        DEFSV = upstream;
        PUSHMARK(SP);
-       PUSHs(sv_2mortal(newSViv(maxlen)));
+       PUSHs(sv_2mortal(newSViv(0)));
        if (filter_state) {
            PUSHs(filter_state);
        }
@@ -4612,9 +4657,9 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
 
     if(SvOK(upstream)) {
        got_p = SvPV(upstream, got_len);
-       if (maxlen) {
-           if (got_len > maxlen) {
-               prune_from = got_p + maxlen;
+       if (umaxlen) {
+           if (got_len > umaxlen) {
+               prune_from = got_p + umaxlen;
            }
        } else {
            const char *const first_nl = memchr(got_p, '\n', got_len);
@@ -4630,7 +4675,7 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
        SV *cache = (SV *)IoFMT_GV(datasv);
 
        if (!cache) {
-           IoFMT_GV(datasv) = (GV*) (cache = newSV(got_len - maxlen));
+           IoFMT_GV(datasv) = (GV*) (cache = newSV(got_len - umaxlen));
        } else if (SvOK(cache)) {
            /* Cache should be empty.  */
            assert(!SvCUR(cache));
@@ -4650,7 +4695,11 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
            status = 1;
     }
 
-    if (upstream != buf_sv) {
+    /* If they are at EOF but buf_sv has something in it, then they may never
+       have touched the SV upstream, so it may be undefined.  If we naively
+       concatenate it then we get a warning about use of uninitialised value.
+    */
+    if (upstream != buf_sv && (SvOK(upstream) || SvGMAGICAL(upstream))) {
        sv_catsv(buf_sv, upstream);
     }
 
@@ -4667,6 +4716,12 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
        }
        filter_del(S_run_user_filter);
     }
+    if (status == 0 && read_from_cache) {
+       /* If we read some data from the cache (and by getting here it implies
+          that we emptied the cache) then we aren't yet at EOF, and mustn't
+          report that to our caller.  */
+       return 1;
+    }
     return status;
 }