X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=004f3193f88d404b06f84d36def777a6af6d2928;hb=c696a6a43b0b5a16f820f8a91db4e187fc9ac45b;hp=3478b410dcc7b02aca27943b1a7c1ecec82fed5c;hpb=a5063e7cd8fef802efd25ffe9df2c3748f4254f6;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index 3478b41..004f319 100644 --- a/mg.c +++ b/mg.c @@ -83,13 +83,13 @@ struct magic_state { STATIC void S_save_magic(pTHX_ I32 mgs_ix, SV *sv) { + dVAR; MGS* mgs; assert(SvMAGICAL(sv)); -#ifdef PERL_OLD_COPY_ON_WRITE - /* Turning READONLY off for a copy-on-write scalar is a bad idea. */ + /* Turning READONLY off for a copy-on-write scalar (including shared + hash keys) is a bad idea. */ if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0); -#endif SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix)); @@ -100,7 +100,7 @@ S_save_magic(pTHX_ I32 mgs_ix, SV *sv) SvMAGICAL_off(sv); SvREADONLY_off(sv); - SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT; + SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; } /* @@ -139,6 +139,7 @@ Do magic after a value is retrieved from the SV. See C. int Perl_mg_get(pTHX_ SV *sv) { + dVAR; const I32 mgs_ix = SSNEW(sizeof(MGS)); const bool was_temp = (bool)SvTEMP(sv); int have_new = 0; @@ -219,6 +220,7 @@ Do magic after a value is assigned to the SV. See C. int Perl_mg_set(pTHX_ SV *sv) { + dVAR; const I32 mgs_ix = SSNEW(sizeof(MGS)); MAGIC* mg; MAGIC* nextmg; @@ -251,6 +253,7 @@ Report on the SV's length. See C. U32 Perl_mg_length(pTHX_ SV *sv) { + dVAR; MAGIC* mg; STRLEN len; @@ -351,7 +354,7 @@ Perl_mg_find(pTHX_ const SV *sv, int type) return mg; } } - return 0; + return NULL; } /* @@ -402,9 +405,10 @@ doesn't (eg taint, pos). void Perl_mg_localize(pTHX_ SV *sv, SV *nsv) { + dVAR; MAGIC *mg; for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { - const MGVTBL* const vtbl = mg->mg_virtual; + MGVTBL* const vtbl = mg->mg_virtual; switch (mg->mg_type) { /* value magic types: don't copy */ case PERL_MAGIC_bm: @@ -485,6 +489,7 @@ Perl_mg_free(pTHX_ SV *sv) U32 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(sv); if (PL_curpm) { @@ -502,6 +507,7 @@ Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg) { + dVAR; if (PL_curpm) { register const REGEXP * const rx = PM_GETRE(PL_curpm); if (rx) { @@ -544,6 +550,7 @@ Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg) U32 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg) { + dVAR; register I32 paren; register I32 i; register const REGEXP *rx; @@ -634,10 +641,14 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg) } #define SvRTRIM(sv) STMT_START { \ - STRLEN len = SvCUR(sv); \ - while (len > 0 && isSPACE(SvPVX(sv)[len-1])) \ - --len; \ - SvCUR_set(sv, len); \ + if (SvPOK(sv)) { \ + STRLEN len = SvCUR(sv); \ + char * const p = SvPVX(sv); \ + while (len > 0 && isSPACE(p[len-1])) \ + --len; \ + SvCUR_set(sv, len); \ + p[len] = '\0'; \ + } \ } STMT_END int @@ -669,15 +680,14 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) break; case '\005': /* ^E */ if (nextchar == '\0') { -#ifdef MACOS_TRADITIONAL +#if defined(MACOS_TRADITIONAL) { char msg[256]; sv_setnv(sv,(double)gMacPerl_OSErr); sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : ""); } -#else -#ifdef VMS +#elif defined(VMS) { # include # include @@ -689,8 +699,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) else sv_setpvn(sv,"",0); } -#else -#ifdef OS2 +#elif defined(OS2) if (!(_emx_env & 0x200)) { /* Under DOS */ sv_setnv(sv, (NV)errno); sv_setpv(sv, errno ? Strerror(errno) : ""); @@ -703,8 +712,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) sv_setnv(sv, (NV)Perl_rc); sv_setpv(sv, os2error(Perl_rc)); } -#else -#ifdef WIN32 +#elif defined(WIN32) { DWORD dwErr = GetLastError(); sv_setnv(sv, (NV)dwErr); @@ -723,9 +731,6 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) errno = saveerrno; } #endif -#endif -#endif -#endif SvRTRIM(sv); SvNOK_on(sv); /* what a wonderful hack! */ } @@ -808,7 +813,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) * it could have been extended by warnings::register */ SV **bits_all; HV * const bits=get_hv("warnings::Bits", FALSE); - if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) { + if (bits && (bits_all=hv_fetchs(bits, "all", FALSE))) { sv_setsv(sv, *bits_all); } else { @@ -838,8 +843,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) { i = t1 - s1; s = rx->subbeg + s1; - if (!rx->subbeg) - break; + assert(rx->subbeg); getrx: if (i >= 0) { @@ -994,29 +998,22 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) break; case '(': sv_setiv(sv, (IV)PL_gid); -#ifdef HAS_GETGROUPS - Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_gid); -#endif goto add_groups; case ')': sv_setiv(sv, (IV)PL_egid); -#ifdef HAS_GETGROUPS - Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, (long unsigned int)PL_egid); -#endif add_groups: #ifdef HAS_GETGROUPS { Groups_t *gary = NULL; - I32 num_groups = getgroups(0, gary); + I32 i, num_groups = getgroups(0, gary); Newx(gary, num_groups, Groups_t); num_groups = getgroups(num_groups, gary); - while (--num_groups >= 0) - Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, - (long unsigned int)gary[num_groups]); + for (i = 0; i < num_groups; i++) + Perl_sv_catpvf(aTHX_ sv, " %"IVdf, (IV)gary[i]); Safefree(gary); } -#endif (void)SvIOK_on(sv); /* what a wonderful hack! */ +#endif break; #ifndef MACOS_TRADITIONAL case '0': @@ -1078,7 +1075,7 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg) return 0; } } - if ((cp = strchr(elt, ':')) != Nullch) + if ((cp = strchr(elt, ':')) != NULL) *cp = '\0'; if (my_trnlnm(elt, eltbuf, j++)) elt = eltbuf; @@ -1117,13 +1114,14 @@ int Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg) { PERL_UNUSED_ARG(sv); - my_setenv(MgPV_nolen_const(mg),Nullch); + my_setenv(MgPV_nolen_const(mg),NULL); return 0; } int Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(mg); #if defined(VMS) Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system"); @@ -1168,6 +1166,7 @@ restore_sigmask(pTHX_ SV *save_sv) int Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg) { + dVAR; /* Are we fetching a signal entry? */ const I32 i = whichsig(MgPV_nolen_const(mg)); if (i > 0) { @@ -1247,7 +1246,7 @@ Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg) PL_psig_name[i]=0; } if(PL_psig_ptr[i]) { - SV *to_dec=PL_psig_ptr[i]; + SV * const to_dec=PL_psig_ptr[i]; PL_psig_ptr[i]=0; LEAVE; SvREFCNT_dec(to_dec); @@ -1262,6 +1261,7 @@ Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg) static void S_raise_signal(pTHX_ int sig) { + dVAR; /* Set a flag to say this signal is pending */ PL_psig_pend[sig]++; /* And one to say _a_ signal is pending */ @@ -1324,6 +1324,7 @@ Perl_csighandler_init(void) void Perl_despatch_signals(pTHX) { + dVAR; int sig; PL_sig_pending = 0; for (sig = 1; sig < SIG_SIZE; sig++) { @@ -1444,7 +1445,7 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) * tell whether HINT_STRICT_REFS is in force or not. */ if (!strchr(s,':') && !strchr(s,'\'')) - sv_insert(sv, 0, 0, "main::", 6); + Perl_sv_insert(aTHX_ sv, 0, 0, STR_WITH_LEN("main::")); if (i) (void)rsignal(i, PL_csighandlerp); else @@ -1463,6 +1464,7 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(mg); PL_sub_generation++; @@ -1472,6 +1474,7 @@ Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(sv); PERL_UNUSED_ARG(mg); /* HV_badAMAGIC_on(Sv_STASH(sv)); */ @@ -1515,6 +1518,7 @@ Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg) STATIC int S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 flags, int n, SV *val) { + dVAR; dSP; PUSHMARK(SP); @@ -1691,6 +1695,7 @@ Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg) int Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg) { + dVAR; GV * const gv = PL_DBline; const I32 i = SvTRUE(sv); SV ** const svp = av_fetch(GvAV(gv), @@ -1711,6 +1716,7 @@ Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg) { + dVAR; const AV * const obj = (AV*)mg->mg_obj; if (obj) { sv_setiv(sv, AvFILL(obj) + PL_curcop->cop_arybase); @@ -1723,6 +1729,7 @@ Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg) int Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg) { + dVAR; AV * const obj = (AV*)mg->mg_obj; if (obj) { av_fill(obj, SvIV(sv) - PL_curcop->cop_arybase); @@ -1737,6 +1744,7 @@ Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(sv); /* during global destruction, mg_obj may already have been freed */ if (PL_in_clean_all) @@ -1758,6 +1766,7 @@ Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg) { + dVAR; SV* const lsv = LvTARG(sv); if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) { @@ -1777,6 +1786,7 @@ Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg) { + dVAR; SV* const lsv = LvTARG(sv); SSize_t pos; STRLEN len; @@ -1827,20 +1837,6 @@ Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg) } int -Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg) -{ - PERL_UNUSED_ARG(mg); - if (SvFAKE(sv)) { /* FAKE globs can get coerced */ - SvFAKE_off(sv); - gv_efullname3(sv,((GV*)sv), "*"); - SvFAKE_on(sv); - } - else - gv_efullname3(sv,((GV*)sv), "*"); /* a gv value, be nice */ - return 0; -} - -int Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg) { GV* gv; @@ -1848,6 +1844,12 @@ Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg) if (!SvOK(sv)) return 0; + if (SvFLAGS(sv) & SVp_SCREAM + && (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVGV)) { + /* We're actually already a typeglob, so don't need the stuff below. + */ + return 0; + } gv = gv_fetchsv(sv, GV_ADD, SVt_PVGV); if (sv == (SV*)gv) return 0; @@ -1882,6 +1884,7 @@ Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg) { + dVAR; STRLEN len; const char *tmps = SvPV_const(sv, len); SV * const lsv = LvTARG(sv); @@ -1915,6 +1918,7 @@ Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(sv); TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1)); return 0; @@ -1923,6 +1927,7 @@ Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg) { + dVAR; PERL_UNUSED_ARG(sv); /* update taint status unless we're restoring at scope exit */ if (PL_localizing != 2) { @@ -1940,12 +1945,11 @@ Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg) SV * const lsv = LvTARG(sv); PERL_UNUSED_ARG(mg); - if (!lsv) { + if (lsv) + sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv))); + else SvOK_off(sv); - return 0; - } - sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv))); return 0; } @@ -1960,7 +1964,8 @@ Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg) { - SV *targ = Nullsv; + dVAR; + SV *targ = NULL; if (LvTARGLEN(sv)) { if (mg->mg_obj) { SV * const ahv = LvTARG(sv); @@ -1979,7 +1984,7 @@ Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg) LvTARG(sv) = SvREFCNT_inc(targ); LvTARGLEN(sv) = 0; SvREFCNT_dec(mg->mg_obj); - mg->mg_obj = Nullsv; + mg->mg_obj = NULL; mg->mg_flags &= ~MGf_REFCOUNTED; } } @@ -2005,8 +2010,9 @@ Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg) void Perl_vivify_defelem(pTHX_ SV *sv) { + dVAR; MAGIC *mg; - SV *value = Nullsv; + SV *value = NULL; if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem))) return; @@ -2021,7 +2027,7 @@ Perl_vivify_defelem(pTHX_ SV *sv) else { AV* const av = (AV*)LvTARG(sv); if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av)) - LvTARG(sv) = Nullsv; /* array can't be extended */ + LvTARG(sv) = NULL; /* array can't be extended */ else { SV** const svp = av_fetch(av, LvTARGOFF(sv), TRUE); if (!svp || (value = *svp) == &PL_sv_undef) @@ -2033,7 +2039,7 @@ Perl_vivify_defelem(pTHX_ SV *sv) LvTARG(sv) = value; LvTARGLEN(sv) = 0; SvREFCNT_dec(mg->mg_obj); - mg->mg_obj = Nullsv; + mg->mg_obj = NULL; mg->mg_flags &= ~MGf_REFCOUNTED; } @@ -2090,6 +2096,7 @@ Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg) { + dVAR; regexp * const re = (regexp *)mg->mg_obj; PERL_UNUSED_ARG(sv); @@ -2129,6 +2136,7 @@ Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg) int Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) { + dVAR; register const char *s; I32 i; STRLEN len; @@ -2177,7 +2185,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) PL_encoding = newSVsv(sv); } else { - PL_encoding = Nullsv; + PL_encoding = NULL; } } break; @@ -2189,12 +2197,12 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) break; case '\011': /* ^I */ /* NOT \t in EBCDIC */ Safefree(PL_inplace); - PL_inplace = SvOK(sv) ? savesvpv(sv) : Nullch; + PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL; break; case '\017': /* ^O */ if (*(mg->mg_ptr+1) == '\0') { Safefree(PL_osname); - PL_osname = Nullch; + PL_osname = NULL; if (SvOK(sv)) { TAINT_PROPER("assigning to $^O"); PL_osname = savesvpv(sv); @@ -2319,7 +2327,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) PL_ors_sv = newSVsv(sv); } else { - PL_ors_sv = Nullsv; + PL_ors_sv = NULL; } break; case ',': @@ -2329,7 +2337,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) PL_ofs_sv = newSVsv(sv); } else { - PL_ofs_sv = Nullsv; + PL_ofs_sv = NULL; } break; case '[': @@ -2512,7 +2520,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) /* The BSDs don't show the argv[] in ps(1) output, they * show a string from the process struct and provide * the setproctitle() routine to manipulate that. */ - { + if (PL_origalen != 1) { s = SvPV_const(sv, len); # if __FreeBSD_version > 410001 /* The leading "-" removes the "perl: " prefix, @@ -2533,35 +2541,37 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) } #endif #if defined(__hpux) && defined(PSTAT_SETCMD) - { + if (PL_origalen != 1) { union pstun un; s = SvPV_const(sv, len); un.pst_command = (char *)s; pstat(PSTAT_SETCMD, un, len, 0, 0); } #endif - /* PL_origalen is set in perl_parse(). */ - s = SvPV_force(sv,len); - if (len >= (STRLEN)PL_origalen-1) { - /* Longer than original, will be truncated. We assume that - * PL_origalen bytes are available. */ - Copy(s, PL_origargv[0], PL_origalen-1, char); + if (PL_origalen > 1) { + /* PL_origalen is set in perl_parse(). */ + s = SvPV_force(sv,len); + if (len >= (STRLEN)PL_origalen-1) { + /* Longer than original, will be truncated. We assume that + * PL_origalen bytes are available. */ + Copy(s, PL_origargv[0], PL_origalen-1, char); + } + else { + /* Shorter than original, will be padded. */ + Copy(s, PL_origargv[0], len, char); + PL_origargv[0][len] = 0; + memset(PL_origargv[0] + len + 1, + /* Is the space counterintuitive? Yes. + * (You were expecting \0?) + * Does it work? Seems to. (In Linux 2.4.20 at least.) + * --jhi */ + (int)' ', + PL_origalen - len - 1); + } + PL_origargv[0][PL_origalen-1] = 0; + for (i = 1; i < PL_origargc; i++) + PL_origargv[i] = 0; } - else { - /* Shorter than original, will be padded. */ - Copy(s, PL_origargv[0], len, char); - PL_origargv[0][len] = 0; - memset(PL_origargv[0] + len + 1, - /* Is the space counterintuitive? Yes. - * (You were expecting \0?) - * Does it work? Seems to. (In Linux 2.4.20 at least.) - * --jhi */ - (int)' ', - PL_origalen - len - 1); - } - PL_origargv[0][PL_origalen-1] = 0; - for (i = 1; i < PL_origargc; i++) - PL_origargv[i] = 0; UNLOCK_DOLLARZERO_MUTEX; break; #endif @@ -2601,10 +2611,10 @@ Perl_sighandler(int sig) dTHX; #endif dSP; - GV *gv = Nullgv; - SV *sv = Nullsv; + GV *gv = NULL; + SV *sv = NULL; SV * const tSv = PL_Sv; - CV *cv = Nullcv; + CV *cv = NULL; OP *myop = PL_op; U32 flags = 0; XPV * const tXpv = PL_Xpv; @@ -2719,7 +2729,7 @@ Perl_sighandler(int sig) (void)rsignal(sig, PL_csighandlerp); #endif #endif /* !PERL_MICRO */ - Perl_die(aTHX_ Nullch); + Perl_die(aTHX_ NULL); } cleanup: if (flags & 1) @@ -2741,6 +2751,7 @@ cleanup: static void S_restore_magic(pTHX_ const void *p) { + dVAR; MGS* const mgs = SSPTR(PTR2IV(p), MGS*); SV* const sv = mgs->mgs_sv;