emit more appropriate diagnostic for failed glob (variant
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index deb4985..7709c53 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1270,9 +1270,14 @@ do_readline(void)
            SP--;
     }
     if (!fp) {
-       if (ckWARN(WARN_CLOSED) && io && !(IoFLAGS(io) & IOf_START))
-           warner(WARN_CLOSED,
-                  "Read on closed filehandle <%s>", GvENAME(PL_last_in_gv));
+       if (ckWARN(WARN_CLOSED) && io && !(IoFLAGS(io) & IOf_START)) {
+           if (type == OP_GLOB)
+               warner(WARN_CLOSED, "glob failed (can't start child: %s)",
+                      Strerror(errno));
+           else
+               warner(WARN_CLOSED, "Read on closed filehandle <%s>",
+                      GvENAME(PL_last_in_gv));
+       }
        if (gimme == G_SCALAR) {
            (void)SvOK_off(TARG);
            PUSHTARG;
@@ -2094,10 +2099,13 @@ PP(pp_entersub)
        break;
     case SVt_PVGV:
        if (!(cv = GvCVu((GV*)sv)))
-           cv = sv_2cv(sv, &stash, &gv, TRUE);
-       if (cv)
-           break;
-       DIE("Not a CODE reference");
+           cv = sv_2cv(sv, &stash, &gv, FALSE);
+       if (!cv) {
+           ENTER;
+           SAVETMPS;
+           goto try_autoload;
+       }
+       break;
     }
 
     ENTER;
@@ -2117,16 +2125,19 @@ PP(pp_entersub)
            cv = GvCV(gv);
        }
        /* should call AUTOLOAD now? */
-       else if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
-                                  FALSE)))
-       {
-           cv = GvCV(autogv);
-       }
-       /* sorry */
        else {
-           sub_name = sv_newmortal();
-           gv_efullname3(sub_name, gv, Nullch);
-           DIE("Undefined subroutine &%s called", SvPVX(sub_name));
+try_autoload:
+           if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
+                                  FALSE)))
+           {
+               cv = GvCV(autogv);
+           }
+           /* sorry */
+           else {
+               sub_name = sv_newmortal();
+               gv_efullname3(sub_name, gv, Nullch);
+               DIE("Undefined subroutine &%s called", SvPVX(sub_name));
+           }
        }
        if (!cv)
            DIE("Not a CODE reference");