summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorIlya Zakharevich <ilya@math.berkeley.edu>1998-06-20 17:45:03 -0400
committerGurusamy Sarathy <gsar@cpan.org>1998-06-22 01:42:21 +0000
commitf8d6b208e81d58521baa3465632e807863a9648b (patch)
treedf8f6843ff7b401003b9005764037e304c51b815 /pp_hot.c
parent618e7a6c5e5b638e3bab39a56b2fe2323622f0c0 (diff)
downloadperl-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.c16
1 files changed, 13 insertions, 3 deletions
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;
}