X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F43-peep.t;fp=t%2F43-peep.t;h=5050821837fb71cb464548316546ee4e139beeb3;hb=6bc99454a8284978b14854642fac0123c77bac45;hp=0000000000000000000000000000000000000000;hpb=1740addb4cafa0e3bde5f257fd8d6ce00dfde2c3;p=perl%2Fmodules%2Fautovivification.git diff --git a/t/43-peep.t b/t/43-peep.t new file mode 100644 index 0000000..5050821 --- /dev/null +++ b/t/43-peep.t @@ -0,0 +1,198 @@ +#!perl -T + +use strict; +use warnings; + +use Test::More tests => 11 + 6 * 3; + +{ + my $desc = 'peephole optimization of conditionals'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + if ($_[0]) { + my $z = $x->{a}; + return 1; + } elsif ($_[1] || $_[2]) { + my $z = $x->{b}; + return 2; + } elsif ($_[3] && $_[4]) { + my $z = $x->{c}; + return 3; + } elsif ($_[5] ? $_[6] : 0) { + my $z = $x->{d}; + return 4; + } else { + my $z = $x->{e}; + return 5; + } + return 0; + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->(1); + is_deeply $x, undef, "$desc : first branch did not autovivify"; + is $ret, 1, "$desc : first branch returned 1"; + + $ret = $code->(0, 1); + is_deeply $x, undef, "$desc : second branch did not autovivify"; + is $ret, 2, "$desc : second branch returned 2"; + + $ret = $code->(0, 0, 0, 1, 1); + is_deeply $x, undef, "$desc : third branch did not autovivify"; + is $ret, 3, "$desc : third branch returned 3"; + + $ret = $code->(0, 0, 0, 0, 0, 1, 1); + is_deeply $x, undef, "$desc : fourth branch did not autovivify"; + is $ret, 4, "$desc : fourth branch returned 4"; + + $ret = $code->(); + is_deeply $x, undef, "$desc : fifth branch did not autovivify"; + is $ret, 5, "$desc : fifth branch returned 5"; +} + +{ + my $desc = 'peephole optimization of C-style loops'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + my $ret = 0; + for ( + my ($z, $i) = ($x->[100], 0) + ; + do { my $z = $x->[200]; $i < 4 } + ; + do { my $z = $x->[300]; ++$i } + ) { + my $z = $x->[$i]; + $ret += $i; + } + return $ret; + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->(); + is_deeply $x, undef, "$desc did not autovivify"; + is $ret, 6, "$desc returned 0+1+2+3"; +} + +{ + my $desc = 'peephole optimization of range loops'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + my $ret = 0; + for ((do { my $z = $x->[100]; 0 }) .. (do { my $z = $x->[200]; 3 })) { + my $z = $x->[$_]; + $ret += $_; + } + return $ret; + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->(); + is_deeply $x, undef, "$desc did not autovivify"; + is $ret, 6, "$desc returned 0+1+2+3"; +} + +{ + my $desc = 'peephole optimization of empty loops (RT #64435)'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + my $ret = 0; + for (;;) { + ++$ret; + return $ret; + } + return $ret; + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->(); + is_deeply $x, undef, "$desc did not autovivify"; + is $ret, 1, "$desc returned 1"; +} + +{ + my $desc = 'peephole optimization of map'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + join ':', map { + my $z = $x->[$_]; + "x${_}y" + } @_ + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->(1, 2); + is_deeply $x, undef, "$desc did not autovivify"; + is $ret, 'x1y:x2y', "$desc returned the right value"; +} + +{ + my $desc = 'peephole optimization of grep'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + join ':', grep { + my $z = $x->[$_]; + $_ <= 3 + } @_ + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->(1 .. 5); + is_deeply $x, undef, "$desc did not autovivify"; + is $ret, '1:2:3', "$desc returned the right value"; +} + +{ + my $desc = 'peephole optimization of substitutions'; + my $x; + + local $@; + my $code = eval <<' TESTCASE'; + no autovivification; + sub { + my $str = $_[0]; + $str =~ s{ + ([0-9]) + }{ + my $z = $x->[$1]; + 9 - $1; + }xge; + $str; + } + TESTCASE + is $@, '', "$desc compiled fine"; + + my $ret = $code->('0123456789'); + is_deeply $x, undef, "$desc did not autovivify"; + is $ret, '9876543210', "$desc returned the right value"; +}