summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2015-06-11 11:11:19 +0100
committerDavid Mitchell <davem@iabyn.com>2015-06-19 08:44:18 +0100
commitd40dc6b141019491ca18144b6a25c03e8882ffe8 (patch)
tree5ce88a8cdfb4efd18d2c094dac50c99d387d283e
parenta375ceca5d834c83946967bb2d7972d7403acedb (diff)
downloadperl-d40dc6b141019491ca18144b6a25c03e8882ffe8.tar.gz
pp_return: optimise a couple of conditions
Change: if (cxix < 0) { A; return; } if (cxix < cxstack_ix) B; to if (cxix < cxstack_ix) { if (cxix < 0) { A; return; } B; } This is functionally the same, since cxstack_ix is always positive at this point, and makes for a quicker code path (one less test and branch) in the reasonably common case of a return from a sub which doesn't have any extra nested contexts to pop.
-rw-r--r--pp_ctl.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index e0caf6f283..57268935df 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2418,27 +2418,28 @@ PP(pp_return)
dSP; dMARK;
PERL_CONTEXT *cx;
SV **oldsp;
-
const I32 cxix = dopoptosub(cxstack_ix);
- if (cxix < 0) {
- if (CxMULTICALL(cxstack)) { /* In this case we must be in a
- * sort block, which is a CXt_NULL
- * not a CXt_SUB */
- dounwind(0);
- /* if we were in list context, we would have to splice out
- * any junk before the return args, like we do in the general
- * pp_return case, e.g.
- * sub f { for (junk1, junk2) { return arg1, arg2 }}
- */
- assert(cxstack[0].blk_gimme == G_SCALAR);
- return 0;
- }
- else
- DIE(aTHX_ "Can't return outside a subroutine");
- }
- if (cxix < cxstack_ix)
+ assert(cxstack_ix >= 0);
+ if (cxix < cxstack_ix) {
+ if (cxix < 0) {
+ if (CxMULTICALL(cxstack)) { /* In this case we must be in a
+ * sort block, which is a CXt_NULL
+ * not a CXt_SUB */
+ dounwind(0);
+ /* if we were in list context, we would have to splice out
+ * any junk before the return args, like we do in the general
+ * pp_return case, e.g.
+ * sub f { for (junk1, junk2) { return arg1, arg2 }}
+ */
+ assert(cxstack[0].blk_gimme == G_SCALAR);
+ return 0;
+ }
+ else
+ DIE(aTHX_ "Can't return outside a subroutine");
+ }
dounwind(cxix);
+ }
cx = &cxstack[cxix];