diff options
author | David Mitchell <davem@iabyn.com> | 2015-06-11 11:11:19 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2015-06-19 08:44:18 +0100 |
commit | d40dc6b141019491ca18144b6a25c03e8882ffe8 (patch) | |
tree | 5ce88a8cdfb4efd18d2c094dac50c99d387d283e | |
parent | a375ceca5d834c83946967bb2d7972d7403acedb (diff) | |
download | perl-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.c | 37 |
1 files changed, 19 insertions, 18 deletions
@@ -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]; |