summaryrefslogtreecommitdiff
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
commita29cdaf07aa5601e42ae4955cc0f168e91a7c385 (patch)
treedf8f6843ff7b401003b9005764037e304c51b815
parenta2008d6d9087873a23da5012f181cb674dbf4ab1 (diff)
downloadperl-a29cdaf07aa5601e42ae4955cc0f168e91a7c385.tar.gz
Avoid temporaries on recursion
Message-Id: <199806210145.VAA21629@monk.mps.ohio-state.edu> p4raw-id: //depot/perl@1187
-rw-r--r--pp_ctl.c20
-rw-r--r--pp_hot.c16
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;
}