From a29cdaf07aa5601e42ae4955cc0f168e91a7c385 Mon Sep 17 00:00:00 2001 From: Ilya Zakharevich Date: Sat, 20 Jun 1998 17:45:03 -0400 Subject: Avoid temporaries on recursion Message-Id: <199806210145.VAA21629@monk.mps.ohio-state.edu> p4raw-id: //depot/perl@1187 --- pp_ctl.c | 20 ++++++++++++++++---- pp_hot.c | 16 +++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/pp_ctl.c b/pp_ctl.c index 444036ea7e..1209f7cf79 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -1486,10 +1486,22 @@ PP(pp_return) TAINT_NOT; if (gimme == G_SCALAR) { - if (MARK < SP) - *++newsp = (popsub2 && SvTEMP(*SP)) - ? *SP : sv_mortalcopy(*SP); - else + if (MARK < SP) { + if (popsub2) { + if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) { + if (SvTEMP(TOPs)) { + *++newsp = SvREFCNT_inc(*SP); + FREETMPS; + sv_2mortal(*newsp); + } else { + FREETMPS; + *++newsp = sv_mortalcopy(*SP); + } + } else + *++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP); + } else + *++newsp = sv_mortalcopy(*SP); + } else *++newsp = &sv_undef; } else if (gimme == G_ARRAY) { diff --git a/pp_hot.c b/pp_hot.c index 0133085722..dd5ef14e8a 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -1778,9 +1778,19 @@ PP(pp_leavesub) TAINT_NOT; if (gimme == G_SCALAR) { MARK = newsp + 1; - if (MARK <= SP) - *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs); - else { + if (MARK <= SP) { + if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) { + if (SvTEMP(TOPs)) { + *MARK = SvREFCNT_inc(TOPs); + FREETMPS; + sv_2mortal(*MARK); + } else { + FREETMPS; + *MARK = sv_mortalcopy(TOPs); + } + } else + *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs); + } else { MEXTEND(MARK, 0); *MARK = &sv_undef; } -- cgit v1.2.1