X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.c;h=ada96a23aff1123fd50083ba781321bdce46edeb;hb=d822fdf9523774354b4abafec1aa0c8639788575;hp=0ad1e00f57eeb2b8969368143e9645c7b9efaff3;hpb=e49e380eaec0ac30de05f118388e614b3b7bbed9;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.c b/perl.c index 0ad1e00..ada96a2 100644 --- a/perl.c +++ b/perl.c @@ -137,6 +137,22 @@ static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen); #endif #endif +#define CALL_BODY_EVAL(myop) \ + if (PL_op == (myop)) \ + PL_op = Perl_pp_entereval(aTHX); \ + if (PL_op) \ + CALLRUNOPS(aTHX); + +#define CALL_BODY_SUB(myop) \ + if (PL_op == (myop)) \ + PL_op = Perl_pp_entersub(aTHX); \ + if (PL_op) \ + CALLRUNOPS(aTHX); + +#define CALL_LIST_BODY(cv) \ + PUSHMARK(PL_stack_sp); \ + call_sv((SV*)(cv), G_EVAL|G_DISCARD); + static void S_init_tls_and_interp(PerlInterpreter *my_perl) { @@ -148,6 +164,7 @@ S_init_tls_and_interp(PerlInterpreter *my_perl) ALLOC_THREAD_KEY; PERL_SET_THX(my_perl); OP_REFCNT_INIT; + HINTS_REFCNT_INIT; MUTEX_INIT(&PL_dollarzero_mutex); # endif #ifdef PERL_IMPLICIT_CONTEXT @@ -228,7 +245,7 @@ void perl_construct(pTHXx) { dVAR; - PERL_UNUSED_CONTEXT; + PERL_UNUSED_ARG(my_perl); #ifdef MULTIPLICITY init_interp(); PL_perl_destruct_level = 1; @@ -360,7 +377,7 @@ perl_construct(pTHXx) if ((long) PL_mmap_page_size < 0) { if (errno) { SV * const error = ERRSV; - (void) SvUPGRADE(error, SVt_PV); + SvUPGRADE(error, SVt_PV); Perl_croak(aTHX_ "panic: sysconf: %s", SvPV_nolen_const(error)); } else @@ -389,6 +406,10 @@ perl_construct(pTHXx) PL_timesbase.tms_cstime = 0; #endif +#ifdef PERL_MAD + PL_curforce = -1; +#endif + ENTER; } @@ -524,7 +545,7 @@ perl_destruct(pTHXx) pid_t child; #endif - PERL_UNUSED_CONTEXT; + PERL_UNUSED_ARG(my_perl); /* wait for all pseudo-forked children to finish */ PERL_WAIT_FOR_CHILDREN; @@ -895,7 +916,6 @@ perl_destruct(pTHXx) SvREFCNT_dec(PL_rs); /* $/ */ PL_rs = NULL; - PL_multiline = 0; /* $* */ Safefree(PL_osname); /* $^O */ PL_osname = NULL; @@ -1031,11 +1051,10 @@ perl_destruct(pTHXx) PL_utf8_idcont = NULL; if (!specialWARN(PL_compiling.cop_warnings)) - SvREFCNT_dec(PL_compiling.cop_warnings); + PerlMemShared_free(PL_compiling.cop_warnings); PL_compiling.cop_warnings = NULL; - if (!specialCopIO(PL_compiling.cop_io)) - SvREFCNT_dec(PL_compiling.cop_io); - PL_compiling.cop_io = NULL; + Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash); + PL_compiling.cop_hints_hash = NULL; CopFILE_free(&PL_compiling); CopSTASH_free(&PL_compiling); @@ -1252,6 +1271,12 @@ perl_destruct(pTHXx) sv_free_arenas(); + while (PL_regmatch_slab) { + regmatch_slab *s = PL_regmatch_slab; + PL_regmatch_slab = PL_regmatch_slab->next; + Safefree(s); + } + /* As the absolutely last thing, free the non-arena SV for mess() */ if (PL_mess_sv) { @@ -1333,6 +1358,8 @@ perl_free(pTHXx) #if defined(__hpux) && !(defined(__ux_version) && __ux_version <= 1020) && !defined(__GNUC__) #pragma fini "perl_fini" +#elif defined(__sun) && !defined(__GNUC__) +#pragma fini (perl_fini) #endif static void @@ -1427,7 +1454,7 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env) int ret; dJMPENV; - PERL_UNUSED_VAR(my_perl); + PERL_UNUSED_ARG(my_perl); #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW #ifdef IAMSUID @@ -2023,7 +2050,8 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) #endif if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) { - PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize); + PL_compiling.cop_warnings + = Perl_new_warnings_bitfield(aTHX_ NULL, WARN_TAINTstring, WARNsize); } if (!scriptname) @@ -2176,6 +2204,25 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s); } +#ifdef PERL_MAD + if ((s = PerlEnv_getenv("PERL_XMLDUMP"))) { + PL_madskills = 1; + PL_minus_c = 1; + if (!s || !s[0]) + PL_xmlfp = PerlIO_stdout(); + else { + PL_xmlfp = PerlIO_open(s, "w"); + if (!PL_xmlfp) + Perl_croak(aTHX_ "Can't open %s", s); + } + my_setenv("PERL_XMLDUMP", Nullch); /* hide from subprocs */ + } + if ((s = PerlEnv_getenv("PERL_MADSKILLS"))) { + PL_madskills = atoi(s); + my_setenv("PERL_MADSKILLS", Nullch); /* hide from subprocs */ + } +#endif + init_lexer(); /* now parse the script */ @@ -2247,7 +2294,7 @@ perl_run(pTHXx) int ret = 0; dJMPENV; - PERL_UNUSED_CONTEXT; + PERL_UNUSED_ARG(my_perl); oldscope = PL_scopestack_ix; #ifdef VMS @@ -2301,6 +2348,12 @@ S_run_body(pTHX_ I32 oldscope) PL_sawampersand ? "Enabling" : "Omitting")); if (!PL_restartop) { +#ifdef PERL_MAD + if (PL_xmlfp) { + xmldump_all(); + exit(0); /* less likely to core dump than my_exit(0) */ + } +#endif DEBUG_x(dump_all()); #ifdef DEBUGGING if (!DEBUG_q_TEST) @@ -2569,38 +2622,22 @@ Perl_call_sv(pTHX_ SV *sv, I32 flags) if (!(flags & G_EVAL)) { CATCH_SET(TRUE); - call_body((OP*)&myop, FALSE); + CALL_BODY_SUB((OP*)&myop); retval = PL_stack_sp - (PL_stack_base + oldmark); CATCH_SET(oldcatch); } else { myop.op_other = (OP*)&myop; PL_markstack_ptr--; - /* we're trying to emulate pp_entertry() here */ - { - register PERL_CONTEXT *cx; - const I32 gimme = GIMME_V; - - ENTER; - SAVETMPS; - - PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp); - PUSHEVAL(cx, 0, 0); - PL_eval_root = PL_op; /* Only needed so that goto works right. */ - - PL_in_eval = EVAL_INEVAL; - if (flags & G_KEEPERR) - PL_in_eval |= EVAL_KEEPERR; - else - sv_setpvn(ERRSV,"",0); - } + create_eval_scope(flags|G_FAKINGEVAL); PL_markstack_ptr++; JMPENV_PUSH(ret); + switch (ret) { case 0: redo_body: - call_body((OP*)&myop, FALSE); + CALL_BODY_SUB((OP*)&myop); retval = PL_stack_sp - (PL_stack_base + oldmark); if (!(flags & G_KEEPERR)) sv_setpvn(ERRSV,"",0); @@ -2633,21 +2670,8 @@ Perl_call_sv(pTHX_ SV *sv, I32 flags) break; } - if (PL_scopestack_ix > oldscope) { - SV **newsp; - PMOP *newpm; - I32 gimme; - register PERL_CONTEXT *cx; - I32 optype; - - POPBLOCK(cx,newpm); - POPEVAL(cx); - PL_curpm = newpm; - LEAVE; - PERL_UNUSED_VAR(newsp); - PERL_UNUSED_VAR(gimme); - PERL_UNUSED_VAR(optype); - } + if (PL_scopestack_ix > oldscope) + delete_eval_scope(); JMPENV_POP; } @@ -2661,20 +2685,6 @@ Perl_call_sv(pTHX_ SV *sv, I32 flags) return retval; } -STATIC void -S_call_body(pTHX_ const OP *myop, bool is_eval) -{ - dVAR; - if (PL_op == myop) { - if (is_eval) - PL_op = Perl_pp_entereval(aTHX); /* this doesn't do a POPMARK */ - else - PL_op = Perl_pp_entersub(aTHX); /* this does */ - } - if (PL_op) - CALLRUNOPS(aTHX); -} - /* Eval a string. The G_EVAL flag is always assumed. */ /* @@ -2728,7 +2738,7 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags) switch (ret) { case 0: redo_body: - call_body((OP*)&myop,TRUE); + CALL_BODY_EVAL((OP*)&myop); retval = PL_stack_sp - (PL_stack_base + oldmark); if (!(flags & G_KEEPERR)) sv_setpvn(ERRSV,"",0); @@ -2923,7 +2933,7 @@ Perl_get_debug_opts(pTHX_ const char **s, bool givehelp) int i = 0; if (isALPHA(**s)) { /* if adding extra options, remember to update DEBUG_MASK */ - static const char debopts[] = "psltocPmfrxu HXDSTRJvCAq"; + static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAq"; for (; isALNUM(**s); (*s)++) { const char * const d = strchr(debopts,**s); @@ -3005,6 +3015,8 @@ Perl_moreswitches(pTHX_ char *s) case 'C': s++; PL_unicode = parse_unicode_opts( (const char **)&s ); + if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG) + PL_utf8cache = -1; return s; case 'F': PL_minus_F = TRUE; @@ -3079,13 +3091,17 @@ Perl_moreswitches(pTHX_ char *s) return s+1; } #endif /* __CYGWIN__ */ - PL_inplace = savepv(s+1); - for (s = PL_inplace; *s && !isSPACE(*s); s++) - ; + { + const char * const start = ++s; + while (*s && !isSPACE(*s)) + ++s; + + PL_inplace = savepvn(start, s - start); + } if (*s) { - *s++ = '\0'; + ++s; if (*s == '-') /* Additional switches on #! line. */ - s++; + s++; } return s; case 'I': /* -I handled both here and in parse_body() */ @@ -3246,8 +3262,8 @@ Perl_moreswitches(pTHX_ char *s) " DEVEL" STRINGIFY(PERL_PATCHNUM) #endif " built for %s", - vstringify(PL_patchlevel), - ARCHNAME)); + (void*)vstringify(PL_patchlevel), + ARCHNAME)); #else /* DGUX */ /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */ PerlIO_printf(PerlIO_stdout(), @@ -3266,7 +3282,7 @@ Perl_moreswitches(pTHX_ char *s) PerlIO_printf(PerlIO_stdout(), "\n(with %d registered patch%s, " "see perl -V for more detail)", - (int)LOCAL_PATCH_COUNT, + LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : ""); #endif @@ -3355,14 +3371,14 @@ Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n"); case 'W': PL_dowarn = G_WARN_ALL_ON|G_WARN_ON; if (!specialWARN(PL_compiling.cop_warnings)) - SvREFCNT_dec(PL_compiling.cop_warnings); + PerlMemShared_free(PL_compiling.cop_warnings); PL_compiling.cop_warnings = pWARN_ALL ; s++; return s; case 'X': PL_dowarn = G_WARN_ALL_OFF; if (!specialWARN(PL_compiling.cop_warnings)) - SvREFCNT_dec(PL_compiling.cop_warnings); + PerlMemShared_free(PL_compiling.cop_warnings); PL_compiling.cop_warnings = pWARN_NONE ; s++; return s; @@ -3460,6 +3476,10 @@ S_init_interp(pTHX) # undef PERLVARIC #endif + /* As these are inside a structure, PERLVARI isn't capable of initialising + them */ + PL_reg_oldcurpm = PL_reg_curpm = NULL; + PL_reg_poscache = PL_reg_starttry = NULL; } STATIC void @@ -3647,8 +3667,8 @@ S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv, Perl_sv_setpvf(aTHX_ cmd, "\ %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s", - perl, quote, code, quote, scriptname, cpp, - cpp_discard_flag, sv, CPPMINUS); + perl, quote, code, quote, scriptname, (void*)cpp, + cpp_discard_flag, (void*)sv, CPPMINUS); PL_doextract = FALSE; @@ -4778,7 +4798,8 @@ S_init_perllib(pTHX) # endif #endif -#ifdef SITELIB_STEM /* Search for version-specific dirs below here */ +#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST) + /* Search for version-specific dirs below here */ incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE); #endif @@ -5026,19 +5047,21 @@ S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep, #endif /* .../version/archname if -d .../version/archname */ Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT, - libdir, + (void*)libdir, (int)PERL_REVISION, (int)PERL_VERSION, (int)PERL_SUBVERSION, ARCHNAME); subdir = S_incpush_if_exists(aTHX_ subdir); /* .../version if -d .../version */ - Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir, + Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, + (void*)libdir, (int)PERL_REVISION, (int)PERL_VERSION, (int)PERL_SUBVERSION); subdir = S_incpush_if_exists(aTHX_ subdir); /* .../archname if -d .../archname */ - Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME); + Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, + (void*)libdir, ARCHNAME); subdir = S_incpush_if_exists(aTHX_ subdir); } @@ -5047,7 +5070,7 @@ S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep, if (addoldvers) { for (incver = incverlist; *incver; incver++) { /* .../xxx if -d .../xxx */ - Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver); + Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, (void *)libdir, *incver); subdir = S_incpush_if_exists(aTHX_ subdir); } } @@ -5091,14 +5114,25 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList) av_push(PL_checkav_save, (SV*)cv); } } else { - SAVEFREESV(cv); + if (!PL_madskills) + SAVEFREESV(cv); } JMPENV_PUSH(ret); switch (ret) { case 0: - call_list_body(cv); +#ifdef PERL_MAD + if (PL_madskills) + PL_madskills |= 16384; +#endif + CALL_LIST_BODY(cv); +#ifdef PERL_MAD + if (PL_madskills) + PL_madskills &= ~16384; +#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); @@ -5113,7 +5147,7 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList) while (PL_scopestack_ix > oldscope) LEAVE; JMPENV_POP; - Perl_croak(aTHX_ "%"SVf"", atsv); + Perl_croak(aTHX_ "%"SVf"", (void*)atsv); } break; case 1: @@ -5128,6 +5162,8 @@ 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"); @@ -5153,15 +5189,6 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList) } } -STATIC void * -S_call_list_body(pTHX_ CV *cv) -{ - dVAR; - PUSHMARK(PL_stack_sp); - call_sv((SV*)cv, G_EVAL|G_DISCARD); - return NULL; -} - void Perl_my_exit(pTHX_ U32 status) {