[perl #118691] Allow defelem magic with neg indices
authorFather Chrysostomos <sprout@cpan.org>
Wed, 17 Jul 2013 05:56:44 +0000 (22:56 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 21 Aug 2013 07:03:55 +0000 (00:03 -0700)
commitbbfdc870734e1313430ade6e6bd6d8ee2b720413
treece4190735fd46ebdaf7db844ee9f4bc338ad3a0e
parentb2d74da6dac4b0c1c9ebf65c8d96a3ee53f5232f
[perl #118691] Allow defelem magic with neg indices

When a nonexistent array element is passed to a subroutine, a special
‘deferred element’ scalar (implemented using something called defelem
magic) is passed to the subroutine instead, which delegates to the
array element.  This allows some_benign_function($array[$nonexistent])
to avoid autovivifying unnecessarily.

Whether this magic would be triggered was based on whether the element
was within the range 0..$#array.  Since arrays can contain nonexistent
elements before $#array, this logic is incorrect.  It also makes sense
to allow $array[$neg] where the negative number points before the
beginning of the array to create a deferred element and only croak if
it is assigned to.

This commit fixes the logic for when deferred elements are created
and implements these deferred negative elements.

Since we have to be able to store negative values in xlv_targoff, it
is convenient to make it a union (with two types--signed and unsigned)
and use LvSTARGOFF for defelem array indices.
mg.c
pp_hot.c
sv.h
t/op/array.t