Make op/sprintf.t more comprehensive, take 2
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index e0789db..6df5420 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -145,7 +145,7 @@ PP(pp_concat)
   {
     dPOPTOPssrl;
     STRLEN len;
-    U8 *s;
+    char *s;
     bool left_utf = DO_UTF8(left);
     bool right_utf = DO_UTF8(right);
 
@@ -156,7 +156,7 @@ PP(pp_concat)
         }
         else {
             /* Set TARG to PV(left), then add right */
-            U8 *l, *c;
+            char *l, *c;
             STRLEN targlen;
             if (TARG == right)
                 /* Need a safe copy elsewhere since we're just about to
@@ -182,7 +182,7 @@ PP(pp_concat)
             /* And now copy, maybe upgrading right to UTF8 on the fly */
             for (c = SvEND(TARG); *s; s++) {
                  if (*s & 0x80 && !right_utf)
-                     c = uv_to_utf8(c, *s);
+                     c = (char*)uv_to_utf8((U8*)c, *s);
                  else
                      *c++ = *s;
             }
@@ -1421,8 +1421,7 @@ Perl_do_readline(pTHX)
 /* delay EOF state for a snarfed empty file */
 #define SNARF_EOF(gimme,rs,io,sv) \
     (gimme != G_SCALAR || SvCUR(sv)                                    \
-     || !RsSNARF(rs) || (IoFLAGS(io) & IOf_NOLINE)                     \
-     || ((IoFLAGS(io) |= IOf_NOLINE), FALSE))
+     || (IoFLAGS(io) & IOf_NOLINE) || !RsSNARF(rs))
 
     for (;;) {
        if (!sv_gets(sv, fp, offset)
@@ -1455,6 +1454,7 @@ Perl_do_readline(pTHX)
            SvTAINTED_on(sv);
        }
        IoLINES(io)++;
+       IoFLAGS(io) |= IOf_NOLINE;
        SvSETMAGIC(sv);
        XPUSHs(sv);
        if (type == OP_GLOB) {
@@ -2267,7 +2267,9 @@ S_get_db_sub(pTHX_ SV **svp, CV *cv)
                    && (gv = (GV*)*svp) ))) {
            /* Use GV from the stack as a fallback. */
            /* GV is potentially non-unique, or contain different CV. */
-           sv_setsv(dbsv, newRV((SV*)cv));
+           SV *tmp = newRV((SV*)cv));
+           sv_setsv(dbsv, tmp);
+           SvREFCNT_dec(tmp);
        }
        else {
            gv_efullname3(dbsv, gv, Nullch);
@@ -2690,6 +2692,7 @@ try_autoload:
            cx->blk_sub.savearray = GvAV(PL_defgv);
            GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
 #endif /* USE_THREADS */
+           cx->blk_sub.oldcurpad = PL_curpad;
            cx->blk_sub.argarray = av;
            ++MARK;
 
@@ -2914,6 +2917,7 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
        char* leaf = name;
        char* sep = Nullch;
        char* p;
+       GV* gv;
 
        for (p = name; *p; p++) {
            if (*p == '\'')
@@ -2929,9 +2933,18 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
            packname = name;
            packlen = sep - name;
        }
-       Perl_croak(aTHX_
-                  "Can't locate object method \"%s\" via package \"%s\"",
-                  leaf, packname);
+       gv = gv_fetchpv(packname, 0, SVt_PVHV);
+       if (gv && isGV(gv)) {
+           Perl_croak(aTHX_
+                      "Can't locate object method \"%s\" via package \"%s\"",
+                      leaf, packname);
+       }
+       else {
+           Perl_croak(aTHX_
+                      "Can't locate object method \"%s\" via package \"%s\""
+                      " (perhaps you forgot to load \"%s\"?)",
+                      leaf, packname, packname);
+       }
     }
     return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
 }