]> git.vpit.fr Git - perl/modules/autovivification.git/commitdiff
Plain dereferencing shouldn't have a different behaviour
authorVincent Pit <vince@profvince.com>
Wed, 17 Jun 2009 10:24:41 +0000 (12:24 +0200)
committerVincent Pit <vince@profvince.com>
Wed, 17 Jun 2009 10:24:41 +0000 (12:24 +0200)
autovivification.xs
samples/hash2array.pl
t/20-hash.t
t/21-array.t
t/lib/autovivification/TestCases.pm

index 9e10bb5a9f00dd089321c6646f5c54580dd35f88..c0ff27c00b878c689784945dcb42a3475fa1d3af 100644 (file)
@@ -274,7 +274,9 @@ STATIC OP *a_pp_rv2av(pTHX) {
  UV hint;
  dSP;
 
- if (!SvOK(TOPs)) {
+ a_map_fetch(PL_op, &oi);
+
+ if (PL_op != oi.root && !SvOK(TOPs)) {
   /* We always need to push an empty array to fool the pp_aelem() that comes
    * later. */
   SV *av;
@@ -284,8 +286,6 @@ STATIC OP *a_pp_rv2av(pTHX) {
   RETURN;
  }
 
- a_map_fetch(PL_op, &oi);
-
  return CALL_FPTR(oi.old_pp)(aTHX);
 }
 
@@ -298,7 +298,7 @@ STATIC OP *a_pp_rv2hv(pTHX) {
 
  a_map_fetch(PL_op, &oi);
 
- if (!SvOK(TOPs)) {
+ if (PL_op != oi.root && !SvOK(TOPs)) {
   if (oi.root->op_flags & OPf_MOD) {
    SV *hv;
    POPs;
index 4e7ccaa032da344682be0a7ace71b58c2fdef2c8..863ba885721a1de1c42bc9929d4b51426a34f76b 100644 (file)
@@ -40,7 +40,9 @@ while (<$hash_t>) {
   s{'%'}{'\@'};
   print $array_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);
index ad82aae48831c7809fc916b4567e890ed3fc8486..d4cf269294168217a144db58494a7349c0aefdf3 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 6 * 3 * 260;
+use Test::More tests => 6 * 3 * 270;
 
 use lib 't/lib';
 use autovivification::TestCases;
@@ -111,6 +111,20 @@ $x->{a} = 1 # 1 for $x->{b}; () # '', undef, { a => 1, b => undef } # +delete
 $x->{a} = 1 # 1 for $x->{a}; () # '', undef, { a => 1 }             # +store
 $x->{a} = 1 # 1 for $x->{b}; () # '', undef, { a => 1, b => undef } # +store
 
+--- dereferencing ---
+
+$x # no warnings 'uninitialized'; my @a = %$x; () # ($strict ? qr/Can't use an undefined value as a HASH reference/ : ''), undef, undef
+$x # no warnings 'uninitialized'; my @a = %$x; () # ($strict ? qr/Can't use an undefined value as a HASH reference/ : ''), undef, undef #
+$x # no warnings 'uninitialized'; my @a = %$x; () # ($strict ? qr/Can't use an undefined value as a HASH reference/ : ''), undef, undef # +fetch
+$x # no warnings 'uninitialized'; my @a = %$x; () # ($strict ? qr/Can't use an undefined value as a HASH reference/ : ''), undef, undef # +exists
+$x # no warnings 'uninitialized'; my @a = %$x; () # ($strict ? qr/Can't use an undefined value as a HASH reference/ : ''), undef, undef # +delete
+$x # no warnings 'uninitialized'; my @a = %$x; () # ($strict ? qr/Can't use an undefined value as a HASH reference/ : ''), undef, undef # +store
+
+$x->{a} = 1 # my @a = %$x; () # '', undef, { a => 1 } # +fetch
+$x->{a} = 1 # my @a = %$x; () # '', undef, { a => 1 } # +exists
+$x->{a} = 1 # my @a = %$x; () # '', undef, { a => 1 } # +delete
+$x->{a} = 1 # my @a = %$x; () # '', undef, { a => 1 } # +store
+
 --- exists ---
 
 $x # exists $x->{a} # '', '', { }
index ed746c67f208bf466467691a907591e9dca10196..bf843d6e3f02b645bafa2b7c13b429b99354d8ad 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 6 * 3 * 260;
+use Test::More tests => 6 * 3 * 270;
 
 use lib 't/lib';
 use autovivification::TestCases;
@@ -111,6 +111,20 @@ $x->[0] = 1 # 1 for $x->[1]; () # '', undef, [ 1, undef ] # +delete
 $x->[0] = 1 # 1 for $x->[0]; () # '', undef, [ 1 ] # +store
 $x->[0] = 1 # 1 for $x->[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->[0] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +fetch
+$x->[0] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +exists
+$x->[0] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +delete
+$x->[0] = 1 # my @a = @$x; () # '', undef, [ 1 ] # +store
+
 --- exists ---
 
 $x # exists $x->[0] # '', '', [ ]
index 507a4d818c6391b7a5984eaa51c8b3fee3b4cea8..4170a3736ddc4da3139ea09091fa2df5c3ab7d04 100644 (file)
@@ -10,14 +10,17 @@ sub import {
  *{caller().'::testcase_ok'} = \&testcase_ok;
 }
 
+sub in_strict { (caller 0)[8] & (eval { strict::bits(@_) } || 0) };
+
 sub source {
  my ($var, $init, $code, $exp, $use, $global) = @_;
  my $decl = $global ? "our $var; local $var;" : "my $var;";
  my $test = $var =~ /^[@%]/ ? "\\$var" : $var;
  return <<TESTCASE;
-my \@exp = ($exp);
 $decl
 $init
+my \$strict = autovivification::TestCases::in_strict('refs');
+my \@exp = ($exp);
 my \$res = eval {
  local \$SIG{__WARN__} = sub { die join '', 'warn:', \@_ };
  $use