Fix tcsh hack in Configure
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index 97f9c75..7cc8655 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -2065,61 +2065,64 @@ PP(pp_method)
     SV* sv;
     SV* ob;
     GV* gv;
-    SV* nm;
+    HV* stash;
+    char* name;
+    char* packname;
+    STRLEN packlen;
 
-    nm = TOPs;
+    name = SvPV(TOPs, na);
     sv = *(stack_base + TOPMARK + 1);
     
-    gv = 0;
     if (SvGMAGICAL(sv))
         mg_get(sv);
     if (SvROK(sv))
        ob = (SV*)SvRV(sv);
     else {
        GV* iogv;
-       char* packname = 0;
-       STRLEN packlen;
 
+       packname = Nullch;
        if (!SvOK(sv) ||
            !(packname = SvPV(sv, packlen)) ||
            !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
            !(ob=(SV*)GvIO(iogv)))
        {
-           char *name = SvPV(nm, na);
-           HV *stash;
-           if (!packname || !isALPHA(*packname))
-DIE("Can't call method \"%s\" without a package or object reference", name);
-           if (!(stash = gv_stashpvn(packname, packlen, FALSE))) {
-               if (gv_stashpvn("UNIVERSAL", 9, FALSE))
-                   stash = gv_stashpvn(packname, packlen, TRUE);
-               else
-                   DIE("Can't call method \"%s\" in empty package \"%s\"",
-                       name, packname);
-           }
-           gv = gv_fetchmethod(stash,name);
-           if (!gv)
-               DIE("Can't locate object method \"%s\" via package \"%s\"",
-                   name, packname);
-           SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
-           RETURN;
+           if (!packname || !isIDFIRST(*packname))
+  DIE("Can't call method \"%s\" without a package or object reference", name);
+           stash = gv_stashpvn(packname, packlen, TRUE);
+           goto fetch;
        }
        *(stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
     }
 
-    if (!ob || !SvOBJECT(ob)) {
-       char *name = SvPV(nm, na);
+    if (!ob || !SvOBJECT(ob))
        DIE("Can't call method \"%s\" on unblessed reference", name);
-    }
 
-    if (!gv) {         /* nothing cached */
-       char *name = SvPV(nm, na);
-       gv = gv_fetchmethod(SvSTASH(ob),name);
-       if (!gv)
-           DIE("Can't locate object method \"%s\" via package \"%s\"",
-               name, HvNAME(SvSTASH(ob)));
-    }
+    stash = SvSTASH(ob);
+
+  fetch:
+    gv = gv_fetchmethod(stash, name);
+    if (!gv) {
+       char* leaf = name;
+       char* sep = Nullch;
+       char* p;
 
+       for (p = name; *p; p++) {
+           if (*p == '\'')
+               sep = p, leaf = p + 1;
+           else if (*p == ':' && *(p + 1) == ':')
+               sep = p, leaf = p + 2;
+       }
+       if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
+           packname = HvNAME(sep ? curcop->cop_stash : stash);
+           packlen = strlen(packname);
+       }
+       else {
+           packname = name;
+           packlen = sep - name;
+       }
+       DIE("Can't locate object method \"%s\" via package \"%.*s\"",
+           leaf, (int)packlen, packname);
+    }
     SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
     RETURN;
 }
-