Skip to content

Commit dd9e86b

Browse files
author
Zefram
committed
correct detection of arg absence in Data::Dumper
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].
1 parent f8edfb8 commit dd9e86b

File tree

6 files changed

+36
-85
lines changed

6 files changed

+36
-85
lines changed

dist/Data-Dumper/Dumper.pm

+21-21
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
package Data::Dumper;
1111

1212
BEGIN {
13-
$VERSION = '2.168'; # Don't forget to set version and release
13+
$VERSION = '2.169'; # Don't forget to set version and release
1414
} # date in POD below!
1515

1616
#$| = 1;
@@ -627,7 +627,7 @@ sub Reset {
627627

628628
sub Indent {
629629
my($s, $v) = @_;
630-
if (defined($v)) {
630+
if (@_ >= 2) {
631631
if ($v == 0) {
632632
$s->{xpad} = "";
633633
$s->{sep} = "";
@@ -646,92 +646,92 @@ sub Indent {
646646

647647
sub Trailingcomma {
648648
my($s, $v) = @_;
649-
defined($v) ? (($s->{trailingcomma} = $v), return $s) : $s->{trailingcomma};
649+
@_ >= 2 ? (($s->{trailingcomma} = $v), return $s) : $s->{trailingcomma};
650650
}
651651

652652
sub Pair {
653653
my($s, $v) = @_;
654-
defined($v) ? (($s->{pair} = $v), return $s) : $s->{pair};
654+
@_ >= 2 ? (($s->{pair} = $v), return $s) : $s->{pair};
655655
}
656656

657657
sub Pad {
658658
my($s, $v) = @_;
659-
defined($v) ? (($s->{pad} = $v), return $s) : $s->{pad};
659+
@_ >= 2 ? (($s->{pad} = $v), return $s) : $s->{pad};
660660
}
661661

662662
sub Varname {
663663
my($s, $v) = @_;
664-
defined($v) ? (($s->{varname} = $v), return $s) : $s->{varname};
664+
@_ >= 2 ? (($s->{varname} = $v), return $s) : $s->{varname};
665665
}
666666

667667
sub Purity {
668668
my($s, $v) = @_;
669-
defined($v) ? (($s->{purity} = $v), return $s) : $s->{purity};
669+
@_ >= 2 ? (($s->{purity} = $v), return $s) : $s->{purity};
670670
}
671671

672672
sub Useqq {
673673
my($s, $v) = @_;
674-
defined($v) ? (($s->{useqq} = $v), return $s) : $s->{useqq};
674+
@_ >= 2 ? (($s->{useqq} = $v), return $s) : $s->{useqq};
675675
}
676676

677677
sub Terse {
678678
my($s, $v) = @_;
679-
defined($v) ? (($s->{terse} = $v), return $s) : $s->{terse};
679+
@_ >= 2 ? (($s->{terse} = $v), return $s) : $s->{terse};
680680
}
681681

682682
sub Freezer {
683683
my($s, $v) = @_;
684-
defined($v) ? (($s->{freezer} = $v), return $s) : $s->{freezer};
684+
@_ >= 2 ? (($s->{freezer} = $v), return $s) : $s->{freezer};
685685
}
686686

687687
sub Toaster {
688688
my($s, $v) = @_;
689-
defined($v) ? (($s->{toaster} = $v), return $s) : $s->{toaster};
689+
@_ >= 2 ? (($s->{toaster} = $v), return $s) : $s->{toaster};
690690
}
691691

692692
sub Deepcopy {
693693
my($s, $v) = @_;
694-
defined($v) ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy};
694+
@_ >= 2 ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy};
695695
}
696696

697697
sub Quotekeys {
698698
my($s, $v) = @_;
699-
defined($v) ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys};
699+
@_ >= 2 ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys};
700700
}
701701

702702
sub Bless {
703703
my($s, $v) = @_;
704-
defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
704+
@_ >= 2 ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
705705
}
706706

707707
sub Maxdepth {
708708
my($s, $v) = @_;
709-
defined($v) ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
709+
@_ >= 2 ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
710710
}
711711

712712
sub Maxrecurse {
713713
my($s, $v) = @_;
714-
defined($v) ? (($s->{'maxrecurse'} = $v), return $s) : $s->{'maxrecurse'};
714+
@_ >= 2 ? (($s->{'maxrecurse'} = $v), return $s) : $s->{'maxrecurse'};
715715
}
716716

717717
sub Useperl {
718718
my($s, $v) = @_;
719-
defined($v) ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'};
719+
@_ >= 2 ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'};
720720
}
721721

722722
sub Sortkeys {
723723
my($s, $v) = @_;
724-
defined($v) ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'};
724+
@_ >= 2 ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'};
725725
}
726726

727727
sub Deparse {
728728
my($s, $v) = @_;
729-
defined($v) ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'};
729+
@_ >= 2 ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'};
730730
}
731731

732732
sub Sparseseen {
733733
my($s, $v) = @_;
734-
defined($v) ? (($s->{'noseen'} = $v), return $s) : $s->{'noseen'};
734+
@_ >= 2 ? (($s->{'noseen'} = $v), return $s) : $s->{'noseen'};
735735
}
736736

737737
# used by qquote below
@@ -1474,7 +1474,7 @@ modify it under the same terms as Perl itself.
14741474
14751475
=head1 VERSION
14761476
1477-
Version 2.168
1477+
Version 2.169
14781478
14791479
=head1 SEE ALSO
14801480

dist/Data-Dumper/t/indent.t

+1-7
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ BEGIN {
1414
use strict;
1515

1616
use Data::Dumper;
17-
use Test::More tests => 10;
17+
use Test::More tests => 9;
1818
use lib qw( ./t/lib );
1919
use Testing qw( _dumptostr );
2020

@@ -34,10 +34,6 @@ $dumper = Data::Dumper->new([$hash]);
3434
$dumper->Indent();
3535
$dumpstr{indent_no_arg} = _dumptostr($dumper);
3636

37-
$dumper = Data::Dumper->new([$hash]);
38-
$dumper->Indent(undef);
39-
$dumpstr{indent_undef} = _dumptostr($dumper);
40-
4137
$dumper = Data::Dumper->new([$hash]);
4238
$dumper->Indent(0);
4339
$dumpstr{indent_0} = _dumptostr($dumper);
@@ -59,8 +55,6 @@ $dumpstr{indent_2} = _dumptostr($dumper);
5955

6056
is($dumpstr{noindent}, $dumpstr{indent_no_arg},
6157
"absence of Indent is same as Indent()");
62-
is($dumpstr{noindent}, $dumpstr{indent_undef},
63-
"absence of Indent is same as Indent(undef)");
6458
isnt($dumpstr{noindent}, $dumpstr{indent_0},
6559
"absence of Indent is different from Indent(0)");
6660
isnt($dumpstr{indent_0}, $dumpstr{indent_1},

dist/Data-Dumper/t/misc.t

+1-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ BEGIN {
1515
use strict;
1616

1717
use Data::Dumper;
18-
use Test::More tests => 20;
18+
use Test::More tests => 18;
1919
use lib qw( ./t/lib );
2020
use Testing qw( _dumptostr );
2121

@@ -76,17 +76,10 @@ note("Argument validation for new()");
7676
$obj = Data::Dumper->new([$a,$b]);
7777
$dumps{'noprev'} = _dumptostr($obj);
7878

79-
$obj = Data::Dumper->new([$a,$b]);
80-
$obj->Pad(undef);
81-
$dumps{'undef'} = _dumptostr($obj);
82-
8379
$obj = Data::Dumper->new([$a,$b]);
8480
$obj->Pad('');
8581
$dumps{'emptystring'} = _dumptostr($obj);
8682

87-
is($dumps{'noprev'}, $dumps{'undef'},
88-
"No setting for \$Data::Dumper::Pad and Pad(undef) give same result");
89-
9083
is($dumps{'noprev'}, $dumps{'emptystring'},
9184
"No setting for \$Data::Dumper::Pad and Pad('') give same result");
9285

@@ -113,17 +106,10 @@ note("Argument validation for new()");
113106
$obj = Data::Dumper->new([$a,$b]);
114107
$dumps{'noprev'} = _dumptostr($obj);
115108

116-
$obj = Data::Dumper->new([$a,$b]);
117-
$obj->Varname(undef);
118-
$dumps{'undef'} = _dumptostr($obj);
119-
120109
$obj = Data::Dumper->new([$a,$b]);
121110
$obj->Varname('');
122111
$dumps{'emptystring'} = _dumptostr($obj);
123112

124-
is($dumps{'noprev'}, $dumps{'undef'},
125-
"No setting for \$Data::Dumper::Varname and Varname(undef) give same result");
126-
127113
# Because Varname defaults to '$VAR', providing an empty argument to
128114
# Varname produces a non-default result.
129115
isnt($dumps{'noprev'}, $dumps{'emptystring'},

dist/Data-Dumper/t/purity_deepcopy_maxdepth.t

+1-16
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ BEGIN {
1616
use strict;
1717

1818
use Data::Dumper;
19-
use Test::More tests => 24;
19+
use Test::More tests => 22;
2020
use lib qw( ./t/lib );
2121
use Testing qw( _dumptostr );
2222

@@ -80,14 +80,6 @@ note("\$Data::Dumper::Purity and Purity()");
8080

8181
is($dumps{'noprev'}, $dumps{'objzero'},
8282
"No previous Purity setting equivalent to Purity(0)");
83-
84-
$purity = undef;
85-
$obj = Data::Dumper->new([$a,$b,$c], [qw(a b c)]);
86-
$obj->Purity($purity);
87-
$dumps{'objundef'} = _dumptostr($obj);
88-
89-
is($dumps{'noprev'}, $dumps{'objundef'},
90-
"No previous Purity setting equivalent to Purity(undef)");
9183
}
9284

9385
{
@@ -364,13 +356,6 @@ note("\$Data::Dumper::Maxdepth and Maxdepth()");
364356
is($dumps{'noprev'}, $dumps{'maxdepthempty'},
365357
"No previous Maxdepth setting equivalent to Maxdepth() with no argument");
366358

367-
$obj = Data::Dumper->new([$f], [qw(f)]);
368-
$obj->Maxdepth(undef);
369-
$dumps{'maxdepthundef'} = _dumptostr($obj);
370-
371-
is($dumps{'noprev'}, $dumps{'maxdepthundef'},
372-
"No previous Maxdepth setting equivalent to Maxdepth(undef)");
373-
374359
$maxdepth = 3;
375360
$obj = Data::Dumper->new([$f], [qw(f)]);
376361
$obj->Maxdepth($maxdepth);

dist/Data-Dumper/t/quotekeys.t

+2-3
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,9 @@ sub run_tests_for_quotekeys {
8686
$obj->Quotekeys($quotekeys);
8787
$dumps{'objqkundef'} = _dumptostr($obj);
8888

89-
note("Quotekeys(undef) will fall back to the default value\nfor \$Data::Dumper::Quotekeys, which is a true value.");
90-
isnt($dumps{'ddqkundef'}, $dumps{'objqkundef'},
89+
is($dumps{'ddqkundef'}, $dumps{'objqkundef'},
9190
"\$Data::Dumper::Quotekeys = undef and Quotekeys(undef) are equivalent");
92-
isnt($dumps{'ddqkzero'}, $dumps{'objqkundef'},
91+
is($dumps{'ddqkzero'}, $dumps{'objqkundef'},
9392
"\$Data::Dumper::Quotekeys = undef and = 0 are equivalent");
9493
%dumps = ();
9594

dist/Data-Dumper/t/terse.t

+10-23
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use strict;
33
use warnings;
44

55
use Data::Dumper;
6-
use Test::More tests => 6;
6+
use Test::More tests => 10;
77
use lib qw( ./t/lib );
88
use Testing qw( _dumptostr );
99

@@ -23,39 +23,26 @@ for my $useperl (0..1) {
2323
WANT
2424
}
2525

26-
my (%dumpstr);
2726
my $dumper;
2827

2928
$dumper = Data::Dumper->new([$hash]);
30-
$dumpstr{noterse} = _dumptostr($dumper);
31-
# $VAR1 = {
32-
# 'foo' => 42
33-
# };
29+
my $dumpstr_noterse = _dumptostr($dumper);
3430

3531
$dumper = Data::Dumper->new([$hash]);
3632
$dumper->Terse();
37-
$dumpstr{terse_no_arg} = _dumptostr($dumper);
33+
is _dumptostr($dumper), $dumpstr_noterse;
3834

3935
$dumper = Data::Dumper->new([$hash]);
4036
$dumper->Terse(0);
41-
$dumpstr{terse_0} = _dumptostr($dumper);
37+
is _dumptostr($dumper), $dumpstr_noterse;
4238

4339
$dumper = Data::Dumper->new([$hash]);
4440
$dumper->Terse(1);
45-
$dumpstr{terse_1} = _dumptostr($dumper);
46-
# {
47-
# 'foo' => 42
48-
# }
41+
isnt _dumptostr($dumper), $dumpstr_noterse;
4942

5043
$dumper = Data::Dumper->new([$hash]);
51-
$dumper->Terse(undef);
52-
$dumpstr{terse_undef} = _dumptostr($dumper);
53-
54-
is($dumpstr{noterse}, $dumpstr{terse_no_arg},
55-
"absence of Terse is same as Terse()");
56-
is($dumpstr{noterse}, $dumpstr{terse_0},
57-
"absence of Terse is same as Terse(0)");
58-
isnt($dumpstr{noterse}, $dumpstr{terse_1},
59-
"absence of Terse is different from Terse(1)");
60-
is($dumpstr{noterse}, $dumpstr{terse_undef},
61-
"absence of Terse is same as Terse(undef)");
44+
is $dumper->Terse(1), $dumper;
45+
is $dumper->Terse, 1;
46+
is $dumper->Terse(undef), $dumper;
47+
is $dumper->Terse, undef;
48+
is _dumptostr($dumper), $dumpstr_noterse;

0 commit comments

Comments
 (0)