# New Ticket Created by Will Coleda # Please include the string: [perl #46933] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=46933 >
Currently, Data::Dumper treats Undef pmcs like any other pmcs. When dumping, then, if a single Undef is repeatedly re-used, the Undef is cached by the dumper (like any other PMC) and rather than dump as "undef", dumps as a reference. Here's some sample code from particle: .sub 'test' :main load_bytecode 'Data/Dumper.pir' $P0 = new 'Undef' $P1 = new 'Undef' $P2 = new 'Hash' $P2['$P0'] = $P0 $P2['$P1'] = $P1 $P2['$P0-ref'] = $P0 $P99 = new 'Data::Dumper' $P99.'dumper'( $P2 ) .end c:\usr\local\parrot\trunk>parrot ..\t-dumper.pir "VAR1" => Hash { "$P0" => undef, "$P0-ref" => \VAR1["$P0"], "$P1" => undef } So, since Undef isn't treated in a special fashion, I can understand why this works the way it does, and it is arguably correct. I propose that we change this to make Undef special cased, and avoid caching the Undef PMC in dumper, so that a more perl5-like output is created (where undef isn't an object, it's a value. Small patch follows; all tests pass (so nothing is relying on the existing behavior.). Thjs changes the output above to: "VAR1" => Hash { "$P0" => undef, "$P0-ref" => undef, "$P1" => undef } I'll wait for a consensus before applying; There was disagreement on #parrot about changing this, putting it out here for discussion. $ svn diff runtime/ Index: runtime/parrot/library/Data/Dumper/Base.pir =================================================================== --- runtime/parrot/library/Data/Dumper/Base.pir (revision 22503) +++ runtime/parrot/library/Data/Dumper/Base.pir (working copy) @@ -188,6 +188,10 @@ .local string func .local string name + # Don't cache undef... + $I0 = defined _dump + unless $I0 goto NOT_IN_CACHE + (type, name) = self."cache"( paramName, _dump ) if type == -1 goto NOT_IN_CACHE