Initial VMS patches
[p5sagit/p5-mst-13.2.git] / gv.c
diff --git a/gv.c b/gv.c
index e040a41..727692b 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -112,6 +112,7 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
     if (doproto) {                     /* Replicate part of newSUB here. */
        SvIOK_off(gv);
        ENTER;
+       /* XXX unsafe for threads if eval_owner isn't held */
        start_subparse(0,0);            /* Create CV in compcv. */
        GvCV(gv) = PL_compcv;
        LEAVE;
@@ -500,7 +501,9 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
     /* No stash in name, so see how we can default */
 
     if (!stash) {
-       if (isIDFIRST(*name) || (IN_UTF8 && ((*name & 0xc0) == 0xc0) && isIDFIRST_utf8(name))) {
+       if (isIDFIRST(*name)
+           || (IN_UTF8 && ((*name & 0xc0) == 0xc0) && isIDFIRST_utf8((U8*)name)))
+       {
            bool global = FALSE;
 
            if (isUPPER(*name)) {
@@ -566,7 +569,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
     if (!stash) {
        if (!add)
            return Nullgv;
-       if (add & ~GV_ADDMULTI) {
+       {
            char sv_type_char = ((sv_type == SVt_PV) ? '$'
                                 : (sv_type == SVt_PVAV) ? '@'
                                 : (sv_type == SVt_PVHV) ? '%'
@@ -668,13 +671,13 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
            GvMULTI_on(PL_siggv);
            hv = GvHVn(PL_siggv);
            hv_magic(hv, PL_siggv, 'S');
-           for(i=1;sig_name[i];i++) {
+           for(i=1;PL_sig_name[i];i++) {
                SV ** init;
-               init=hv_fetch(hv,sig_name[i],strlen(sig_name[i]),1);
+               init=hv_fetch(hv,PL_sig_name[i],strlen(PL_sig_name[i]),1);
                if(init)
                        sv_setsv(*init,&PL_sv_undef);
-               psig_ptr[i] = 0;
-               psig_name[i] = 0;
+               PL_psig_ptr[i] = 0;
+               PL_psig_name[i] = 0;
            }
        }
        break;
@@ -710,7 +713,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
        if (len > 1)
            break;
 #ifdef COMPLEX_STATUS
-       sv_upgrade(GvSV(gv), SVt_PVLV);
+       (void)SvUPGRADE(GvSV(gv), SVt_PVLV);
 #endif
        goto magicalize;
 
@@ -759,6 +762,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
     case '|':
     case '\001':
     case '\002':
+    case '\003':
     case '\004':
     case '\005':
     case '\006':
@@ -813,7 +817,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
     case ']':
        if (len == 1) {
            SV *sv = GvSV(gv);
-           sv_upgrade(sv, SVt_PVNV);
+           (void)SvUPGRADE(sv, SVt_PVNV);
            sv_setpv(sv, PL_patchlevel);
            (void)sv_2nv(sv);
            SvREADONLY_on(sv);
@@ -872,7 +876,8 @@ newIO(void)
     SvREFCNT(io) = 1;
     SvOBJECT_on(io);
     iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV);
-    if (!iogv)
+    /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
+    if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
       iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV);
     SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv));
     return io;
@@ -1014,6 +1019,7 @@ Gv_AMupdate(HV *stash)
   MAGIC* mg=mg_find((SV*)stash,'c');
   AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
   AMT amt;
+  STRLEN n_a;
 
   if (mg && amtp->was_ok_am == PL_amagic_generation
       && amtp->was_ok_sub == PL_sub_generation)
@@ -1044,16 +1050,16 @@ Gv_AMupdate(HV *stash)
     SV* sv;
     SV** svp;
 
-    /* Work with "fallback" key, which we assume to be first in AMG_names */
+    /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
 
-    if (( cp = (char *)AMG_names[0] ) &&
+    if (( cp = (char *)PL_AMG_names[0] ) &&
        (svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
       if (SvTRUE(sv)) amt.fallback=AMGfallYES;
       else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
     }
     for (i = 1; i < NofAMmeth; i++) {
       cv = 0;
-      cp = (char *)AMG_names[i];
+      cp = (char *)PL_AMG_names[i];
       
         svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
         if (svp && ((sv = *svp) != &PL_sv_undef)) {
@@ -1061,7 +1067,7 @@ Gv_AMupdate(HV *stash)
             default:
               if (!SvROK(sv)) {
                 if (!SvOK(sv)) break;
-               gv = gv_fetchmethod(stash, SvPV(sv, PL_na));
+               gv = gv_fetchmethod(stash, SvPV(sv, n_a));
                 if (gv) cv = GvCV(gv);
                 break;
               }
@@ -1096,9 +1102,9 @@ Gv_AMupdate(HV *stash)
     SV* sv = NULL;
     SV** svp;
 
-    /* Work with "fallback" key, which we assume to be first in AMG_names */
+    /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
 
-    if ( cp = AMG_names[0] ) {
+    if ( cp = PL_AMG_names[0] ) {
        /* Try to find via inheritance. */
        gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
        if (gv) sv = GvSV(gv);
@@ -1109,7 +1115,7 @@ Gv_AMupdate(HV *stash)
     }
 
     for (i = 1; i < NofAMmeth; i++) {
-       SV *cookie = sv_2mortal(newSVpvf("(%s", cp = AMG_names[i]));
+       SV *cookie = sv_2mortal(newSVpvf("(%s", cp = PL_AMG_names[i]));
        DEBUG_o( deb("Checking overloading of `%s' in package `%.256s'\n",
                     cp, HvNAME(stash)) );
        /* don't fill the cache while looking up! */
@@ -1122,7 +1128,7 @@ Gv_AMupdate(HV *stash)
                GV *ngv;
                
                DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", 
-                            SvPV(GvSV(gv), PL_na), cp, HvNAME(stash)) );
+                            SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
                if (!SvPOK(GvSV(gv)) 
                    || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
                                                       FALSE)))
@@ -1267,6 +1273,15 @@ amagic_call(SV *left, SV *right, int method, int flags)
             lr = 1;
           }
           break;
+        case iter_amg:                 /* XXXX Eventually should do to_gv. */
+        case to_sv_amg:
+        case to_av_amg:
+        case to_hv_amg:
+        case to_gv_amg:
+        case to_cv_amg:
+            /* FAIL safe */
+            return NULL;       /* Delegate operation to standard mechanisms. */
+            break;
         default:
           goto not_found;
         }
@@ -1322,7 +1337,7 @@ amagic_call(SV *left, SV *right, int method, int flags)
        if (off==-1) off=method;
        msg = sv_2mortal(newSVpvf(
                      "Operation `%s': no method found,%sargument %s%s%s%s",
-                     AMG_names[method + assignshift],
+                     PL_AMG_names[method + assignshift],
                      (flags & AMGf_unary ? " " : "\n\tleft "),
                      SvAMAGIC(left)? 
                        "in overloaded package ":
@@ -1351,11 +1366,11 @@ amagic_call(SV *left, SV *right, int method, int flags)
   if (!notfound) {
     DEBUG_o( deb(
   "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
-                AMG_names[off],
+                PL_AMG_names[off],
                 method+assignshift==off? "" :
                             " (initially `",
                 method+assignshift==off? "" :
-                            AMG_names[method+assignshift],
+                            PL_AMG_names[method+assignshift],
                 method+assignshift==off? "" : "')",
                 flags & AMGf_unary? "" :
                   lr==1 ? " for right argument": " for left argument",
@@ -1415,7 +1430,7 @@ amagic_call(SV *left, SV *right, int method, int flags)
     PUSHs(lr>0? left: right);
     PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
     if (notfound) {
-      PUSHs( sv_2mortal(newSVpv((char *)AMG_names[method + assignshift],0)) );
+      PUSHs( sv_2mortal(newSVpv((char *)PL_AMG_names[method + assignshift],0)));
     }
     PUSHs((SV*)cv);
     PUTBACK;
@@ -1426,6 +1441,7 @@ amagic_call(SV *left, SV *right, int method, int flags)
     SPAGAIN;
 
     res=POPs;
+    PUTBACK;
     POPSTACK;
     CATCH_SET(oldcatch);