X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/3b21fb5de4ab74fae93a27637e67b3b330ee514d..8aef2117c820d82091fcbab49e8ae3bc5312b954:/pp_sort.c diff --git a/pp_sort.c b/pp_sort.c index ff76478..bfd7fa2 100644 --- a/pp_sort.c +++ b/pp_sort.c @@ -1642,8 +1642,8 @@ PP(pp_sort) PERL_CONTEXT *cx; SV** newsp; const bool oldcatch = CATCH_GET; + I32 old_savestack_ix = PL_savestack_ix; - SAVETMPS; SAVEOP(); CATCH_SET(TRUE); @@ -1688,12 +1688,18 @@ PP(pp_sort) cx->blk_sub.savearray = GvAV(PL_defgv); GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av)); - CX_CURPAD_SAVE(cx->blk_sub); - cx->blk_sub.argarray = av; } } } + else { + /* mimic PUSHSUB. Note that we're cheating and using a + * CXt_NULL block as a CXt_SUB block */ + cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; + PL_tmps_floor = PL_tmps_ix; + } + cx->cx_u.cx_blk.blku_old_savestack_ix = old_savestack_ix; + cx->cx_type |= CXp_MULTICALL; start = p1 - max; @@ -1709,6 +1715,10 @@ PP(pp_sort) POPSUB(cx, sv); LEAVESUB(sv); } + else + /* mimic POPSUB */ + PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor; + POPBLOCK(cx,PL_curpm); PL_stack_sp = newsp; POPSTACK;