From 329a333e7a4ed898282bec7f485751efbea92e8f Mon Sep 17 00:00:00 2001 From: David Leadbeater Date: Sat, 28 Aug 2010 22:39:58 +0100 Subject: 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. --- op.c | 12 ++++++++++++ t/op/smartmatch.t | 26 +++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/op.c b/op.c index 5ca1823d44..f49ce82c5f 100644 --- a/op.c +++ b/op.c @@ -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 () { 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 -- cgit v1.2.1