This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_iter(): jump directly to op after OP_AND
authorDavid Mitchell <davem@iabyn.com>
Sat, 15 Jul 2017 12:27:09 +0000 (13:27 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 27 Jul 2017 10:30:23 +0000 (11:30 +0100)
commit7c114860c0fa8ade5e00a4b609d2fbd11d5a494c
tree91a53593190a9b38199f52c7a876983288be5130
parent7e8d786b02d3ef1f946a5ac354c2780774902e15
pp_iter(): jump directly to op after OP_AND

AN OP_ITER's op_next field always points to an OP_AND node. Rather than
pushing &PL_sv_yes or &PL_sv_no and then passing control to the OP_AND,
make pp_iter() return the OP_AND's op_next or op_other directly, depending
on whether this is the last iteration or not.

For an empty body, this cuts about 20% off the time of an iteration.

It's possible that some weird optree-munging XS module may break this
assumption. For now I've just added asserts that the next op is OP_AND
with an op_ppaddr of Perl_pp_and; if that assertion fails, it may be
necessary to convert pp_iter()s' asserts into conditional statements.

In the longer term it might be worthwhile converting OP_ITER from a
BASEOP into a LOGOP and eliminate the OP_AND from the optree altogether.

Alternatively, perhaps pp_iter could just tail call Perl_op_leavesub
directly after the last iteration?
pp_hot.c