destroy_matcher(matcher);
RETPUSHNO;
}
- else if (SvNIOK(d)) {
+ else if (!SvOK(d)) {
+ /* undef ~~ array */
+ const I32 this_len = av_len(MUTABLE_AV(SvRV(e)));
I32 i;
- for(i = 0; i <= AvFILL(MUTABLE_AV(SvRV(e))); ++i) {
+ for (i = 0; i <= this_len; ++i) {
SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE);
- if (!svp)
- continue;
-
- PUSHs(d);
- PUSHs(*svp);
- PUTBACK;
- if (CopHINTS_get(PL_curcop) & HINT_INTEGER)
- (void) pp_i_eq();
- else
- (void) pp_eq();
- SPAGAIN;
- if (SvTRUEx(POPs))
+ if (!svp || !SvOK(*svp))
RETPUSHYES;
}
RETPUSHNO;
}
- else if (SvPOK(d)) {
+ else {
const I32 this_len = av_len(MUTABLE_AV(SvRV(e)));
I32 i;
SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE);
if (!svp)
continue;
-
+
PUSHs(d);
PUSHs(*svp);
PUTBACK;
- (void) pp_seq();
+ /* infinite recursion isn't supposed to happen here */
+ (void) do_smartmatch(NULL, NULL);
SPAGAIN;
if (SvTRUEx(POPs))
RETPUSHYES;
# Predeclare vars used in the tests:
my @empty;
my %empty;
+my @sparse; $sparse[2] = 2;
my $deep1 = []; push @$deep1, \$deep1;
my $deep2 = []; push @$deep2, \$deep2;
! /bar/ @fooormore
# - a number
- 2 [qw(1foo 2bar)]
+ 2 [qw(1.00 2.00)]
2 [qw(foo 2)]
2.0_0e+0 [qw(foo 2)]
! 2 [qw(1foo bar2)]
! "2" [qw(1foo 2bar)]
"2bar" [qw(1foo 2bar)]
+# - undef
+ undef [1, 2, undef, 4]
+! undef [1, 2, [undef], 4]
+! undef @fooormore
+ undef @sparse
+
+# - nested arrays and ~~ distributivity
+ 11 [[11]]
+! 11 [[12]]
+ "foo" [{foo => "bar"}]
+! "bar" [{foo => "bar"}]
+
# Number against number
2 2
20 2_0