From d40dc6b141019491ca18144b6a25c03e8882ffe8 Mon Sep 17 00:00:00 2001 From: David Mitchell Date: Thu, 11 Jun 2015 11:11:19 +0100 Subject: [PATCH] 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. --- pp_ctl.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/pp_ctl.c b/pp_ctl.c index e0caf6f..5726893 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]; -- 1.8.3.1