Extend void list optimisation to two lexicals blead
authorFather Chrysostomos <sprout@cpan.org>
Fri, 24 Oct 2014 21:33:26 +0000 (14:33 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 24 Oct 2014 21:33:26 +0000 (14:33 -0700)
The list+pushmark optimisation and the padrange optimisation conflict.
In void context, the former is avoided if it looks as though padrange
is possible (pushmark followed by lexical var), but now that padrange
happens only for two or more lexicals, we can check for that.  This
makes ‘my $a, our $b’ marginally faster.  (There are still cases where
this optimisation doesn’t happen though it could, but things would
get even more compilcated and we would only be optimising for rare
edge cases.)

op.c

index 6ac8f3f..a4d7bb0 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1893,6 +1893,11 @@ Perl_scalarvoid(pTHX_ OP *o)
            || (  kid->op_type != OP_PADSV
               && kid->op_type != OP_PADAV
               && kid->op_type != OP_PADHV)
+           || kid->op_private & ~OPpLVAL_INTRO
+           || !(kid = OP_SIBLING(kid))
+           || (  kid->op_type != OP_PADSV
+              && kid->op_type != OP_PADAV
+              && kid->op_type != OP_PADHV)
            || kid->op_private & ~OPpLVAL_INTRO)
        ) {
            op_null(cUNOPo->op_first); /* NULL the pushmark */