]> git.vpit.fr Git - perl/modules/Sub-Nary.git/commitdiff
Add support for constant ranges, and tests for kinds all ranges
authorVincent Pit <vince@profvince.com>
Tue, 5 Aug 2008 13:14:35 +0000 (15:14 +0200)
committerVincent Pit <vince@profvince.com>
Tue, 5 Aug 2008 13:14:35 +0000 (15:14 +0200)
lib/Sub/Nary.pm
t/20-return.t
t/21-list.t

index 5c263154fd0de43d5c1e124d6b5fd35ad6ec1529..427ee8c7eb7cfe3b021d58ae0887117bd1523bfc 100644 (file)
@@ -204,7 +204,7 @@ $ops{$_} = 0      for qw/stub nextstate/;
 $ops{$_} = 1      for qw/padsv/;
 $ops{$_} = 'list' for qw/padav/;
 $ops{$_} = 'list' for qw/padhv rv2hv/;
-$ops{$_} = 'list' for qw/padany flip match entereval readline/;
+$ops{$_} = 'list' for qw/padany match entereval readline/;
 
 $ops{each}      = { 0 => 0.5, 2 => 0.5 };
 $ops{stat}      = { 0 => 0.5, 13 => 0.5 };
@@ -446,6 +446,32 @@ sub pp_aassign { $_[0]->expect_any($_[1]->first) }
 
 sub pp_leaveloop { $_[0]->expect_return($_[1]->first->sibling) }
 
+sub pp_flip {
+ my ($self, $op) = @_;
+
+ $op = $op->first;
+ return 'list' if name($op) ne 'range';
+
+ my $begin = $op->first;
+ if (name($begin) eq 'const') {
+  my $end = $begin->sibling;
+  if (name($end) eq 'const') {
+   $begin  = $self->const_sv($begin);
+   $end    = $self->const_sv($end);
+   no warnings 'numeric';
+   return int(${$end->object_2svref}) - int(${$begin->object_2svref}) + 1;
+  } else {
+   my ($p, $r) = $self->expect_return($end);
+   return $p => 1 if $r;
+  }
+ } else {
+  my ($p, $r) = $self->expect_return($begin);
+  return $p => 1 if $r;
+ }
+
+ return 'list'
+}
+
 =head1 EXPORT
 
 An object-oriented module shouldn't export any function, and so does this one.
index e7e852d0c8e84582933beae4bc81c527c5018792..191a386dd9ca0332542df8e0c68ab899381e2c8a 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 50;
+use Test::More tests => 56;
 
 use Sub::Nary;
 
@@ -46,7 +46,13 @@ my @tests = (
  [ sub { return $x, @a },           'list' ],
  [ sub { return %h, $y },           'list' ],
 
- [ sub { return 1 .. 3 }, 'list' ],
+ [ sub { return 1 .. 3 },                  3 ],
+ [ sub { return $x .. 3 },                 'list' ],
+ [ sub { return 1 .. $x },                 'list' ],
+ [ sub { return '2foo' .. 4 },             3 ],
+ [ sub { my @a = (7, 8); return @a .. 4 }, 'list' ],
+ [ sub { return do { return 1, 2 } .. 3 }, 2 ],
+ [ sub { return 1 .. do { return 2, 3 } }, 2 ],
 
  [ sub { for (1, 2, 3) { return } },                                     0 ],
  [ sub { for (1, 2, 3) { } return 1, 2; },                               2 ],
index 6de15c23d91bab35ceca6fd55a78f0e44fee5c1c..3acf6593eeb4a83aca744724fdbf8963d65bb5a3 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 36;
+use Test::More tests => 40;
 
 use Sub::Nary;
 
@@ -40,8 +40,12 @@ my @tests = (
  [ sub { $x, @a },           'list' ],
  [ sub { %h, $y },           'list' ],
 
- [ sub { 1 .. 3 },           'list' ],
- [ sub { my @a = (1 .. 4) }, 4 ],
+ [ sub { 1 .. 3 },                  3 ],
+ [ sub { $x .. 3 },                 'list' ],
+ [ sub { 1 .. $x },                 'list' ],
+ [ sub { '2foo' .. 4 },             3 ],
+ [ sub { my @a = (7, 8); @a .. 4 }, 'list' ],
+ [ sub { my @a = (1 .. 4) },        4 ],
 
  [ sub { "banana" =~ /(a)/g }, 'list' ],