X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.c;h=d0d4e9ae172a51c997965a46c168b6a37e6caef0;hb=ae178db11db50e8d46c66980e186cfba029f0cb9;hp=d81187989f99106e45248953ae404dfc9c658189;hpb=2c2d71f566f0a758d1486480f45158c0e70ea496;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.c b/perl.c index d811879..d0d4e9a 100644 --- a/perl.c +++ b/perl.c @@ -14,6 +14,7 @@ #include "EXTERN.h" #define PERL_IN_PERL_C #include "perl.h" +#include "patchlevel.h" /* for local_patches */ /* XXX If this causes problems, set i_unistd=undef in the hint file. */ #ifdef I_UNISTD @@ -61,7 +62,8 @@ perl_alloc(void) { PerlInterpreter *my_perl; - New(53, my_perl, 1, PerlInterpreter); + /* New() needs interpreter, so call malloc() instead */ + my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter)); PERL_SET_INTERP(my_perl); return my_perl; } @@ -81,6 +83,14 @@ perl_construct(pTHXx) Zero(my_perl, 1, PerlInterpreter); #endif +#ifdef MULTIPLICITY + init_interp(); + PL_perl_destruct_level = 1; +#else + if (PL_perl_destruct_level > 0) + init_interp(); +#endif + /* Init the real globals (and main thread)? */ if (!PL_linestr) { #ifdef USE_THREADS @@ -158,13 +168,6 @@ perl_construct(pTHXx) PL_rs = SvREFCNT_inc(PL_nrs); init_stacks(); -#ifdef MULTIPLICITY - init_interp(); - PL_perl_destruct_level = 1; -#else - if (PL_perl_destruct_level > 0) - init_interp(); -#endif init_ids(); PL_lex_state = LEX_NOTPARSING; @@ -325,8 +328,6 @@ perl_destruct(pTHXx) PL_warnhook = Nullsv; SvREFCNT_dec(PL_diehook); PL_diehook = Nullsv; - SvREFCNT_dec(PL_parsehook); - PL_parsehook = Nullsv; /* call exit list functions */ while (PL_exitlistlen-- > 0) @@ -406,6 +407,11 @@ perl_destruct(pTHXx) Safefree(PL_screamnext); PL_screamnext = 0; + /* float buffer */ + Safefree(PL_efloatbuf); + PL_efloatbuf = Nullch; + PL_efloatsize = 0; + /* startup and shutdown function lists */ SvREFCNT_dec(PL_beginav); SvREFCNT_dec(PL_endav); @@ -435,6 +441,10 @@ perl_destruct(pTHXx) PL_defstash = 0; SvREFCNT_dec(hv); + /* clear queued errors */ + SvREFCNT_dec(PL_errors); + PL_errors = Nullsv; + FREETMPS; if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) { if (PL_scopestack_ix != 0) @@ -558,9 +568,9 @@ void perl_free(pTHXx) { #if defined(PERL_OBJECT) - Safefree(this); + PerlMem_free(this); #else - Safefree(aTHXx); + PerlMem_free(aTHXx); #endif } @@ -924,6 +934,7 @@ print \" \\@INC:\\n @INC\\n\";"); CvPADLIST(PL_compcv) = comppadlist; boot_core_UNIVERSAL(); + boot_core_xsutils(); if (xsinit) (*xsinit)(aTHXo); /* in case linked C routines want magical variables */ @@ -1225,10 +1236,16 @@ Perl_call_sv(pTHX_ SV *sv, I32 flags) PL_op->op_private |= OPpENTERSUB_DB; if (!(flags & G_EVAL)) { - CATCH_SET(TRUE); + /* G_NOCATCH is a hack for perl_vdie using this path to call + a __DIE__ handler */ + if (!(flags & G_NOCATCH)) { + CATCH_SET(TRUE); + } call_xbody((OP*)&myop, FALSE); retval = PL_stack_sp - (PL_stack_base + oldmark); - CATCH_SET(FALSE); + if (!(flags & G_NOCATCH)) { + CATCH_SET(FALSE); + } } else { cLOGOP->op_other = PL_op; @@ -1879,8 +1896,13 @@ S_init_interp(pTHX) # define PERLVAR(var,type) # define PERLVARA(var,n,type) # if defined(PERL_IMPLICIT_CONTEXT) -# define PERLVARI(var,type,init) my_perl->var = init; -# define PERLVARIC(var,type,init) my_perl->var = init; +# if defined(USE_THREADS) +# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init; +# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init; +# else /* !USE_THREADS */ +# define PERLVARI(var,type,init) aTHX->var = init; +# define PERLVARIC(var,type,init) aTHX->var = init; +# endif /* USE_THREADS */ # else # define PERLVARI(var,type,init) PERL_GET_INTERP->var = init; # define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init; @@ -2459,10 +2481,10 @@ S_find_beginning(pTHX) STATIC void S_init_ids(pTHX) { - PL_uid = (int)PerlProc_getuid(); - PL_euid = (int)PerlProc_geteuid(); - PL_gid = (int)PerlProc_getgid(); - PL_egid = (int)PerlProc_getegid(); + PL_uid = PerlProc_getuid(); + PL_euid = PerlProc_geteuid(); + PL_gid = PerlProc_getgid(); + PL_egid = PerlProc_getegid(); #ifdef VMS PL_uid |= PL_gid << 16; PL_euid |= PL_egid << 16;