X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/82fce3d0db4e7411638fbe6cc1575a02021a5726..274ed8ae511aa4c52d0c3e975eb44853d4f5336f:/sv.c diff --git a/sv.c b/sv.c index 1a917eb..7f33794 100644 --- a/sv.c +++ b/sv.c @@ -13984,8 +13984,10 @@ Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param) case CXt_EVAL: ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv, param); + /* XXX should this sv_dup_inc? Or only if SvSCREAM ???? */ ncx->blk_eval.cur_text = sv_dup(ncx->blk_eval.cur_text, param); ncx->blk_eval.cv = cv_dup(ncx->blk_eval.cv, param); + /* XXX what do do with cur_top_env ???? */ break; case CXt_LOOP_LAZYSV: ncx->blk_loop.state_u.lazysv.end @@ -14007,6 +14009,8 @@ Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param) case CXt_LOOP_LAZYIV: case CXt_LOOP_PLAIN: /* code common to all CXt_LOOP_* types */ + ncx->blk_loop.itersave = + sv_dup_inc(ncx->blk_loop.itersave, param); if (CxPADLOOP(ncx)) { PADOFFSET off = ncx->blk_loop.itervar_u.svp - &CX_CURPAD_SV(ncx->blk_loop, 0); @@ -14015,24 +14019,32 @@ Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param) ncx->blk_loop.oldcomppad); ncx->blk_loop.itervar_u.svp = &CX_CURPAD_SV(ncx->blk_loop, off); - } else { + /* this copies the GV if CXp_FOR_GV, or the SV for an + * alias (for \$x (...)) - relies on gv_dup being the + * same as sv_dup */ ncx->blk_loop.itervar_u.gv = gv_dup((const GV *)ncx->blk_loop.itervar_u.gv, param); } break; case CXt_FORMAT: - ncx->blk_format.cv = cv_dup(ncx->blk_format.cv, param); + ncx->blk_format.prevcomppad = + (PAD*)ptr_table_fetch(PL_ptr_table, + ncx->blk_format.prevcomppad); + ncx->blk_format.cv = cv_dup_inc(ncx->blk_format.cv, param); ncx->blk_format.gv = gv_dup(ncx->blk_format.gv, param); ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv, param); break; + case CXt_GIVEN: + ncx->blk_givwhen.defsv_save = + sv_dup_inc(ncx->blk_givwhen.defsv_save, param); + break; case CXt_BLOCK: case CXt_NULL: case CXt_WHEN: - case CXt_GIVEN: break; } }