This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
correct detection of arg absence in Data::Dumper
authorZefram <zefram@fysh.org>
Tue, 12 Dec 2017 03:19:26 +0000 (03:19 +0000)
committerZefram <zefram@fysh.org>
Tue, 12 Dec 2017 03:34:24 +0000 (03:34 +0000)
The combined getter/setter methods were mistaking a supplied undef
argument value (of a setter call) for absence of an argument (making it
a getter call).  Fixes [perl #113090].

dist/Data-Dumper/Dumper.pm
dist/Data-Dumper/t/indent.t
dist/Data-Dumper/t/misc.t
dist/Data-Dumper/t/purity_deepcopy_maxdepth.t
dist/Data-Dumper/t/quotekeys.t
dist/Data-Dumper/t/terse.t

index 441e973..41433fc 100644 (file)
@@ -10,7 +10,7 @@
 package Data::Dumper;
 
 BEGIN {
-    $VERSION = '2.168'; # Don't forget to set version and release
+    $VERSION = '2.169'; # Don't forget to set version and release
 }               # date in POD below!
 
 #$| = 1;
@@ -627,7 +627,7 @@ sub Reset {
 
 sub Indent {
   my($s, $v) = @_;
-  if (defined($v)) {
+  if (@_ >= 2) {
     if ($v == 0) {
       $s->{xpad} = "";
       $s->{sep} = "";
@@ -646,92 +646,92 @@ sub Indent {
 
 sub Trailingcomma {
   my($s, $v) = @_;
-  defined($v) ? (($s->{trailingcomma} = $v), return $s) : $s->{trailingcomma};
+  @_ >= 2 ? (($s->{trailingcomma} = $v), return $s) : $s->{trailingcomma};
 }
 
 sub Pair {
     my($s, $v) = @_;
-    defined($v) ? (($s->{pair} = $v), return $s) : $s->{pair};
+    @_ >= 2 ? (($s->{pair} = $v), return $s) : $s->{pair};
 }
 
 sub Pad {
   my($s, $v) = @_;
-  defined($v) ? (($s->{pad} = $v), return $s) : $s->{pad};
+  @_ >= 2 ? (($s->{pad} = $v), return $s) : $s->{pad};
 }
 
 sub Varname {
   my($s, $v) = @_;
-  defined($v) ? (($s->{varname} = $v), return $s) : $s->{varname};
+  @_ >= 2 ? (($s->{varname} = $v), return $s) : $s->{varname};
 }
 
 sub Purity {
   my($s, $v) = @_;
-  defined($v) ? (($s->{purity} = $v), return $s) : $s->{purity};
+  @_ >= 2 ? (($s->{purity} = $v), return $s) : $s->{purity};
 }
 
 sub Useqq {
   my($s, $v) = @_;
-  defined($v) ? (($s->{useqq} = $v), return $s) : $s->{useqq};
+  @_ >= 2 ? (($s->{useqq} = $v), return $s) : $s->{useqq};
 }
 
 sub Terse {
   my($s, $v) = @_;
-  defined($v) ? (($s->{terse} = $v), return $s) : $s->{terse};
+  @_ >= 2 ? (($s->{terse} = $v), return $s) : $s->{terse};
 }
 
 sub Freezer {
   my($s, $v) = @_;
-  defined($v) ? (($s->{freezer} = $v), return $s) : $s->{freezer};
+  @_ >= 2 ? (($s->{freezer} = $v), return $s) : $s->{freezer};
 }
 
 sub Toaster {
   my($s, $v) = @_;
-  defined($v) ? (($s->{toaster} = $v), return $s) : $s->{toaster};
+  @_ >= 2 ? (($s->{toaster} = $v), return $s) : $s->{toaster};
 }
 
 sub Deepcopy {
   my($s, $v) = @_;
-  defined($v) ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy};
+  @_ >= 2 ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy};
 }
 
 sub Quotekeys {
   my($s, $v) = @_;
-  defined($v) ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys};
+  @_ >= 2 ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys};
 }
 
 sub Bless {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
+  @_ >= 2 ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
 }
 
 sub Maxdepth {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
+  @_ >= 2 ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
 }
 
 sub Maxrecurse {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'maxrecurse'} = $v), return $s) : $s->{'maxrecurse'};
+  @_ >= 2 ? (($s->{'maxrecurse'} = $v), return $s) : $s->{'maxrecurse'};
 }
 
 sub Useperl {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'};
+  @_ >= 2 ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'};
 }
 
 sub Sortkeys {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'};
+  @_ >= 2 ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'};
 }
 
 sub Deparse {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'};
+  @_ >= 2 ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'};
 }
 
 sub Sparseseen {
   my($s, $v) = @_;
-  defined($v) ? (($s->{'noseen'} = $v), return $s) : $s->{'noseen'};
+  @_ >= 2 ? (($s->{'noseen'} = $v), return $s) : $s->{'noseen'};
 }
 
 # used by qquote below
@@ -1474,7 +1474,7 @@ modify it under the same terms as Perl itself.
 
 =head1 VERSION
 
-Version 2.168
+Version 2.169
 
 =head1 SEE ALSO
 
index bcfa251..2814f0b 100644 (file)
@@ -14,7 +14,7 @@ BEGIN {
 use strict;
 
 use Data::Dumper;
-use Test::More tests => 10;
+use Test::More tests => 9;
 use lib qw( ./t/lib );
 use Testing qw( _dumptostr );
 
@@ -35,10 +35,6 @@ $dumper->Indent();
 $dumpstr{indent_no_arg} = _dumptostr($dumper);
 
 $dumper = Data::Dumper->new([$hash]);
-$dumper->Indent(undef);
-$dumpstr{indent_undef} = _dumptostr($dumper);
-
-$dumper = Data::Dumper->new([$hash]);
 $dumper->Indent(0);
 $dumpstr{indent_0} = _dumptostr($dumper);
 # $VAR1 = {'foo' => 42}; # no newline
@@ -59,8 +55,6 @@ $dumpstr{indent_2} = _dumptostr($dumper);
 
 is($dumpstr{noindent}, $dumpstr{indent_no_arg},
     "absence of Indent is same as Indent()");
-is($dumpstr{noindent}, $dumpstr{indent_undef},
-    "absence of Indent is same as Indent(undef)");
 isnt($dumpstr{noindent}, $dumpstr{indent_0},
     "absence of Indent is different from Indent(0)");
 isnt($dumpstr{indent_0}, $dumpstr{indent_1},
index 2ce81ac..54a89e6 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 use strict;
 
 use Data::Dumper;
-use Test::More tests => 20;
+use Test::More tests => 18;
 use lib qw( ./t/lib );
 use Testing qw( _dumptostr );
 
@@ -77,16 +77,9 @@ note("Argument validation for new()");
     $dumps{'noprev'} = _dumptostr($obj);
 
     $obj = Data::Dumper->new([$a,$b]);
-    $obj->Pad(undef);
-    $dumps{'undef'} = _dumptostr($obj);
-
-    $obj = Data::Dumper->new([$a,$b]);
     $obj->Pad('');
     $dumps{'emptystring'} = _dumptostr($obj);
 
-    is($dumps{'noprev'}, $dumps{'undef'},
-        "No setting for \$Data::Dumper::Pad and Pad(undef) give same result");
-
     is($dumps{'noprev'}, $dumps{'emptystring'},
         "No setting for \$Data::Dumper::Pad and Pad('') give same result");
 
@@ -114,16 +107,9 @@ note("Argument validation for new()");
     $dumps{'noprev'} = _dumptostr($obj);
 
     $obj = Data::Dumper->new([$a,$b]);
-    $obj->Varname(undef);
-    $dumps{'undef'} = _dumptostr($obj);
-
-    $obj = Data::Dumper->new([$a,$b]);
     $obj->Varname('');
     $dumps{'emptystring'} = _dumptostr($obj);
 
-    is($dumps{'noprev'}, $dumps{'undef'},
-        "No setting for \$Data::Dumper::Varname and Varname(undef) give same result");
-
     # Because Varname defaults to '$VAR', providing an empty argument to
     # Varname produces a non-default result.
     isnt($dumps{'noprev'}, $dumps{'emptystring'},
index f287101..3a7dc49 100644 (file)
@@ -16,7 +16,7 @@ BEGIN {
 use strict;
 
 use Data::Dumper;
-use Test::More tests => 24;
+use Test::More tests => 22;
 use lib qw( ./t/lib );
 use Testing qw( _dumptostr );
 
@@ -80,14 +80,6 @@ note("\$Data::Dumper::Purity and Purity()");
 
     is($dumps{'noprev'}, $dumps{'objzero'},
         "No previous Purity setting equivalent to Purity(0)");
-
-    $purity = undef;
-    $obj = Data::Dumper->new([$a,$b,$c], [qw(a b c)]);
-    $obj->Purity($purity);
-   $dumps{'objundef'} = _dumptostr($obj);
-
-    is($dumps{'noprev'}, $dumps{'objundef'},
-        "No previous Purity setting equivalent to Purity(undef)");
 }
 
 {
@@ -364,13 +356,6 @@ note("\$Data::Dumper::Maxdepth and Maxdepth()");
     is($dumps{'noprev'}, $dumps{'maxdepthempty'},
         "No previous Maxdepth setting equivalent to Maxdepth() with no argument");
 
-    $obj = Data::Dumper->new([$f], [qw(f)]);
-    $obj->Maxdepth(undef);
-    $dumps{'maxdepthundef'} = _dumptostr($obj);
-
-    is($dumps{'noprev'}, $dumps{'maxdepthundef'},
-        "No previous Maxdepth setting equivalent to Maxdepth(undef)");
-
     $maxdepth = 3;
     $obj = Data::Dumper->new([$f], [qw(f)]);
     $obj->Maxdepth($maxdepth);
index 0f6313a..076cdf6 100644 (file)
@@ -86,10 +86,9 @@ sub run_tests_for_quotekeys {
     $obj->Quotekeys($quotekeys);
     $dumps{'objqkundef'} = _dumptostr($obj);
 
-    note("Quotekeys(undef) will fall back to the default value\nfor \$Data::Dumper::Quotekeys, which is a true value.");
-    isnt($dumps{'ddqkundef'}, $dumps{'objqkundef'},
+    is($dumps{'ddqkundef'}, $dumps{'objqkundef'},
         "\$Data::Dumper::Quotekeys = undef and Quotekeys(undef) are equivalent");
-    isnt($dumps{'ddqkzero'}, $dumps{'objqkundef'},
+    is($dumps{'ddqkzero'}, $dumps{'objqkundef'},
         "\$Data::Dumper::Quotekeys = undef and = 0 are equivalent");
     %dumps = ();
 
index a5be980..a815c36 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 
 use Data::Dumper;
-use Test::More tests => 6;
+use Test::More tests => 10;
 use lib qw( ./t/lib );
 use Testing qw( _dumptostr );
 
@@ -23,39 +23,26 @@ for my $useperl (0..1) {
 WANT
 }
 
-my (%dumpstr);
 my $dumper;
 
 $dumper = Data::Dumper->new([$hash]);
-$dumpstr{noterse} = _dumptostr($dumper);
-# $VAR1 = {
-#           'foo' => 42
-#         };
+my $dumpstr_noterse = _dumptostr($dumper);
 
 $dumper = Data::Dumper->new([$hash]);
 $dumper->Terse();
-$dumpstr{terse_no_arg} = _dumptostr($dumper);
+is _dumptostr($dumper), $dumpstr_noterse;
 
 $dumper = Data::Dumper->new([$hash]);
 $dumper->Terse(0);
-$dumpstr{terse_0} = _dumptostr($dumper);
+is _dumptostr($dumper), $dumpstr_noterse;
 
 $dumper = Data::Dumper->new([$hash]);
 $dumper->Terse(1);
-$dumpstr{terse_1} = _dumptostr($dumper);
-# {
-#   'foo' => 42
-# }
+isnt _dumptostr($dumper), $dumpstr_noterse;
 
 $dumper = Data::Dumper->new([$hash]);
-$dumper->Terse(undef);
-$dumpstr{terse_undef} = _dumptostr($dumper);
-
-is($dumpstr{noterse}, $dumpstr{terse_no_arg},
-    "absence of Terse is same as Terse()");
-is($dumpstr{noterse}, $dumpstr{terse_0},
-    "absence of Terse is same as Terse(0)");
-isnt($dumpstr{noterse}, $dumpstr{terse_1},
-    "absence of Terse is different from Terse(1)");
-is($dumpstr{noterse}, $dumpstr{terse_undef},
-    "absence of Terse is same as Terse(undef)");
+is $dumper->Terse(1), $dumper;
+is $dumper->Terse, 1;
+is $dumper->Terse(undef), $dumper;
+is $dumper->Terse, undef;
+is _dumptostr($dumper), $dumpstr_noterse;