X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/5f40764fc08e4d85d4c2d5616305dde658446619..390630257fd9ca7dc6c4928dbcab2a1ddcfaf2c3:/perl.c?ds=sidebyside diff --git a/perl.c b/perl.c index aac8181..3542162 100644 --- a/perl.c +++ b/perl.c @@ -258,50 +258,41 @@ perl_construct(pTHXx) if (PL_perl_destruct_level > 0) init_interp(); #endif - /* Init the real globals (and main thread)? */ - if (!PL_linestr) { - PL_curcop = &PL_compiling; /* needed by ckWARN, right away */ - - PL_linestr = newSV_type(SVt_PVIV); - SvGROW(PL_linestr, 80); - - if (!SvREADONLY(&PL_sv_undef)) { - /* set read-only and try to insure than we wont see REFCNT==0 - very often */ - - SvREADONLY_on(&PL_sv_undef); - 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; - - SvREADONLY_on(&PL_sv_placeholder); - SvREFCNT(&PL_sv_placeholder) = (~(U32)0)/2; - } + PL_curcop = &PL_compiling; /* needed by ckWARN, right away */ + + /* set read-only and try to insure than we wont see REFCNT==0 + very often */ + + SvREADONLY_on(&PL_sv_undef); + 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; - PL_sighandlerp = (Sighandler_t) Perl_sighandler; + 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; + + SvREADONLY_on(&PL_sv_placeholder); + SvREFCNT(&PL_sv_placeholder) = (~(U32)0)/2; + + PL_sighandlerp = (Sighandler_t) Perl_sighandler; #ifdef PERL_USES_PL_PIDSTATUS - PL_pidstatus = newHV(); + PL_pidstatus = newHV(); #endif - } PL_rs = newSVpvs("\n"); init_stacks(); init_ids(); - PL_lex_state = LEX_NOTPARSING; JMPENV_BOOTSTRAP; STATUS_ALL_SUCCESS; @@ -366,7 +357,7 @@ perl_construct(pTHXx) PL_stashcache = newHV(); - PL_patchlevel = Perl_newSVpvf(aTHX_ "%d.%d.%d", (int)PERL_REVISION, + PL_patchlevel = Perl_newSVpvf(aTHX_ "v%d.%d.%d", (int)PERL_REVISION, (int)PERL_VERSION, (int)PERL_SUBVERSION); #ifdef HAS_MMAP @@ -411,10 +402,6 @@ perl_construct(pTHXx) PL_timesbase.tms_cstime = 0; #endif -#ifdef PERL_MAD - PL_curforce = -1; -#endif - ENTER; } @@ -881,15 +868,12 @@ perl_destruct(pTHXx) /* loosen bonds of global variables */ - if(PL_rsfp) { - (void)PerlIO_close(PL_rsfp); - PL_rsfp = NULL; + /* XXX can PL_parser still be non-null here? */ + if(PL_parser && PL_parser->rsfp) { + (void)PerlIO_close(PL_parser->rsfp); + PL_parser->rsfp = NULL; } - /* Filters for program text */ - SvREFCNT_dec(PL_rsfp_filters); - PL_rsfp_filters = NULL; - if (PL_minus_F) { Safefree(PL_splitstr); PL_splitstr = NULL; @@ -987,7 +971,6 @@ perl_destruct(pTHXx) PL_DBsingle = NULL; PL_DBtrace = NULL; PL_DBsignal = NULL; - PL_DBassertion = NULL; PL_DBcv = NULL; PL_dbargs = NULL; PL_debstash = NULL; @@ -1001,8 +984,6 @@ perl_destruct(pTHXx) PL_preambleav = NULL; SvREFCNT_dec(PL_subname); PL_subname = NULL; - SvREFCNT_dec(PL_linestr); - PL_linestr = NULL; #ifdef PERL_USES_PL_PIDSTATUS SvREFCNT_dec(PL_pidstatus); PL_pidstatus = NULL; @@ -1088,6 +1069,8 @@ perl_destruct(pTHXx) SvREFCNT_dec(PL_errors); PL_errors = NULL; + SvREFCNT_dec(PL_isarev); + FREETMPS; if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) { if (PL_scopestack_ix != 0) @@ -1244,6 +1227,11 @@ perl_destruct(pTHXx) #endif PL_sv_count = 0; +#ifdef PERL_DEBUG_READONLY_OPS + free(PL_slabs); + PL_slabs = NULL; + PL_slab_count = 0; +#endif #if defined(PERLIO_LAYERS) /* No more IO - including error messages ! */ @@ -1662,6 +1650,7 @@ STATIC void * S_parse_body(pTHX_ char **env, XSINIT_t xsinit) { dVAR; + PerlIO *rsfp; int argc = PL_origargc; char **argv = PL_origargv; const char *scriptname = NULL; @@ -1673,8 +1662,12 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) #ifdef USE_SITECUSTOMIZE bool minus_f = FALSE; #endif + SV *linestr_sv = newSV_type(SVt_PVIV); + bool add_read_e_script = FALSE; + + SvGROW(linestr_sv, 80); + sv_setpvn(linestr_sv,"",0); - sv_setpvn(PL_linestr,"",0); sv = newSVpvs(""); /* first used for -I flags */ SAVEFREESV(sv); init_main_stash(); @@ -1722,7 +1715,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) case 'W': case 'X': case 'w': - case 'A': if ((s = moreswitches(s))) goto reswitch; break; @@ -1754,7 +1746,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) forbid_setid('e', -1); if (!PL_e_script) { PL_e_script = newSVpvs(""); - filter_add(read_e_script, NULL); + add_read_e_script = TRUE; } if (*++s) sv_catpv(PL_e_script, s); @@ -1839,6 +1831,9 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) # ifdef NO_MATHOMS " NO_MATHOMS" # endif +# ifdef PERL_DEBUG_READONLY_OPS + " PERL_DEBUG_READONLY_OPS" +# endif # ifdef PERL_DONT_CREATE_GVSV " PERL_DONT_CREATE_GVSV" # endif @@ -1857,6 +1852,21 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) # ifdef PERL_MALLOC_WRAP " PERL_MALLOC_WRAP" # endif +# ifdef PERL_MEM_LOG + " PERL_MEM_LOG" +# endif +# ifdef PERL_MEM_LOG_ENV + " PERL_MEM_LOG_ENV" +# endif +# ifdef PERL_MEM_LOG_ENV_FD + " PERL_MEM_LOG_ENV_FD" +# endif +# ifdef PERL_MEM_LOG_STDERR + " PERL_MEM_LOG_STDERR" +# endif +# ifdef PERL_MEM_LOG_TIMESTAMP + " PERL_MEM_LOG_TIMESTAMP" +# endif # ifdef PERL_NEED_APPCTX " PERL_NEED_APPCTX" # endif @@ -1866,15 +1876,18 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) # ifdef PERL_OLD_COPY_ON_WRITE " PERL_OLD_COPY_ON_WRITE" # endif +# ifdef PERL_POISON + " PERL_POISON" +# endif # ifdef PERL_TRACK_MEMPOOL " PERL_TRACK_MEMPOOL" # endif # ifdef PERL_USE_SAFE_PUTENV " PERL_USE_SAFE_PUTENV" # endif -#ifdef PERL_USES_PL_PIDSTATUS +# ifdef PERL_USES_PL_PIDSTATUS " PERL_USES_PL_PIDSTATUS" -#endif +# endif # ifdef PL_OP_SLAB_ALLOC " PL_OP_SLAB_ALLOC" # endif @@ -2095,9 +2108,10 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) { int suidscript; const int fdscript - = open_script(scriptname, dosearch, sv, &suidscript); + = open_script(scriptname, dosearch, sv, &suidscript, &rsfp); - validate_suid(validarg, scriptname, fdscript, suidscript); + validate_suid(validarg, scriptname, fdscript, suidscript, + linestr_sv, rsfp); #ifndef PERL_MICRO # if defined(SIGCHLD) || defined(SIGCLD) @@ -2127,7 +2141,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) forbid_setid('x', suidscript); /* Hence you can't get here if suidscript >= 0 */ - find_beginning(); + find_beginning(linestr_sv, rsfp); if (cddir && PerlDir_chdir( (char *)cddir ) < 0) Perl_croak(aTHX_ "Can't chdir to %s",cddir); } @@ -2138,9 +2152,12 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) CvPADLIST(PL_compcv) = pad_new(0); + PL_isarev = newHV(); + boot_core_PerlIO(); boot_core_UNIVERSAL(); boot_core_xsutils(); + boot_core_mro(); if (xsinit) (*xsinit)(aTHX); /* in case linked C routines want magical variables */ @@ -2239,14 +2256,17 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) } #endif - init_lexer(); + lex_start(linestr_sv, rsfp, TRUE); + PL_subname = newSVpvs("main"); + + if (add_read_e_script) + filter_add(read_e_script, NULL); /* now parse the script */ SETERRNO(0,SS_NORMAL); - PL_error_count = 0; #ifdef MACOS_TRADITIONAL - if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) { + if (gMacPerl_SyntaxError = (yyparse() || PL_parser->error_count)) { if (PL_minus_c) Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename)); else { @@ -2255,7 +2275,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) } } #else - if (yyparse() || PL_error_count) { + if (yyparse() || PL_parser->error_count) { if (PL_minus_c) Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename); else { @@ -2355,7 +2375,6 @@ perl_run(pTHXx) return ret; } - STATIC void S_run_body(pTHX_ I32 oldscope) { @@ -2392,6 +2411,9 @@ S_run_body(pTHX_ I32 oldscope) sv_setiv(PL_DBsingle, 1); if (PL_initav) call_list(oldscope, PL_initav); +#ifdef PERL_DEBUG_READONLY_OPS + Perl_pending_Slabs_to_ro(aTHX); +#endif } /* do it */ @@ -2884,7 +2906,6 @@ S_usage(pTHX_ const char *name) /* XXX move this out into a module ? */ static const char * const usage_msg[] = { "-0[octal] specify record separator (\\0, if no argument)", -"-A[mod][=pattern] activate all/given assertions", "-a autosplit mode with -n or -p (splits $_ into @F)", "-C[number/list] enables the listed Unicode features", "-c check syntax only (runs BEGIN and CHECK blocks)", @@ -3182,27 +3203,6 @@ Perl_moreswitches(pTHX_ char *s) } } return s; - case 'A': - forbid_setid('A', -1); - s++; - { - char * const start = s; - SV * const sv = newSVpvs("use assertions::activate"); - while(isALNUM(*s) || *s == ':') ++s; - if (s != start) { - sv_catpvs(sv, "::"); - sv_catpvn(sv, start, s-start); - } - if (*s == '=') { - Perl_sv_catpvf(aTHX_ sv, " split(/,/,q%c%s%c)", 0, ++s, 0); - s+=strlen(s); - } - else if (*s != '\0') { - Perl_croak(aTHX_ "Can't use '%c' after -A%.*s", *s, (int)(s-start), start); - } - Perl_av_create_and_push(aTHX_ &PL_preambleav, sv); - return s; - } case 'M': forbid_setid('M', -1); /* XXX ? */ /* FALL THROUGH */ @@ -3279,7 +3279,7 @@ Perl_moreswitches(pTHX_ char *s) return s; case 'v': if (!sv_derived_from(PL_patchlevel, "version")) - upg_version(PL_patchlevel); + upg_version(PL_patchlevel, TRUE); #if !defined(DGUX) PerlIO_printf(PerlIO_stdout(), Perl_form(aTHX_ "\nThis is perl, %"SVf @@ -3484,7 +3484,6 @@ S_init_interp(pTHX) # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init; # endif # include "intrpvar.h" -# include "thrdvar.h" # undef PERLVAR # undef PERLVARA # undef PERLVARI @@ -3495,7 +3494,6 @@ S_init_interp(pTHX) # define PERLVARI(var,type,init) PL_##var = init; # define PERLVARIC(var,type,init) PL_##var = init; # include "intrpvar.h" -# include "thrdvar.h" # undef PERLVAR # undef PERLVARA # undef PERLVARI @@ -3530,14 +3528,14 @@ S_init_main_stash(pTHX) SvREADONLY_on(gv); PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL, SVt_PVAV))); - SvREFCNT_inc_simple(PL_incgv); /* Don't allow it to be freed */ + SvREFCNT_inc_simple_void(PL_incgv); /* Don't allow it to be freed */ GvMULTI_on(PL_incgv); PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */ GvMULTI_on(PL_hintgv); PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV); - SvREFCNT_inc_simple(PL_defgv); + SvREFCNT_inc_simple_void(PL_defgv); PL_errgv = gv_HVadd(gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV)); - SvREFCNT_inc_simple(PL_errgv); + SvREFCNT_inc_simple_void(PL_errgv); GvMULTI_on(PL_errgv); PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */ GvMULTI_on(PL_replgv); @@ -3558,7 +3556,7 @@ S_init_main_stash(pTHX) STATIC int S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv, - int *suidscript) + int *suidscript, PerlIO **rsfpp) { #ifndef IAMSUID const char *quote; @@ -3616,11 +3614,11 @@ S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv, if (*PL_origfilename == '-' && PL_origfilename[1] == '\0') scriptname = (char *)""; if (fdscript >= 0) { - PL_rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE); + *rsfpp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE); # if defined(HAS_FCNTL) && defined(F_SETFD) - if (PL_rsfp) + if (*rsfpp) /* ensure close-on-exec */ - fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); + fcntl(PerlIO_fileno(*rsfpp),F_SETFD,1); # endif } #ifdef IAMSUID @@ -3702,24 +3700,64 @@ S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv, "PL_preprocess: cmd=\"%s\"\n", SvPVX_const(cmd))); - PL_rsfp = PerlProc_popen((char *)SvPVX_const(cmd), (char *)"r"); + *rsfpp = PerlProc_popen((char *)SvPVX_const(cmd), (char *)"r"); SvREFCNT_dec(cmd); SvREFCNT_dec(cpp); } else if (!*scriptname) { forbid_setid(0, *suidscript); - PL_rsfp = PerlIO_stdin(); + *rsfpp = PerlIO_stdin(); } else { - PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE); +#ifdef FAKE_BIT_BUCKET + /* This hack allows one not to have /dev/null (or BIT_BUCKET as it + * is called) and still have the "-e" work. (Believe it or not, + * a /dev/null is required for the "-e" to work because source + * filter magic is used to implement it. ) This is *not* a general + * replacement for a /dev/null. What we do here is create a temp + * file (an empty file), open up that as the script, and then + * immediately close and unlink it. Close enough for jazz. */ +#define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-" +#define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX" +#define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX + char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = { + FAKE_BIT_BUCKET_TEMPLATE + }; + const char * const err = "Failed to create a fake bit bucket"; + if (strEQ(scriptname, BIT_BUCKET)) { +#ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */ + int tmpfd = mkstemp(tmpname); + if (tmpfd > -1) { + scriptname = tmpname; + close(tmpfd); + } else + Perl_croak(aTHX_ err); +#else +# ifdef HAS_MKTEMP + scriptname = mktemp(tmpname); + if (!scriptname) + Perl_croak(aTHX_ err); +# endif +#endif + } +#endif + *rsfpp = PerlIO_open(scriptname,PERL_SCRIPT_MODE); +#ifdef FAKE_BIT_BUCKET + if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX, + sizeof(FAKE_BIT_BUCKET_PREFIX) - 1) + && strlen(scriptname) == sizeof(tmpname) - 1) { + unlink(scriptname); + } + scriptname = BIT_BUCKET; +#endif # if defined(HAS_FCNTL) && defined(F_SETFD) - if (PL_rsfp) + if (*rsfpp) /* ensure close-on-exec */ - fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1); + fcntl(PerlIO_fileno(*rsfpp),F_SETFD,1); # endif } #endif /* IAMSUID */ - if (!PL_rsfp) { + if (!*rsfpp) { /* PSz 16 Sep 03 Keep neat error message */ if (PL_e_script) Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno)); @@ -3866,7 +3904,7 @@ S_fd_on_nosuid_fs(pTHX_ int fd) STATIC void S_validate_suid(pTHX_ const char *validarg, const char *scriptname, - int fdscript, int suidscript) + int fdscript, int suidscript, SV *linestr_sv, PerlIO *rsfp) { dVAR; #ifdef IAMSUID @@ -3903,7 +3941,7 @@ S_validate_suid(pTHX_ const char *validarg, const char *scriptname, #ifdef DOSUID const char *s, *s2; - if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */ + if (PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf) < 0) /* normal stat is insecure */ Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename); if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) { I32 len; @@ -3992,7 +4030,7 @@ S_validate_suid(pTHX_ const char *validarg, const char *scriptname, * Seems safe enough to do as root. */ #if !defined(NO_NOSUID_CHECK) - if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp))) { + if (fd_on_nosuid_fs(PerlIO_fileno(rsfp))) { Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n"); } #endif @@ -4006,9 +4044,9 @@ S_validate_suid(pTHX_ const char *validarg, const char *scriptname, PL_doswitches = FALSE; /* -s is insecure in suid */ /* PSz 13 Nov 03 But -s was caught elsewhere ... so unsetting it here is useless(?!) */ CopLINE_inc(PL_curcop); - if (sv_gets(PL_linestr, PL_rsfp, 0) == NULL) + if (sv_gets(linestr_sv, rsfp, 0) == NULL) Perl_croak(aTHX_ "No #! line"); - linestr = SvPV_nolen_const(PL_linestr); + linestr = SvPV_nolen_const(linestr_sv); /* required even on Sys V */ if (!*linestr || !linestr[1] || strnNE(linestr,"#!",2)) Perl_croak(aTHX_ "No #! line"); @@ -4094,8 +4132,8 @@ FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n"); * in fact will use that to distinguish this from "normal" * usage, see comments above. */ - PerlIO_rewind(PL_rsfp); - PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */ + PerlIO_rewind(rsfp); + PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */ /* PSz 27 Feb 04 Sanity checks on scriptname */ if ((!scriptname) || (!*scriptname) ) { Perl_croak(aTHX_ "No setuid script name\n"); @@ -4112,9 +4150,9 @@ FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n"); Perl_croak(aTHX_ "Can't change argv to have fd script\n"); } PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s", - PerlIO_fileno(PL_rsfp), PL_origargv[which])); + PerlIO_fileno(rsfp), PL_origargv[which])); #if defined(HAS_FCNTL) && defined(F_SETFD) - fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */ + fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */ #endif PERL_FPU_PRE_EXEC PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP, @@ -4231,8 +4269,8 @@ FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n"); * #endif * into the perly bits. */ - PerlIO_rewind(PL_rsfp); - PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */ + PerlIO_rewind(rsfp); + PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */ /* PSz 11 Nov 03 * Keep original arguments: suidperl already has fd script. */ @@ -4242,9 +4280,9 @@ FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n"); /* Perl_croak(aTHX_ "Permission denied\n"); */ /* } */ /* PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s", */ -/* PerlIO_fileno(PL_rsfp), PL_origargv[which])); */ +/* PerlIO_fileno(rsfp), PL_origargv[which])); */ #if defined(HAS_FCNTL) && defined(F_SETFD) - fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */ + fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */ #endif PERL_FPU_PRE_EXEC PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP, @@ -4258,7 +4296,7 @@ FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n"); PERL_UNUSED_ARG(suidscript); if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */ #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW - PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf); /* may be either wrapped or real suid */ + PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf); /* may be either wrapped or real suid */ if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID) || (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID) @@ -4272,10 +4310,11 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n"); #endif /* DOSUID */ PERL_UNUSED_ARG(validarg); PERL_UNUSED_ARG(scriptname); + PERL_UNUSED_ARG(linestr_sv); } STATIC void -S_find_beginning(pTHX) +S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp) { dVAR; register char *s; @@ -4290,7 +4329,7 @@ S_find_beginning(pTHX) /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */ while (PL_doextract || gMacPerl_AlwaysExtract) { - if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == NULL) { + if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL) { if (!gMacPerl_AlwaysExtract) Perl_croak(aTHX_ "No Perl script found in input\n"); @@ -4301,18 +4340,18 @@ S_find_beginning(pTHX) PL_doextract = FALSE; /* Pater peccavi, file does not have #! */ - PerlIO_rewind(PL_rsfp); + PerlIO_rewind(rsfp); break; } #else while (PL_doextract) { - if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == NULL) + if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL) Perl_croak(aTHX_ "No Perl script found in input\n"); #endif s2 = s; if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) { - PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */ + PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */ PL_doextract = FALSE; while (*s && !(isSPACE (*s) || *s == '#')) s++; s2 = s; @@ -4330,7 +4369,7 @@ S_find_beginning(pTHX) * by counting lines we already skipped over */ for (; maclines > 0 ; maclines--) - PerlIO_ungetc(PL_rsfp, '\n'); + PerlIO_ungetc(rsfp, '\n'); break; @@ -4477,8 +4516,6 @@ Perl_init_debugger(pTHX) sv_setiv(PL_DBtrace, 0); PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV))); sv_setiv(PL_DBsignal, 0); - PL_DBassertion = GvSV((gv_fetchpvs("DB::assertion", GV_ADDMULTI, SVt_PV))); - sv_setiv(PL_DBassertion, 0); PL_curstash = ostash; } @@ -4544,17 +4581,6 @@ S_nuke_stacks(pTHX) Safefree(PL_savestack); } -STATIC void -S_init_lexer(pTHX) -{ - dVAR; - PerlIO *tmpfp; - tmpfp = PL_rsfp; - PL_rsfp = NULL; - lex_start(PL_linestr); - PL_rsfp = tmpfp; - PL_subname = newSVpvs("main"); -} STATIC void S_init_predump_symbols(pTHX) @@ -4721,9 +4747,6 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register if (PL_minus_a) { (void) get_av("main::F", TRUE | GV_ADDMULTI); } - /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */ - (void) get_av("main::-", TRUE | GV_ADDMULTI); - (void) get_av("main::+", TRUE | GV_ADDMULTI); } STATIC void @@ -5152,8 +5175,6 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList) #endif atsv = ERRSV; (void)SvPV_const(atsv, len); - if (PL_madskills && PL_minus_c && paramList == PL_beginav) - break; /* not really trying to run, so just wing it */ if (len) { PL_curcop = &PL_compiling; CopLINE_set(PL_curcop, oldline); @@ -5184,8 +5205,6 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList) PL_curcop = &PL_compiling; CopLINE_set(PL_curcop, oldline); JMPENV_POP; - if (PL_madskills && PL_minus_c && paramList == PL_beginav) - return; /* not really trying to run, so just wing it */ if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) { if (paramList == PL_beginav) Perl_croak(aTHX_ "BEGIN failed--compilation aborted");