diff options
author | David Leadbeater <dgl@dgl.cx> | 2010-08-28 22:39:58 +0100 |
---|---|---|
committer | Rafael Garcia-Suarez <rgs@consttype.org> | 2010-09-07 16:02:59 +0200 |
commit | 329a333e7a4ed898282bec7f485751efbea92e8f (patch) | |
tree | 58488cbb987c73db35605786b2cac53b495f4e60 | |
parent | 90d1f214e03568148fd6495efac0f5614cfc0323 (diff) | |
download | perl-329a333e7a4ed898282bec7f485751efbea92e8f.tar.gz |
Fix RT #77468: Smart matching on slices
ref_array_or_hash did not take aslice or hslice OPs into account; wrap
them in an anonlist so that smart matching has a reference as it
expects.
-rw-r--r-- | op.c | 12 | ||||
-rw-r--r-- | t/op/smartmatch.t | 26 |
2 files changed, 37 insertions, 1 deletions
@@ -5542,6 +5542,18 @@ S_ref_array_or_hash(pTHX_ OP *cond) return newUNOP(OP_REFGEN, 0, mod(cond, OP_REFGEN)); + else if(cond + && (cond->op_type == OP_ASLICE + || cond->op_type == OP_HSLICE)) { + + /* anonlist now needs a list from this op, was previously used in + * scalar context */ + cond->op_flags |= ~(OPf_WANT_SCALAR | OPf_REF); + cond->op_flags |= OPf_WANT_LIST; + + return newANONLIST(mod(cond, OP_ANONLIST)); + } + else return cond; } diff --git a/t/op/smartmatch.t b/t/op/smartmatch.t index f8a073be56..f14e91ca94 100644 --- a/t/op/smartmatch.t +++ b/t/op/smartmatch.t @@ -73,7 +73,7 @@ my %keyandmore = map { $_ => 0 } @keyandmore; my %fooormore = map { $_ => 0 } @fooormore; # Load and run the tests -plan tests => 335; +plan tests => 351; while (<DATA>) { SKIP: { @@ -484,6 +484,30 @@ __DATA__ @nums { 1, '', 12, '' } ! @nums { 11, '', 12, '' } +# array slices + @nums[0..-1] [] + @nums[0..0] [1] +! @nums[0..1] [0..2] + @nums[0..4] [1..5] + +! undef @nums[0..-1] + 1 @nums[0..0] + 2 @nums[0..1] +! @nums[0..1] 2 + + @nums[0..1] @nums[0..1] + +# hash slices + @keyandmore{qw(not)} [undef] + @keyandmore{qw(key)} [0] + + undef @keyandmore{qw(not)} + 0 @keyandmore{qw(key and more)} +! 2 @keyandmore{qw(key and)} + + @fooormore{qw(foo)} @keyandmore{qw(key)} + @fooormore{qw(foo or more)} @keyandmore{qw(key and more)} + # UNDEF ! 3 undef ! 1 undef |