X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=gv.c;h=39f4b6ad932372e57f45a74e3b08329c74c372a7;hb=0c5a913da36d66becd2cf3a592f69c87a3e9b51b;hp=f1fe7841e48d29792fb05ee333b41ec89bba4f16;hpb=a0288114f9bfa2566e353eba77114ea63b616631;p=p5sagit%2Fp5-mst-13.2.git diff --git a/gv.c b/gv.c index f1fe784..39f4b6a 100644 --- a/gv.c +++ b/gv.c @@ -37,6 +37,19 @@ Perl stores its global variables. static const char S_autoload[] = "AUTOLOAD"; static const STRLEN S_autolen = sizeof(S_autoload)-1; + +#ifdef PERL_DONT_CREATE_GVSV +GV * +Perl_gv_SVadd(pTHX_ GV *gv) +{ + if (!gv || SvTYPE((SV*)gv) != SVt_PVGV) + Perl_croak(aTHX_ "Bad symbol for scalar"); + if (!GvSV(gv)) + GvSV(gv) = NEWSV(72,0); + return gv; +} +#endif + GV * Perl_gv_AVadd(pTHX_ register GV *gv) { @@ -92,11 +105,15 @@ Perl_gv_fetchfile(pTHX_ const char *name) /* This is where the debugger's %{"::_<$filename"} hash is created */ tmpbuf[0] = '_'; tmpbuf[1] = '<'; - strcpy(tmpbuf + 2, name); + memcpy(tmpbuf + 2, name, tmplen - 1); gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE); if (!isGV(gv)) { gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE); - sv_setpv(GvSV(gv), name); +#ifdef PERL_DONT_CREATE_GVSV + GvSV(gv) = newSVpvn(name, tmplen - 2); +#else + sv_setpvn(GvSV(gv), name, tmplen - 2); +#endif if (PERLDB_LINE) hv_magic(GvHVn(gv_AVadd(gv)), Nullgv, PERL_MAGIC_dbfile); } @@ -120,11 +137,15 @@ Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi) SvLEN_set(gv, 0); SvPOK_off(gv); } else - Safefree(SvPVX_const(gv)); + Safefree(SvPVX_mutable(gv)); } Newz(602, gp, 1, GP); GvGP(gv) = gp_ref(gp); +#ifdef PERL_DONT_CREATE_GVSV + GvSV(gv) = 0; +#else GvSV(gv) = NEWSV(72,0); +#endif GvLINE(gv) = CopLINE(PL_curcop); /* XXX Ideally this cast would be replaced with a change to const char* in the struct. */ @@ -132,7 +153,9 @@ Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi) GvCVGEN(gv) = 0; GvEGV(gv) = gv; sv_magic((SV*)gv, (SV*)gv, PERL_MAGIC_glob, Nullch, 0); - GvSTASH(gv) = (HV*)SvREFCNT_inc(stash); + GvSTASH(gv) = stash; + if (stash) + Perl_sv_add_backref(aTHX_ (SV*)stash, (SV*)gv); GvNAME(gv) = savepvn(name, len); GvNAMELEN(gv) = len; if (multi || doproto) /* doproto means it _was_ mentioned */ @@ -169,6 +192,14 @@ S_gv_init_sv(pTHX_ GV *gv, I32 sv_type) case SVt_PVHV: (void)GvHVn(gv); break; +#ifdef PERL_DONT_CREATE_GVSV + case SVt_NULL: + case SVt_PVCV: + case SVt_PVFM: + break; + default: + (void)GvSVn(gv); +#endif } } @@ -425,7 +456,7 @@ Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload) nsplit = ++nend; } if (nsplit) { - const char *origname = name; + const char * const origname = name; name = nsplit + 1; if (*nsplit == ':') --nsplit; @@ -460,7 +491,7 @@ Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload) gv = gv_autoload4(ostash, name, nend - name, TRUE); } else if (autoload) { - CV* cv = GvCV(gv); + CV* const cv = GvCV(gv); if (!CvROOT(cv) && !CvXSUB(cv)) { GV* stubgv; GV* autogv; @@ -498,7 +529,7 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method) return Nullgv; if (stash) { if (SvTYPE(stash) < SVt_PVHV) { - packname = SvPV((SV*)stash, packname_len); + packname = SvPV_const((SV*)stash, packname_len); stash = Nullhv; } else { @@ -544,10 +575,14 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method) vargv = *(GV**)hv_fetch(varstash, S_autoload, S_autolen, TRUE); ENTER; - if (!isGV(vargv)) + if (!isGV(vargv)) { gv_init(vargv, varstash, S_autoload, S_autolen, FALSE); +#ifdef PERL_DONT_CREATE_GVSV + GvSV(vargv) = NEWSV(72,0); +#endif + } LEAVE; - varsv = GvSV(vargv); + varsv = GvSVn(vargv); sv_setpvn(varsv, packname, packname_len); sv_catpvn(varsv, "::", 2); sv_catpvn(varsv, name, len); @@ -650,7 +685,7 @@ HV* Perl_gv_stashsv(pTHX_ SV *sv, I32 create) { STRLEN len; - const char *ptr = SvPV(sv,len); + const char * const ptr = SvPV_const(sv,len); return gv_stashpvn(ptr, len, create); } @@ -663,7 +698,7 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type) { GV * Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, I32 sv_type) { STRLEN len; - const char *nambeg = SvPV(name, len); + const char * const nambeg = SvPV_const(name, len); return gv_fetchpvn_flags(nambeg, len, flags | SvUTF8(name), sv_type); } @@ -811,7 +846,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, if (!stash) { if (add) { - register SV *err = Perl_mess(aTHX_ + SV * const err = Perl_mess(aTHX_ "Global symbol \"%s%s\" requires explicit package name", (sv_type == SVt_PV ? "$" : sv_type == SVt_PVAV ? "@" @@ -867,7 +902,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, } else #endif { - const char *name2 = name + 1; + const char * const name2 = name + 1; switch (*name) { case 'A': if (strEQ(name2, "RGV")) { @@ -880,7 +915,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, break; case 'I': if (strEQ(name2, "SA")) { - AV* av = GvAVn(gv); + AV* const av = GvAVn(gv); GvMULTI_on(gv); sv_magic((SV*)av, (SV*)gv, PERL_MAGIC_isa, Nullch, 0); /* NOTE: No support for tied ISA */ @@ -903,7 +938,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, break; case 'O': if (strEQ(name2, "VERLOAD")) { - HV* hv = GvHVn(gv); + HV* const hv = GvHVn(gv); GvMULTI_on(gv); hv_magic(hv, Nullgv, PERL_MAGIC_overload); } @@ -921,8 +956,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, hv = GvHVn(gv); hv_magic(hv, Nullgv, PERL_MAGIC_sig); for (i = 1; i < SIG_SIZE; i++) { - SV ** init; - init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1); + SV ** const init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1); if (init) sv_setsv(*init, &PL_sv_undef); PL_psig_ptr[i] = 0; @@ -1000,12 +1034,12 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, goto ro_magicalize; case ':': - sv_setpv(GvSV(gv),PL_chopset); + sv_setpv(GvSVn(gv),PL_chopset); goto magicalize; case '?': #ifdef COMPLEX_STATUS - (void)SvUPGRADE(GvSV(gv), SVt_PVLV); + SvUPGRADE(GvSVn(gv), SVt_PVLV); #endif goto magicalize; @@ -1017,7 +1051,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, now (rather than going to magicalize) */ - sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, len); + sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len); if (sv_type == SVt_PVHV) require_errno(gv); @@ -1025,28 +1059,24 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, break; case '-': { - AV* av = GvAVn(gv); + AV* const av = GvAVn(gv); sv_magic((SV*)av, Nullsv, PERL_MAGIC_regdata, Nullch, 0); SvREADONLY_on(av); goto magicalize; } case '*': - if (sv_type == SVt_PV && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)) - Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX), - "$* is no longer supported"); - break; case '#': if (sv_type == SVt_PV && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)) Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX), - "Use of $# is deprecated"); - goto magicalize; + "$%c is no longer supported", *name); + break; case '|': - sv_setiv(GvSV(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0); + sv_setiv(GvSVn(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0); goto magicalize; case '+': { - AV* av = GvAVn(gv); + AV* const av = GvAVn(gv); sv_magic((SV*)av, (SV*)av, PERL_MAGIC_regdata, Nullch, 0); SvREADONLY_on(av); /* FALL THROUGH */ @@ -1062,7 +1092,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, case '8': case '9': ro_magicalize: - SvREADONLY_on(GvSV(gv)); + SvREADONLY_on(GvSVn(gv)); /* FALL THROUGH */ case '[': case '^': @@ -1090,19 +1120,19 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, case '\024': /* $^T */ case '\027': /* $^W */ magicalize: - sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, len); + sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len); break; case '\014': /* $^L */ - sv_setpv(GvSV(gv),"\f"); - PL_formfeed = GvSV(gv); + sv_setpvn(GvSVn(gv),"\f",1); + PL_formfeed = GvSVn(gv); break; case ';': - sv_setpv(GvSV(gv),"\034"); + sv_setpvn(GvSVn(gv),"\034",1); break; case ']': { - SV *sv = GvSV(gv); + SV * const sv = GvSVn(gv); if (!sv_derived_from(PL_patchlevel, "version")) (void *)upg_version(PL_patchlevel); GvSV(gv) = vnumify(PL_patchlevel); @@ -1112,7 +1142,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, break; case '\026': /* $^V */ { - SV * const sv = GvSV(gv); + SV * const sv = GvSVn(gv); GvSV(gv) = new_version(PL_patchlevel); SvREADONLY_on(GvSV(gv)); SvREFCNT_dec(sv); @@ -1194,8 +1224,7 @@ Perl_newIO(pTHX) sv_upgrade((SV *)io,SVt_PVIO); SvREFCNT(io) = 1; SvOBJECT_on(io); - /* Clear the stashcache because a new IO could overrule a - package name */ + /* Clear the stashcache because a new IO could overrule a package name */ hv_clear(PL_stashcache); iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV); /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */ @@ -1332,13 +1361,13 @@ Perl_gp_free(pTHX_ GV *gv) int Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg) { - AMT *amtp = (AMT*)mg->mg_ptr; - (void)sv; + AMT * const amtp = (AMT*)mg->mg_ptr; + PERL_UNUSED_ARG(sv); if (amtp && AMT_AMAGIC(amtp)) { int i; for (i = 1; i < NofAMmeth; i++) { - CV *cv = amtp->table[i]; + CV * const cv = amtp->table[i]; if (cv != Nullcv) { SvREFCNT_dec((SV *) cv); amtp->table[i] = Nullcv; @@ -1353,10 +1382,8 @@ Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg) bool Perl_Gv_AMupdate(pTHX_ HV *stash) { - GV* gv; - CV* cv; - MAGIC* mg=mg_find((SV*)stash, PERL_MAGIC_overload_table); - AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL; + MAGIC* const mg = mg_find((SV*)stash, PERL_MAGIC_overload_table); + AMT * const amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL; AMT amt; if (mg && amtp->was_ok_am == PL_amagic_generation @@ -1375,17 +1402,21 @@ Perl_Gv_AMupdate(pTHX_ HV *stash) { int filled = 0, have_ovl = 0; int i, lim = 1; - SV* sv = NULL; /* Work with "fallback" key, which we assume to be first in PL_AMG_names */ /* Try to find via inheritance. */ - gv = gv_fetchmeth(stash, PL_AMG_names[0], 2, -1); - if (gv) - sv = GvSV(gv); + GV *gv = gv_fetchmeth(stash, PL_AMG_names[0], 2, -1); + SV * const sv = gv ? GvSV(gv) : NULL; + CV* cv; if (!gv) lim = DESTROY_amg; /* Skip overloading entries. */ +#ifdef PERL_DONT_CREATE_GVSV + else if (!sv) { + /* Equivalent to !SvTRUE and !SvOK */ + } +#endif else if (SvTRUE(sv)) amt.fallback=AMGfallYES; else if (SvOK(sv)) @@ -1421,17 +1452,17 @@ Perl_Gv_AMupdate(pTHX_ HV *stash) knowing *which* methods were declared as overloaded. */ /* GvSV contains the name of the method. */ GV *ngv = Nullgv; + SV *gvsv = GvSV(gv); DEBUG_o( Perl_deb(aTHX_ "Resolving method \"%"SVf256\ "\" for overloaded \"%s\" in package \"%.256s\"\n", GvSV(gv), cp, hvname) ); - if (!SvPOK(GvSV(gv)) - || !(ngv = gv_fetchmethod_autoload(stash, SvPVX_const(GvSV(gv)), + if (!gvsv || !SvPOK(gvsv) + || !(ngv = gv_fetchmethod_autoload(stash, SvPVX_const(gvsv), FALSE))) { /* Can be an import stub (created by "can"). */ - SV *gvsv = GvSV(gv); - const char *name = SvPOK(gvsv) ? SvPVX_const(gvsv) : "???"; + const char * const name = (gvsv && SvPOK(gvsv)) ? SvPVX_const(gvsv) : "???"; Perl_croak(aTHX_ "%s method \"%.256s\" overloading \"%s\" "\ "in package \"%.256s\"", (GvCVGEN(gv) ? "Stub found while resolving" @@ -1440,8 +1471,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash) } cv = GvCV(gv = ngv); } - DEBUG_o( Perl_deb(aTHX_ "Overloading \"%s\" in package \"%.256s\" "\ - "via \"%.256s::%.256s\"\n", + DEBUG_o( Perl_deb(aTHX_ "Overloading \"%s\" in package \"%.256s\" via \"%.256s::%.256s\"\n", cp, HvNAME_get(stash), HvNAME_get(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv))) ); filled = 1; @@ -1516,8 +1546,10 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags) CV *cv=NULL; CV **cvp=NULL, **ocvp=NULL; AMT *amtp=NULL, *oamtp=NULL; - int off=0, off1, lr=0, assign=AMGf_assign & flags, notfound=0; - int postpr = 0, force_cpy = 0, assignshift = assign ? 1 : 0; + int off = 0, off1, lr = 0, notfound = 0; + int postpr = 0, force_cpy = 0; + int assign = AMGf_assign & flags; + const int assignshift = assign ? 1 : 0; #ifdef DEBUGGING int fl=0; #endif @@ -1865,7 +1897,7 @@ bool Perl_is_gv_magical_sv(pTHX_ SV *name, U32 flags) { STRLEN len; - const char *temp = SvPV(name, len); + const char *temp = SvPV_const(name, len); return is_gv_magical(temp, len, flags); } @@ -1889,9 +1921,10 @@ pointers returned by SvPV. bool Perl_is_gv_magical(pTHX_ const char *name, STRLEN len, U32 flags) { - (void)flags; + PERL_UNUSED_ARG(flags); + if (len > 1) { - const char *name1 = name + 1; + const char * const name1 = name + 1; switch (*name) { case 'I': if (len == 3 && name1[1] == 'S' && name[2] == 'A')