diff options
author | Ilya Zakharevich <ilya@math.berkeley.edu> | 1998-06-20 17:45:03 -0400 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-06-22 01:42:21 +0000 |
commit | f8d6b208e81d58521baa3465632e807863a9648b (patch) | |
tree | df8f6843ff7b401003b9005764037e304c51b815 /pp_hot.c | |
parent | 618e7a6c5e5b638e3bab39a56b2fe2323622f0c0 (diff) | |
download | perl-f8d6b208e81d58521baa3465632e807863a9648b.tar.gz |
Avoid temporaries on recursion
Message-Id: <199806210145.VAA21629@monk.mps.ohio-state.edu>
p4raw-id: //depot/perl@1187
Diffstat (limited to 'pp_hot.c')
-rw-r--r-- | pp_hot.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -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; } |