This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
OP_MULTIDEREF: remove ghost entry in op_aux list
authorDavid Mitchell <davem@iabyn.com>
Fri, 22 Jul 2016 12:12:17 +0000 (13:12 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Aug 2016 19:54:41 +0000 (20:54 +0100)
commit9527dbddfb3f22c37a3874479472219885daa8c1
treee35cd3a846400e1349fe9c5043b759146141a847
parent29e6e3b9ec4c49efe5983d0e681f1e4bbffa8f98
OP_MULTIDEREF: remove ghost entry in op_aux list

In the case where a multideref expression ends with an index that initially
looks simple (e.g. const or var) but turns out to be complex, the code
which optimises a sequence of aelem etc into a single multideref backs off
from including that last index expression in the multideref, but still
allocates a slot in the op_aux array for that ghost index.

For example in

    $expr->{foo}[0][1+$x]

it allocates a slot for the "1" constant but then doesn't use it.

This isn't an issue for multideref itself, but when running Deparse or
otherwise inspecting the op tree, the $op->aux_list() method returns a
list of the elements of the op_aux array with an extra garbage element at
the end, which can cause Deparse to crash.
lib/B/Deparse.t
op.c