This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
vec(): defer lvalue out-of-range croaking
authorDavid Mitchell <davem@iabyn.com>
Fri, 31 Mar 2017 12:44:58 +0000 (13:44 +0100)
committerDavid Mitchell <davem@iabyn.com>
Fri, 31 Mar 2017 13:13:24 +0000 (14:13 +0100)
commit1b92e6949b737e92f61827f9c92afce9218e30ba
treedc6337456cd4e6bd0fe98c168602bcad4a2bedb1
parent1190bf17f4131bb86c6cd460c77e9d02894ca2ec
vec(): defer lvalue out-of-range croaking

RT #131083

Recent commits v5.25.10-81-gd69c430 and v5.25.10-82-g67dd6f3 added
out-of-range/overflow checks for the offset arg of vec().  However in
lvalue context, these croaks now happen before the SVt_PVLV was created,
rather than when its set magic was called. This means that something like

    sub f { $x = $_[0] }
    f(vec($s, -1, 8))

now croaks even though the out-of-range value never ended up getting used
in lvalue context.

This commit fixes things by, in pp_vec(), rather than croaking, just set
flag bits in LvFLAGS() to indicate that the offset is -Ve / out-of-range.

Then in Perl_magic_getvec(), return 0 if these flags are set, and in
Perl_magic_setvec() croak with a suitable error.
doop.c
mg.c
pp.c
sv.h
t/op/vec.t