X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=gv.c;h=e6e4a55690819ce8141e4e554faa46e65b9af576;hb=47cadb06ccb7dbe87fdda243544a1ecb06fb104f;hp=ad0d02d5d157f5a1ca11a33ffbdd8c7a72dcb6f9;hpb=462551cca365518deae1a599764d1a2b3698f44a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/gv.c b/gv.c index ad0d02d..e6e4a55 100644 --- a/gv.c +++ b/gv.c @@ -107,11 +107,12 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi) GvSTASH(gv) = (HV*)SvREFCNT_inc(stash); GvNAME(gv) = savepvn(name, len); GvNAMELEN(gv) = len; - if (multi) + if (multi || doproto) /* doproto means it _was_ mentioned */ GvMULTI_on(gv); 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)) { @@ -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);