From: Vincent Pit Date: Thu, 18 Jun 2009 22:47:45 +0000 (+0200) Subject: Also test arrays without aelemfast optimization X-Git-Tag: v0.03~7 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Fautovivification.git;a=commitdiff_plain;h=b40a565a6a78eb14572fc60de1807d91662017fd Also test arrays without aelemfast optimization --- diff --git a/MANIFEST b/MANIFEST index cd1e567..979aa88 100644 --- a/MANIFEST +++ b/MANIFEST @@ -10,6 +10,7 @@ samples/hash2array.pl t/00-load.t t/20-hash.t t/21-hash-specific.t +t/30-array.t t/31-array-fast.t t/40-scope.t t/91-pod.t diff --git a/samples/hash2array.pl b/samples/hash2array.pl index 863ba88..8b3419d 100644 --- a/samples/hash2array.pl +++ b/samples/hash2array.pl @@ -6,8 +6,9 @@ use warnings; use Fatal qw/open/; use Text::Balanced qw/extract_bracketed/; -open my $hash_t, '<', 't/20-hash.t'; -open my $array_t, '>', 't/21-array.t'; +open my $hash_t, '<', 't/20-hash.t'; +open my $array_t, '>', 't/30-array.t'; +open my $array_fast_t, '>', 't/31-array-fast.t'; sub num { ord($_[0]) - ord('a') } @@ -35,23 +36,28 @@ my $in_data; while (<$hash_t>) { if (/^__DATA__$/) { $in_data = 1; - print $array_t $_; + print $array_t $_; + print $array_fast_t $_; } elsif (!$in_data) { s{'%'}{'\@'}; - print $array_t $_; + print $array_t $_; + print $array_fast_t $_; } else { - s!(\ba\b)?(\s*)HASH\b!($1 ? 'an': '') . "$2ARRAY"!eg; - s!->{([a-z])}!'->[' . num($1) . ']'!eg; - s!%(\{?)\$!\@$1\$!g; - my $buf; - my $suffix = $_; - my ($bracket, $prefix); - while (do { ($bracket, $suffix, $prefix) = extract($suffix); $bracket }) { - $buf .= $prefix . dump_array(hash2array(eval $bracket)); + for my $file ([ 1, $array_t ], [ 0, $array_fast_t ]) { + local $_ = $_; + s!(\ba\b)?(\s*)HASH\b!($1 ? 'an': '') . "$2ARRAY"!eg; + s!->{([a-z])}!my $n = num($1); '->[' . ($file->[0] ? "\$N[$n]" : $n) .']'!eg; + s!%(\{?)\$!\@$1\$!g; + my $buf; + my $suffix = $_; + my ($bracket, $prefix); + while (do { ($bracket, $suffix, $prefix) = extract($suffix); $bracket }) { + $buf .= $prefix . dump_array(hash2array(eval $bracket)); + } + $buf .= $suffix; + $buf =~ s/\s+/ /g; + $buf =~ s/\s+$//; + print { $file->[1] } "$buf\n"; } - $buf .= $suffix; - $buf =~ s/\s+/ /g; - $buf =~ s/\s+$//; - print $array_t "$buf\n"; } } diff --git a/t/30-array.t b/t/30-array.t new file mode 100644 index 0000000..c6be2aa --- /dev/null +++ b/t/30-array.t @@ -0,0 +1,341 @@ +#!perl -T + +use strict; +use warnings; + +use Test::More tests => 6 * 3 * 274; + +use lib 't/lib'; +use autovivification::TestCases; + +while () { + 1 while chomp; + next unless /#/; + testcase_ok($_, '@'); +} + +__DATA__ + +--- fetch --- + +$x # $x->[$N[0]] # '', undef, [ ] +$x # $x->[$N[0]] # '', undef, undef # +$x # $x->[$N[0]] # '', undef, undef # +fetch +$x # $x->[$N[0]] # '', undef, [ ] # +exists +$x # $x->[$N[0]] # '', undef, [ ] # +delete +$x # $x->[$N[0]] # '', undef, [ ] # +store + +$x # $x->[$N[0]] # '', undef, [ ] # -fetch +$x # $x->[$N[0]] # '', undef, [ ] # +fetch -fetch +$x # $x->[$N[0]] # '', undef, undef # -fetch +fetch +$x # $x->[$N[0]] # '', undef, undef # +fetch -exists + +$x # $x->[$N[0]] # qr/^Reference vivification forbidden/, undef, undef # +strict +fetch +$x # $x->[$N[0]] # '', undef, [ ] # +strict +exists +$x # $x->[$N[0]] # '', undef, [ ] # +strict +delete +$x # $x->[$N[0]] # '', undef, [ ] # +strict +store + +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] +$x # $x->[$N[0]]->[$N[1]] # '', undef, undef # +$x # $x->[$N[0]]->[$N[1]] # '', undef, undef # +fetch +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +exists +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +delete +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +store + +$x # $x->[$N[0]]->[$N[1]] # qr/^Reference vivification forbidden/, undef, undef # +strict +fetch +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +strict +exists +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +strict +delete +$x # $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +strict +store + +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +fetch +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +fetch +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +exists +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +exists +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +delete +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +delete +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +store +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +store + +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +strict +fetch +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +strict +fetch +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +strict +exists +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +strict +exists +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +strict +delete +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +strict +delete +$x->[$N[0]] = 1 # $x->[$N[0]] # '', 1, [ 1 ] # +strict +store +$x->[$N[0]] = 1 # $x->[$N[1]] # '', undef, [ 1 ] # +strict +store + +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +store + +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # qr/^Reference vivification forbidden/, undef, [ [ undef, 1 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +strict +store + +--- aliasing --- + +$x # 1 for $x->[$N[0]]; () # '', undef, [ undef ] +$x # 1 for $x->[$N[0]]; () # '', undef, [ undef ] # +$x # 1 for $x->[$N[0]]; () # '', undef, [ undef ] # +fetch +$x # 1 for $x->[$N[0]]; () # '', undef, [ undef ] # +exists +$x # 1 for $x->[$N[0]]; () # '', undef, [ undef ] # +delete +$x # 1 for $x->[$N[0]]; () # qr/^Can't vivify reference/, undef, undef # +store + +$x # $_ = 1 for $x->[$N[0]]; () # '', undef, [ 1 ] +$x # $_ = 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +$x # $_ = 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +fetch +$x # $_ = 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +exists +$x # $_ = 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +delete +$x # $_ = 1 for $x->[$N[0]]; () # qr/^Can't vivify reference/, undef, undef # +store + +$x->[$N[0]] = 1 # 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +fetch +$x->[$N[0]] = 1 # 1 for $x->[$N[1]]; () # '', undef, [ 1, undef ] # +fetch +$x->[$N[0]] = 1 # 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +exists +$x->[$N[0]] = 1 # 1 for $x->[$N[1]]; () # '', undef, [ 1, undef ] # +exists +$x->[$N[0]] = 1 # 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +delete +$x->[$N[0]] = 1 # 1 for $x->[$N[1]]; () # '', undef, [ 1, undef ] # +delete +$x->[$N[0]] = 1 # 1 for $x->[$N[0]]; () # '', undef, [ 1 ] # +store +$x->[$N[0]] = 1 # 1 for $x->[$N[1]]; () # '', undef, [ 1, undef ] # +store + +--- dereferencing --- + +$x # no warnings 'uninitialized'; my @a = @$x; () # ($strict ? qr/^Can't use an undefined value as an ARRAY reference/ : ''), undef, undef +$x # no warnings 'uninitialized'; my @a = @$x; () # ($strict ? qr/^Can't use an undefined value as an ARRAY reference/ : ''), undef, undef # +$x # no warnings 'uninitialized'; my @a = @$x; () # ($strict ? qr/^Can't use an undefined value as an ARRAY reference/ : ''), undef, undef # +fetch +$x # no warnings 'uninitialized'; my @a = @$x; () # ($strict ? qr/^Can't use an undefined value as an ARRAY reference/ : ''), undef, undef # +exists +$x # no warnings 'uninitialized'; my @a = @$x; () # ($strict ? qr/^Can't use an undefined value as an ARRAY reference/ : ''), undef, undef # +delete +$x # no warnings 'uninitialized'; my @a = @$x; () # ($strict ? qr/^Can't use an undefined value as an ARRAY reference/ : ''), undef, undef # +store + +$x->[$N[0]] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +fetch +$x->[$N[0]] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +exists +$x->[$N[0]] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +delete +$x->[$N[0]] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +store + +--- exists --- + +$x # exists $x->[$N[0]] # '', '', [ ] +$x # exists $x->[$N[0]] # '', '', undef # +$x # exists $x->[$N[0]] # '', '', [ ] # +fetch +$x # exists $x->[$N[0]] # '', '', undef # +exists +$x # exists $x->[$N[0]] # '', '', [ ] # +delete +$x # exists $x->[$N[0]] # '', '', [ ] # +store + +$x # exists $x->[$N[0]] # '', '', [ ] # +strict +fetch +$x # exists $x->[$N[0]] # qr/^Reference vivification forbidden/, undef, undef # +strict +exists +$x # exists $x->[$N[0]] # '', '', [ ] # +strict +delete +$x # exists $x->[$N[0]] # '', '', [ ] # +strict +store + +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] +$x # exists $x->[$N[0]]->[$N[1]] # '', '', undef # +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] # +fetch +$x # exists $x->[$N[0]]->[$N[1]] # '', '', undef # +exists +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] # +delete +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] # +store + +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] # +strict +fetch +$x # exists $x->[$N[0]]->[$N[1]] # qr/^Reference vivification forbidden/, undef, undef # +strict +exists +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] # +strict +delete +$x # exists $x->[$N[0]]->[$N[1]] # '', '', [ [ ] ] # +strict +store + +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +fetch +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +fetch +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +exists +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +exists +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +delete +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +delete +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +store +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +store + +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +strict +fetch +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +strict +fetch +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +strict +exists +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +strict +exists +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +strict +delete +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +strict +delete +$x->[$N[0]] = 1 # exists $x->[$N[0]] # '', 1, [ 1 ] # +strict +store +$x->[$N[0]] = 1 # exists $x->[$N[1]] # '', '', [ 1 ] # +strict +store + +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ], undef, [ ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ], undef, [ ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ], undef, [ ] ] # +store + +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ], undef, [ ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # qr/^Reference vivification forbidden/, undef, [ [ undef, 1 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ], undef, [ ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[1]] # '', 1, [ [ undef, 1 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[0]]->[$N[3]] # '', '', [ [ undef, 1 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # exists $x->[$N[2]]->[$N[3]] # '', '', [ [ undef, 1 ], undef, [ ] ] # +strict +store + +--- delete --- + +$x # delete $x->[$N[0]] # '', undef, [ ] +$x # delete $x->[$N[0]] # '', undef, undef # +$x # delete $x->[$N[0]] # '', undef, [ ] # +fetch +$x # delete $x->[$N[0]] # '', undef, [ ] # +exists +$x # delete $x->[$N[0]] # '', undef, undef # +delete +$x # delete $x->[$N[0]] # '', undef, [ ] # +store + +$x # delete $x->[$N[0]] # '', undef, [ ] # +strict +fetch +$x # delete $x->[$N[0]] # '', undef, [ ] # +strict +exists +$x # delete $x->[$N[0]] # qr/^Reference vivification forbidden/, undef, undef # +strict +delete +$x # delete $x->[$N[0]] # '', undef, [ ] # +strict +store + +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, undef # +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +fetch +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +exists +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, undef # +delete +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +store + +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +strict +fetch +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +strict +exists +$x # delete $x->[$N[0]]->[$N[1]] # qr/^Reference vivification forbidden/, undef, undef # +strict +delete +$x # delete $x->[$N[0]]->[$N[1]] # '', undef, [ [ ] ] # +strict +store + +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +fetch +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +fetch +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +exists +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +exists +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +delete +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +delete +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +store +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +store + +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +strict +fetch +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +strict +fetch +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +strict +exists +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +strict +exists +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +strict +delete +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +strict +delete +$x->[$N[0]] = 1 # delete $x->[$N[0]] # '', 1, [ ] # +strict +store +$x->[$N[0]] = 1 # delete $x->[$N[1]] # '', undef, [ 1 ] # +strict +store + +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ]# +fetch +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ]# +exists +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ]# +delete +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ] ]# +delete +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ]# +store +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ] # +store + +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ]# +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ]# +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # qr/^Reference vivification forbidden/, undef, [ [ undef, 1 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[1]] # '', 1, [ [ ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[0]]->[$N[3]] # '', undef, [ [ undef, 1 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # delete $x->[$N[2]]->[$N[3]] # '', undef, [ [ undef, 1 ], undef, [ ] ]# +strict +store + +--- store --- + +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +fetch +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +exists +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +delete +$x # $x->[$N[0]] = 1 # qr/^Can't vivify reference/, undef, undef # +store + +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +strict +fetch +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +strict +exists +$x # $x->[$N[0]] = 1 # '', 1, [ 1 ] # +strict +delete +$x # $x->[$N[0]] = 1 # qr/^Reference vivification forbidden/, undef, undef # +strict +store + +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +fetch +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +exists +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +delete +$x # $x->[$N[0]]->[$N[1]] = 1 # qr/^Can't vivify reference/, undef, undef # +store + +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +strict +fetch +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +strict +exists +$x # $x->[$N[0]]->[$N[1]] = 1 # '', 1, [ [ undef, 1 ] ] # +strict +delete +$x # $x->[$N[0]]->[$N[1]] = 1 # qr/^Reference vivification forbidden/, undef, undef # +strict +store + +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +fetch +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +fetch +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +exists +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +exists +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +delete +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +delete +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +store +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +store + +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +strict +fetch +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +strict +fetch +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +strict +exists +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +strict +exists +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +strict +delete +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +strict +delete +$x->[$N[0]] = 1 # $x->[$N[0]] = 2 # '', 2, [ 2 ] # +strict +store +$x->[$N[0]] = 1 # $x->[$N[1]] = 2 # '', 2, [ 1, 2 ] # +strict +store + +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # '', 2, [ [ undef, 1 ], undef, [ undef, undef, undef, 2 ] ] # +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # '', 2, [ [ undef, 1 ], undef, [ undef, undef, undef, 2 ] ] # +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # '', 2, [ [ undef, 1 ], undef, [ undef, undef, undef, 2 ] ] # +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # qr/^Can't vivify reference/, undef, [ [ undef, 1 ] ] # +store + +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # '', 2, [ [ undef, 1 ], undef, [ undef, undef, undef, 2 ] ] # +strict +fetch +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # '', 2, [ [ undef, 1 ], undef, [ undef, undef, undef, 2 ] ] # +strict +exists +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # '', 2, [ [ undef, 1 ], undef, [ undef, undef, undef, 2 ] ] # +strict +delete +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[1]] = 2 # '', 2, [ [ undef, 2 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[0]]->[$N[3]] = 2 # '', 2, [ [ undef, 1, undef, 2 ] ] # +strict +store +$x->[$N[0]]->[$N[1]] = 1 # $x->[$N[2]]->[$N[3]] = 2 # qr/^Reference vivification forbidden/, undef, [ [ undef, 1 ] ] # +strict +store diff --git a/t/lib/autovivification/TestCases.pm b/t/lib/autovivification/TestCases.pm index b3521c5..87dfd09 100644 --- a/t/lib/autovivification/TestCases.pm +++ b/t/lib/autovivification/TestCases.pm @@ -94,6 +94,7 @@ sub testcase_ok { push @testcases, @extra; for (@testcases) { my ($testcase, $desc) = generate(@$_); + my @N = (0 .. 9); eval $testcase; diag "== This testcase failed to compile ==\n$testcase\n## Reason: $@" if $@; }