X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.c;h=302faf108897324c15ff773776e83f0fd5784a51;hb=02c473a9139e94d6158d1e3dd9a912f3525b3b21;hp=8bb1da72c55f15ff57850a8a65e4380850b5f315;hpb=c9e30dd8153632a4205f5780cc54d922f26feb15;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.c b/perl.c index 8bb1da7..302faf1 100644 --- a/perl.c +++ b/perl.c @@ -237,11 +237,15 @@ perl_construct(pTHXx) SvREFCNT(&PL_sv_undef) = (~(U32)0)/2; sv_setpv(&PL_sv_no,PL_No); + /* value lookup in void context - happens to have the side effect + of caching the numeric forms. */ + SvIV(&PL_sv_no); SvNV(&PL_sv_no); SvREADONLY_on(&PL_sv_no); SvREFCNT(&PL_sv_no) = (~(U32)0)/2; sv_setpv(&PL_sv_yes,PL_Yes); + SvIV(&PL_sv_yes); SvNV(&PL_sv_yes); SvREADONLY_on(&PL_sv_yes); SvREFCNT(&PL_sv_yes) = (~(U32)0)/2; @@ -312,8 +316,9 @@ perl_construct(pTHXx) #endif /* Use sysconf(_SC_CLK_TCK) if available, if not - * available or if the sysconf() fails, use the HZ. */ -#if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK) + * available or if the sysconf() fails, use the HZ. + * BeOS has those, but returns the wrong value. */ +#if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK) && !defined(__BEOS__) PL_clocktick = sysconf(_SC_CLK_TCK); if (PL_clocktick <= 0) #endif @@ -467,7 +472,7 @@ perl_destruct(pTHXx) */ #ifndef PERL_MICRO #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV) - if (environ != PL_origenviron + if (environ != PL_origenviron && !PL_use_safe_putenv #ifdef USE_ITHREADS /* only main thread can free environ[0] contents */ && PL_curinterp == aTHX @@ -837,9 +842,10 @@ perl_destruct(pTHXx) svend = &sva[SvREFCNT(sva)]; for (sv = sva + 1; sv < svend; ++sv) { if (SvTYPE(sv) != SVTYPEMASK) { - PerlIO_printf(Perl_debug_log, "leaked: 0x%p" - pTHX__FORMAT "\n", - sv pTHX__VALUE); + PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p" + " flags=0x08%"UVxf + " refcnt=%"UVuf pTHX__FORMAT "\n", + sv, sv->sv_flags, sv->sv_refcnt pTHX__VALUE); } } } @@ -2673,7 +2679,7 @@ Perl_moreswitches(pTHX_ char *s) av_push(PL_preambleav, sv); } else - Perl_croak(aTHX_ "No space allowed after -%c", *(s-1)); + Perl_croak(aTHX_ "Missing argument to -%c", *(s-1)); return s; case 'n': PL_minus_n = TRUE; @@ -3422,7 +3428,8 @@ S_validate_suid(pTHX_ char *validarg, char *scriptname) /* Sanity check on buffer end */ while ((*s) && !isSPACE(*s)) s++; for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 && - (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ; + (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_' + || s2[-1] == '-')); s2--) ; /* Sanity check on buffer start */ if ( (s2-4 < SvPV(PL_linestr,n_a)+2 || strnNE(s2-4,"perl",4)) && (s-9 < SvPV(PL_linestr,n_a)+2 || strnNE(s-9,"perl",4)) ) @@ -3709,7 +3716,8 @@ S_find_beginning(pTHX) s2 = s; while (*s == ' ' || *s == '\t') s++; if (*s++ == '-') { - while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--; + while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.' + || s2[-1] == '_') s2--; if (strnEQ(s2-4,"perl",4)) /*SUPPRESS 530*/ while ((s = moreswitches(s))) @@ -4044,6 +4052,22 @@ S_procself_val(pTHX_ SV *sv, char *arg0) #endif /* HAS_PROCSELFEXE */ STATIC void +S_set_caret_X(pTHX) { + GV* tmpgv = gv_fetchpv("\030",TRUE, SVt_PV); /* $^X */ + if (tmpgv) { +#ifdef HAS_PROCSELFEXE + S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]); +#else +#ifdef OS2 + sv_setpv(GvSV(tmpgv), os2_execname(aTHX)); +#else + sv_setpv(GvSV(tmpgv),PL_origargv[0]); +#endif +#endif + } +} + +STATIC void S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env) { char *s; @@ -4071,17 +4095,7 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register magicname("0", "0", 1); #endif } - if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */ -#ifdef HAS_PROCSELFEXE - S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]); -#else -#ifdef OS2 - sv_setpv(GvSV(tmpgv), os2_execname(aTHX)); -#else - sv_setpv(GvSV(tmpgv),PL_origargv[0]); -#endif -#endif - } + S_set_caret_X(aTHX); if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) { HV *hv; GvMULTI_on(PL_envgv); @@ -4279,6 +4293,21 @@ S_init_perllib(pTHX) # define PERLLIB_MANGLE(s,n) (s) #endif +/* Push a directory onto @INC if it exists. + Generate a new SV if we do this, to save needing to copy the SV we push + onto @INC */ +STATIC SV * +S_incpush_if_exists(pTHX_ SV *dir) +{ + Stat_t tmpstatbuf; + if (PerlLIO_stat(SvPVX(dir), &tmpstatbuf) >= 0 && + S_ISDIR(tmpstatbuf.st_mode)) { + av_push(GvAVn(PL_incgv), dir); + dir = NEWSV(0,0); + } + return dir; +} + STATIC void S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep) { @@ -4288,7 +4317,7 @@ S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep) return; if (addsubdirs || addoldvers) { - subdir = sv_newmortal(); + subdir = NEWSV(0,0); } /* Break at all separators */ @@ -4334,7 +4363,6 @@ S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep) const char *incverlist[] = { PERL_INC_VERSION_LIST }; const char **incver; #endif - Stat_t tmpstatbuf; #ifdef VMS char *unix; STRLEN len; @@ -4364,23 +4392,18 @@ S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep) libdir, (int)PERL_REVISION, (int)PERL_VERSION, (int)PERL_SUBVERSION, ARCHNAME); - if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 && - S_ISDIR(tmpstatbuf.st_mode)) - av_push(GvAVn(PL_incgv), newSVsv(subdir)); + subdir = S_incpush_if_exists(aTHX_ subdir); /* .../version if -d .../version */ Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir, (int)PERL_REVISION, (int)PERL_VERSION, (int)PERL_SUBVERSION); - if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 && - S_ISDIR(tmpstatbuf.st_mode)) - av_push(GvAVn(PL_incgv), newSVsv(subdir)); + subdir = S_incpush_if_exists(aTHX_ subdir); /* .../archname if -d .../archname */ Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME); - if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 && - S_ISDIR(tmpstatbuf.st_mode)) - av_push(GvAVn(PL_incgv), newSVsv(subdir)); + subdir = S_incpush_if_exists(aTHX_ subdir); + } #ifdef PERL_INC_VERSION_LIST @@ -4388,9 +4411,7 @@ S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep) for (incver = incverlist; *incver; incver++) { /* .../xxx if -d .../xxx */ Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver); - if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 && - S_ISDIR(tmpstatbuf.st_mode)) - av_push(GvAVn(PL_incgv), newSVsv(subdir)); + subdir = S_incpush_if_exists(aTHX_ subdir); } } #endif @@ -4399,6 +4420,10 @@ S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers, int usesep) /* finally push this lib directory on the end of @INC */ av_push(GvAVn(PL_incgv), libdir); } + if (subdir) { + assert (SvREFCNT(subdir) == 1); + SvREFCNT_dec(subdir); + } } #ifdef USE_5005THREADS