From 692fcd37585c5b7f1e0e1a30148e0451f2f963eb Mon Sep 17 00:00:00 2001 From: David Mitchell Date: Mon, 6 Jun 2011 16:01:12 +0100 Subject: [PATCH] perl_clone_using: do simple assign/copying first For all the elements of the interpreter that can be cloned by a simple initialisation (e.g. assign NULL/0/-1), or by a direct copy from proto, do these first. This means that anything more complex, that might for example require a malloc, gets done after as much of the interpreter structure has already been initialised as possible. This is the beginnings of a fix for [perl #90006]. This commit should have no change in functionality; it's simply moving a bunch of assign statements to earlier within perl_clone_using(). --- sv.c | 458 ++++++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 244 insertions(+), 214 deletions(-) diff --git a/sv.c b/sv.c index bc0ef20..f0d7253 100644 --- a/sv.c +++ b/sv.c @@ -12875,6 +12875,250 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_hash_seed = proto_perl->Ihash_seed; PL_rehash_seed = proto_perl->Irehash_seed; + SvANY(&PL_sv_undef) = NULL; + SvREFCNT(&PL_sv_undef) = (~(U32)0)/2; + SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL; + SvREFCNT(&PL_sv_no) = (~(U32)0)/2; + SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK + |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV; + + SvANY(&PL_sv_yes) = new_XPVNV(); + SvREFCNT(&PL_sv_yes) = (~(U32)0)/2; + SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK + |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV; + + /* dbargs array probably holds garbage */ + PL_dbargs = NULL; + + PL_compiling = proto_perl->Icompiling; + +#ifdef PERL_DEBUG_READONLY_OPS + PL_slabs = NULL; + PL_slab_count = 0; +#endif + + /* pseudo environmental stuff */ + PL_origargc = proto_perl->Iorigargc; + PL_origargv = proto_perl->Iorigargv; + + /* Set tainting stuff before PerlIO_debug can possibly get called */ + PL_tainting = proto_perl->Itainting; + PL_taint_warn = proto_perl->Itaint_warn; + + PL_minus_c = proto_perl->Iminus_c; + + PL_localpatches = proto_perl->Ilocalpatches; + PL_splitstr = proto_perl->Isplitstr; + PL_minus_n = proto_perl->Iminus_n; + PL_minus_p = proto_perl->Iminus_p; + PL_minus_l = proto_perl->Iminus_l; + PL_minus_a = proto_perl->Iminus_a; + PL_minus_E = proto_perl->Iminus_E; + PL_minus_F = proto_perl->Iminus_F; + PL_doswitches = proto_perl->Idoswitches; + PL_dowarn = proto_perl->Idowarn; + PL_sawampersand = proto_perl->Isawampersand; + PL_unsafe = proto_perl->Iunsafe; + PL_perldb = proto_perl->Iperldb; + PL_perl_destruct_level = proto_perl->Iperl_destruct_level; + PL_exit_flags = proto_perl->Iexit_flags; + + /* XXX time(&PL_basetime) when asked for? */ + PL_basetime = proto_perl->Ibasetime; + + PL_maxsysfd = proto_perl->Imaxsysfd; + PL_statusvalue = proto_perl->Istatusvalue; +#ifdef VMS + PL_statusvalue_vms = proto_perl->Istatusvalue_vms; +#else + PL_statusvalue_posix = proto_perl->Istatusvalue_posix; +#endif + + /* RE engine related */ + Zero(&PL_reg_state, 1, struct re_save_state); + PL_reginterp_cnt = 0; + PL_regmatch_slab = NULL; + + PL_sub_generation = proto_perl->Isub_generation; + + /* funky return mechanisms */ + PL_forkprocess = proto_perl->Iforkprocess; + + /* internal state */ + PL_maxo = proto_perl->Imaxo; + + PL_main_start = proto_perl->Imain_start; + PL_eval_root = proto_perl->Ieval_root; + PL_eval_start = proto_perl->Ieval_start; + + PL_filemode = proto_perl->Ifilemode; + PL_lastfd = proto_perl->Ilastfd; + PL_oldname = proto_perl->Ioldname; /* XXX not quite right */ + PL_Argv = NULL; + PL_Cmd = NULL; + PL_gensym = proto_perl->Igensym; + + PL_laststatval = proto_perl->Ilaststatval; + PL_laststype = proto_perl->Ilaststype; + PL_mess_sv = NULL; + + PL_profiledata = NULL; + + PL_generation = proto_perl->Igeneration; + + PL_in_clean_objs = proto_perl->Iin_clean_objs; + PL_in_clean_all = proto_perl->Iin_clean_all; + + PL_uid = proto_perl->Iuid; + PL_euid = proto_perl->Ieuid; + PL_gid = proto_perl->Igid; + PL_egid = proto_perl->Iegid; + PL_nomemok = proto_perl->Inomemok; + PL_an = proto_perl->Ian; + PL_evalseq = proto_perl->Ievalseq; + PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */ + PL_origalen = proto_perl->Iorigalen; + + PL_sighandlerp = proto_perl->Isighandlerp; + + PL_runops = proto_perl->Irunops; + + PL_subline = proto_perl->Isubline; + +#ifdef FCRYPT + PL_cryptseen = proto_perl->Icryptseen; +#endif + + PL_hints = proto_perl->Ihints; + + PL_amagic_generation = proto_perl->Iamagic_generation; + +#ifdef USE_LOCALE_COLLATE + PL_collation_ix = proto_perl->Icollation_ix; + PL_collation_standard = proto_perl->Icollation_standard; + PL_collxfrm_base = proto_perl->Icollxfrm_base; + PL_collxfrm_mult = proto_perl->Icollxfrm_mult; +#endif /* USE_LOCALE_COLLATE */ + +#ifdef USE_LOCALE_NUMERIC + PL_numeric_standard = proto_perl->Inumeric_standard; + PL_numeric_local = proto_perl->Inumeric_local; +#endif /* !USE_LOCALE_NUMERIC */ + + /* Did the locale setup indicate UTF-8? */ + PL_utf8locale = proto_perl->Iutf8locale; + /* Unicode features (see perlrun/-C) */ + PL_unicode = proto_perl->Iunicode; + + /* Pre-5.8 signals control */ + PL_signals = proto_perl->Isignals; + + /* times() ticks per second */ + PL_clocktick = proto_perl->Iclocktick; + + /* Recursion stopper for PerlIO_find_layer */ + PL_in_load_module = proto_perl->Iin_load_module; + + /* sort() routine */ + PL_sort_RealCmp = proto_perl->Isort_RealCmp; + + /* Not really needed/useful since the reenrant_retint is "volatile", + * but do it for consistency's sake. */ + PL_reentrant_retint = proto_perl->Ireentrant_retint; + + /* Hooks to shared SVs and locks. */ + PL_sharehook = proto_perl->Isharehook; + PL_lockhook = proto_perl->Ilockhook; + PL_unlockhook = proto_perl->Iunlockhook; + PL_threadhook = proto_perl->Ithreadhook; + PL_destroyhook = proto_perl->Idestroyhook; + PL_signalhook = proto_perl->Isignalhook; + +#ifdef THREADS_HAVE_PIDS + PL_ppid = proto_perl->Ippid; +#endif + + /* swatch cache */ + PL_last_swash_hv = NULL; /* reinits on demand */ + PL_last_swash_klen = 0; + PL_last_swash_key[0]= '\0'; + PL_last_swash_tmps = (U8*)NULL; + PL_last_swash_slen = 0; + + PL_glob_index = proto_perl->Iglob_index; + PL_srand_called = proto_perl->Isrand_called; + + if (flags & CLONEf_COPY_STACKS) { + /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */ + PL_tmps_ix = proto_perl->Itmps_ix; + PL_tmps_max = proto_perl->Itmps_max; + PL_tmps_floor = proto_perl->Itmps_floor; + + /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix] + * NOTE: unlike the others! */ + PL_scopestack_ix = proto_perl->Iscopestack_ix; + PL_scopestack_max = proto_perl->Iscopestack_max; + + /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix] + * NOTE: unlike the others! */ + PL_savestack_ix = proto_perl->Isavestack_ix; + PL_savestack_max = proto_perl->Isavestack_max; + } + + PL_start_env = proto_perl->Istart_env; /* XXXXXX */ + PL_top_env = &PL_start_env; + + PL_op = proto_perl->Iop; + + PL_Sv = NULL; + PL_Xpv = (XPV*)NULL; + my_perl->Ina = proto_perl->Ina; + + PL_statbuf = proto_perl->Istatbuf; + PL_statcache = proto_perl->Istatcache; + +#ifdef HAS_TIMES + PL_timesbuf = proto_perl->Itimesbuf; +#endif + + PL_tainted = proto_perl->Itainted; + PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */ + + PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */ + + PL_restartjmpenv = proto_perl->Irestartjmpenv; + PL_restartop = proto_perl->Irestartop; + PL_in_eval = proto_perl->Iin_eval; + PL_delaymagic = proto_perl->Idelaymagic; + PL_phase = proto_perl->Iphase; + PL_localizing = proto_perl->Ilocalizing; + + PL_hv_fetch_ent_mh = NULL; + PL_modcount = proto_perl->Imodcount; + PL_lastgotoprobe = NULL; + PL_dumpindent = proto_perl->Idumpindent; + + PL_efloatbuf = NULL; /* reinits on demand */ + PL_efloatsize = 0; /* reinits on demand */ + + /* regex stuff */ + + PL_screamfirst = NULL; + PL_screamnext = NULL; + PL_maxscream = -1; /* reinits on demand */ + PL_lastscream = NULL; + + + PL_regdummy = proto_perl->Iregdummy; + PL_colorset = 0; /* reinits PL_colors[] */ + /*PL_colors[6] = {0,0,0,0,0,0};*/ + + /* Pluggable optimizer */ + PL_peepp = proto_perl->Ipeepp; + PL_rpeepp = proto_perl->Irpeepp; + /* op_free() hook */ + PL_opfreehook = proto_perl->Iopfreehook; + #ifdef USE_REENTRANT_API /* XXX: things like -Dm will segfault here in perlio, but doing * PERL_SET_CONTEXT(proto_perl); @@ -12887,15 +13131,9 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_ptr_table = ptr_table_new(); /* initialize these special pointers as early as possible */ - SvANY(&PL_sv_undef) = NULL; - SvREFCNT(&PL_sv_undef) = (~(U32)0)/2; - SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL; ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef); SvANY(&PL_sv_no) = new_XPVNV(); - SvREFCNT(&PL_sv_no) = (~(U32)0)/2; - SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK - |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV; SvPV_set(&PL_sv_no, savepvn(PL_No, 0)); SvCUR_set(&PL_sv_no, 0); SvLEN_set(&PL_sv_no, 1); @@ -12903,10 +13141,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, SvNV_set(&PL_sv_no, 0); ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no); - SvANY(&PL_sv_yes) = new_XPVNV(); - SvREFCNT(&PL_sv_yes) = (~(U32)0)/2; - SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK - |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV; SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1)); SvCUR_set(&PL_sv_yes, 1); SvLEN_set(&PL_sv_yes, 2); @@ -12914,17 +13148,12 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, SvNV_set(&PL_sv_yes, 1); ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes); - /* dbargs array probably holds garbage */ - PL_dbargs = NULL; - /* create (a non-shared!) shared string table */ PL_strtab = newHV(); HvSHAREKEYS_off(PL_strtab); hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab)); ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab); - PL_compiling = proto_perl->Icompiling; - /* These two PVs will be free'd special way so must set them same way op.c does */ PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv); ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv); @@ -12936,14 +13165,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings); CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling))); PL_curcop = (COP*)any_dup(proto_perl->Icurcop, proto_perl); -#ifdef PERL_DEBUG_READONLY_OPS - PL_slabs = NULL; - PL_slab_count = 0; -#endif - - /* pseudo environmental stuff */ - PL_origargc = proto_perl->Iorigargc; - PL_origargv = proto_perl->Iorigargv; param->stashes = newAV(); /* Setup array of objects to call clone on */ /* This makes no difference to the implementation, as it always pushes @@ -12958,10 +13179,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, param->unreferenced = newAV(); } - /* Set tainting stuff before PerlIO_debug can possibly get called */ - PL_tainting = proto_perl->Itainting; - PL_taint_warn = proto_perl->Itaint_warn; - #ifdef PERLIO_LAYERS /* Clone PerlIO tables as soon as we can handle general xx_dup() */ PerlIO_clone(aTHX_ proto_perl, param); @@ -12975,39 +13192,14 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param); /* switches */ - PL_minus_c = proto_perl->Iminus_c; PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param); PL_apiversion = sv_dup_inc(proto_perl->Iapiversion, param); - PL_localpatches = proto_perl->Ilocalpatches; - PL_splitstr = proto_perl->Isplitstr; - PL_minus_n = proto_perl->Iminus_n; - PL_minus_p = proto_perl->Iminus_p; - PL_minus_l = proto_perl->Iminus_l; - PL_minus_a = proto_perl->Iminus_a; - PL_minus_E = proto_perl->Iminus_E; - PL_minus_F = proto_perl->Iminus_F; - PL_doswitches = proto_perl->Idoswitches; - PL_dowarn = proto_perl->Idowarn; - PL_sawampersand = proto_perl->Isawampersand; - PL_unsafe = proto_perl->Iunsafe; PL_inplace = SAVEPV(proto_perl->Iinplace); PL_e_script = sv_dup_inc(proto_perl->Ie_script, param); - PL_perldb = proto_perl->Iperldb; - PL_perl_destruct_level = proto_perl->Iperl_destruct_level; - PL_exit_flags = proto_perl->Iexit_flags; /* magical thingies */ - /* XXX time(&PL_basetime) when asked for? */ - PL_basetime = proto_perl->Ibasetime; PL_formfeed = sv_dup(proto_perl->Iformfeed, param); - PL_maxsysfd = proto_perl->Imaxsysfd; - PL_statusvalue = proto_perl->Istatusvalue; -#ifdef VMS - PL_statusvalue_vms = proto_perl->Istatusvalue_vms; -#else - PL_statusvalue_posix = proto_perl->Istatusvalue_posix; -#endif PL_encoding = sv_dup(proto_perl->Iencoding, param); sv_setpvs(PERL_DEBUG_PAD(0), ""); /* For regex debugging. */ @@ -13015,11 +13207,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, sv_setpvs(PERL_DEBUG_PAD(2), ""); /* even without DEBUGGING. */ - /* RE engine related */ - Zero(&PL_reg_state, 1, struct re_save_state); - PL_reginterp_cnt = 0; - PL_regmatch_slab = NULL; - /* Clone the regex array */ /* ORANGE FIXME for plugins, probably in the SV dup code. newSViv(PTR2IV(CALLREGDUPE( @@ -13067,17 +13254,11 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_checkav = av_dup_inc(proto_perl->Icheckav, param); PL_initav = av_dup_inc(proto_perl->Iinitav, param); - PL_sub_generation = proto_perl->Isub_generation; PL_isarev = hv_dup_inc(proto_perl->Iisarev, param); - /* funky return mechanisms */ - PL_forkprocess = proto_perl->Iforkprocess; - /* subprocess state */ PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param); - /* internal state */ - PL_maxo = proto_perl->Imaxo; if (proto_perl->Iop_mask) PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo); else @@ -13089,23 +13270,11 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, OP_REFCNT_LOCK; PL_main_root = OpREFCNT_inc(proto_perl->Imain_root); OP_REFCNT_UNLOCK; - PL_main_start = proto_perl->Imain_start; - PL_eval_root = proto_perl->Ieval_root; - PL_eval_start = proto_perl->Ieval_start; /* runtime control stuff */ PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl); - PL_filemode = proto_perl->Ifilemode; - PL_lastfd = proto_perl->Ilastfd; - PL_oldname = proto_perl->Ioldname; /* XXX not quite right */ - PL_Argv = NULL; - PL_Cmd = NULL; - PL_gensym = proto_perl->Igensym; PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param); - PL_laststatval = proto_perl->Ilaststatval; - PL_laststype = proto_perl->Ilaststype; - PL_mess_sv = NULL; PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param); @@ -13138,8 +13307,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param); PL_custom_ops = hv_dup_inc(proto_perl->Icustom_ops, param); - PL_profiledata = NULL; - PL_compcv = cv_dup(proto_perl->Icompcv, param); PAD_CLONE_VARS(proto_perl, param); @@ -13148,30 +13315,12 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern); #endif - /* more statics moved here */ - PL_generation = proto_perl->Igeneration; PL_DBcv = cv_dup(proto_perl->IDBcv, param); - PL_in_clean_objs = proto_perl->Iin_clean_objs; - PL_in_clean_all = proto_perl->Iin_clean_all; - - PL_uid = proto_perl->Iuid; - PL_euid = proto_perl->Ieuid; - PL_gid = proto_perl->Igid; - PL_egid = proto_perl->Iegid; - PL_nomemok = proto_perl->Inomemok; - PL_an = proto_perl->Ian; - PL_evalseq = proto_perl->Ievalseq; - PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */ - PL_origalen = proto_perl->Iorigalen; #ifdef PERL_USES_PL_PIDSTATUS PL_pidstatus = newHV(); /* XXX flag for cloning? */ #endif PL_osname = SAVEPV(proto_perl->Iosname); - PL_sighandlerp = proto_perl->Isighandlerp; - - PL_runops = proto_perl->Irunops; - PL_parser = parser_dup(proto_perl->Iparser, param); /* XXX this only works if the saved cop has already been cloned */ @@ -13181,29 +13330,14 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, proto_perl); } - PL_subline = proto_perl->Isubline; PL_subname = sv_dup_inc(proto_perl->Isubname, param); -#ifdef FCRYPT - PL_cryptseen = proto_perl->Icryptseen; -#endif - - PL_hints = proto_perl->Ihints; - - PL_amagic_generation = proto_perl->Iamagic_generation; - #ifdef USE_LOCALE_COLLATE - PL_collation_ix = proto_perl->Icollation_ix; PL_collation_name = SAVEPV(proto_perl->Icollation_name); - PL_collation_standard = proto_perl->Icollation_standard; - PL_collxfrm_base = proto_perl->Icollxfrm_base; - PL_collxfrm_mult = proto_perl->Icollxfrm_mult; #endif /* USE_LOCALE_COLLATE */ #ifdef USE_LOCALE_NUMERIC PL_numeric_name = SAVEPV(proto_perl->Inumeric_name); - PL_numeric_standard = proto_perl->Inumeric_standard; - PL_numeric_local = proto_perl->Inumeric_local; PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param); #endif /* !USE_LOCALE_NUMERIC */ @@ -13241,48 +13375,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_utf8_xidcont = sv_dup_inc(proto_perl->Iutf8_xidcont, param); PL_utf8_foldable = hv_dup_inc(proto_perl->Iutf8_foldable, param); - /* Did the locale setup indicate UTF-8? */ - PL_utf8locale = proto_perl->Iutf8locale; - /* Unicode features (see perlrun/-C) */ - PL_unicode = proto_perl->Iunicode; - - /* Pre-5.8 signals control */ - PL_signals = proto_perl->Isignals; - - /* times() ticks per second */ - PL_clocktick = proto_perl->Iclocktick; - - /* Recursion stopper for PerlIO_find_layer */ - PL_in_load_module = proto_perl->Iin_load_module; - - /* sort() routine */ - PL_sort_RealCmp = proto_perl->Isort_RealCmp; - - /* Not really needed/useful since the reenrant_retint is "volatile", - * but do it for consistency's sake. */ - PL_reentrant_retint = proto_perl->Ireentrant_retint; - - /* Hooks to shared SVs and locks. */ - PL_sharehook = proto_perl->Isharehook; - PL_lockhook = proto_perl->Ilockhook; - PL_unlockhook = proto_perl->Iunlockhook; - PL_threadhook = proto_perl->Ithreadhook; - PL_destroyhook = proto_perl->Idestroyhook; - PL_signalhook = proto_perl->Isignalhook; - -#ifdef THREADS_HAVE_PIDS - PL_ppid = proto_perl->Ippid; -#endif - - /* swatch cache */ - PL_last_swash_hv = NULL; /* reinits on demand */ - PL_last_swash_klen = 0; - PL_last_swash_key[0]= '\0'; - PL_last_swash_tmps = (U8*)NULL; - PL_last_swash_slen = 0; - - PL_glob_index = proto_perl->Iglob_index; - PL_srand_called = proto_perl->Isrand_called; if (proto_perl->Ipsig_pend) { Newxz(PL_psig_pend, SIG_SIZE, int); @@ -13302,13 +13394,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_psig_name = (SV**)NULL; } - /* intrpvar.h stuff */ - if (flags & CLONEf_COPY_STACKS) { - /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */ - PL_tmps_ix = proto_perl->Itmps_ix; - PL_tmps_max = proto_perl->Itmps_max; - PL_tmps_floor = proto_perl->Itmps_floor; Newx(PL_tmps_stack, PL_tmps_max, SV*); sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack, PL_tmps_ix+1, param); @@ -13325,8 +13411,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix] * NOTE: unlike the others! */ - PL_scopestack_ix = proto_perl->Iscopestack_ix; - PL_scopestack_max = proto_perl->Iscopestack_max; Newxz(PL_scopestack, PL_scopestack_max, I32); Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32); @@ -13347,10 +13431,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, - proto_perl->Istack_base); PL_stack_max = PL_stack_base + AvMAX(PL_curstack); - /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix] - * NOTE: unlike the others! */ - PL_savestack_ix = proto_perl->Isavestack_ix; - PL_savestack_max = proto_perl->Isavestack_max; /*Newxz(PL_savestack, PL_savestack_max, ANY);*/ PL_savestack = ss_dup(proto_perl, param); } @@ -13359,72 +13439,22 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, ENTER; /* perl_destruct() wants to LEAVE; */ } - PL_start_env = proto_perl->Istart_env; /* XXXXXX */ - PL_top_env = &PL_start_env; - - PL_op = proto_perl->Iop; - - PL_Sv = NULL; - PL_Xpv = (XPV*)NULL; - my_perl->Ina = proto_perl->Ina; - - PL_statbuf = proto_perl->Istatbuf; - PL_statcache = proto_perl->Istatcache; PL_statgv = gv_dup(proto_perl->Istatgv, param); PL_statname = sv_dup_inc(proto_perl->Istatname, param); -#ifdef HAS_TIMES - PL_timesbuf = proto_perl->Itimesbuf; -#endif - PL_tainted = proto_perl->Itainted; - PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */ PL_rs = sv_dup_inc(proto_perl->Irs, param); PL_last_in_gv = gv_dup(proto_perl->Ilast_in_gv, param); PL_defoutgv = gv_dup_inc(proto_perl->Idefoutgv, param); - PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */ PL_toptarget = sv_dup_inc(proto_perl->Itoptarget, param); PL_bodytarget = sv_dup_inc(proto_perl->Ibodytarget, param); PL_formtarget = sv_dup(proto_perl->Iformtarget, param); - PL_restartjmpenv = proto_perl->Irestartjmpenv; - PL_restartop = proto_perl->Irestartop; - PL_in_eval = proto_perl->Iin_eval; - PL_delaymagic = proto_perl->Idelaymagic; - PL_phase = proto_perl->Iphase; - PL_localizing = proto_perl->Ilocalizing; - PL_errors = sv_dup_inc(proto_perl->Ierrors, param); - PL_hv_fetch_ent_mh = NULL; - PL_modcount = proto_perl->Imodcount; - PL_lastgotoprobe = NULL; - PL_dumpindent = proto_perl->Idumpindent; PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl); PL_sortstash = hv_dup(proto_perl->Isortstash, param); PL_firstgv = gv_dup(proto_perl->Ifirstgv, param); PL_secondgv = gv_dup(proto_perl->Isecondgv, param); - PL_efloatbuf = NULL; /* reinits on demand */ - PL_efloatsize = 0; /* reinits on demand */ - - /* regex stuff */ - - PL_screamfirst = NULL; - PL_screamnext = NULL; - PL_maxscream = -1; /* reinits on demand */ - PL_lastscream = NULL; - - - PL_regdummy = proto_perl->Iregdummy; - PL_colorset = 0; /* reinits PL_colors[] */ - /*PL_colors[6] = {0,0,0,0,0,0};*/ - - - - /* Pluggable optimizer */ - PL_peepp = proto_perl->Ipeepp; - PL_rpeepp = proto_perl->Irpeepp; - /* op_free() hook */ - PL_opfreehook = proto_perl->Iopfreehook; PL_stashcache = newHV(); -- 2.7.4