On Fri, Jul 11, 2025 at 11:26:19AM +0200, Patrice Dumas wrote: > On Fri, Jul 11, 2025 at 12:45:05AM +0100, Gavin Smith wrote: > > As Texinfo tree elements are now blessed into the Texinfo::TreeElement > > class, this class is output by Data::Dumper when used by > > Texinfo::Common::debug_print_tree. I use this fairly often when developing > > and/or debugging. Sample output: > > > > The "bless" function calls with the "Texinfo::TreeElement" arguments > > are new. I couldn't find a way to eliminate the usages of "bless" > > by Data::Dumper. > > There is the $Data::Dumper::Toaster function in Data::Dumper that could > be used to do something for each blessed object, maybe copy it without > blessing?
It is $Data::Dumper::Freezer that does something before it is dumped. Copying the hash doesn't work (it is the original hash that needs to be unblessed). I could unbless it using the (not installed by default) Data::Structure::Util module, but then I ran into problems with type checks in Texinfo::Common::debug_print_element, Texinfo::Convert::Texinfo::_convert_to_texinfo and possibly elsewhere. So then I would have to iterate over the tree and rebless every element. > > The only way I can think of is to post-process the > > output with regular expressions. > > Another possibility could be to have a global variable/function to turn > on/off blessing of elements (with an XS override such that the same is > done for elements created from C) that would need to be called if > TreeElement are used, which is likely to be never... I can do that if > this is considered to be a good idea. If the elements are not blessed, > the Texinfo::TreeElement::new function would be a noop. Probably not worth the trouble just for this function. I can work around the problem with regex. > > Maybe this is not a big problem, as I can use > > Texinfo::ManipulateTree::tree_print_details instead (this is the function > > used by the test suite, which uses a different, more concise format, > > albeit one I'm less familiar with): > > I personnally prefer this format by far, and only use it, and I found > the Data::Dumper output to be unreadable for debugging anything a bit > complex even before having bless. I got very familiar with this format when writing the XS parser as I was comparing the results from the XS and pure Perl parser. > Another advantage (and the original > reason to do it) is that it can be used to debug C code too, and both > output should be similar (not necessarily exactly the same, maybe, when > the types in C are more precise than in Perl, I haven't checked), which > can be very handy when one or the other gives a better/good result. I'm sure I'll learn to interpret this soon. > > *@node C1 {@asis{} 2} > > |INFO > > |spaces_before_argument: > > |{spaces_before_argument: } > > |EXTRA > > |is_target:{1} > > |node_number:{10} > > |normalized:{-2} > > *arguments_line C1 > > *line_arg C2 > > |INFO > > |spaces_after_argument: > > |{spaces_after_argument:\n} > > *@asis C1 > > *brace_container > > { 2} > > > > > > Incidentally, it is a lot of typing to use Texinfo::Common::debug_print_tree > > or Texinfo::ManipulateTree::tree_print_details when you are trying to debug > > the program. I remember that many years ago, print_tree was exported by > > default by Texinfo::Common. I found the following ChangeLog entry from > > 2022 (I thought it was older): > > > > 2022-09-14 Patrice Dumas <pertu...@free.fr> > > > > * tp/Texinfo/Common.pm: more consistent export ok. Do not > > export print_tree. Rename print_tree() as debug_print_tree(). > > Rename add_preamble_before_content as _add_preamble_before_content. > > Remove _collect_references, unused and doing something strange. > > > > Although it may make sense from the perspective of abstraction and > > encapsulation, it doesn't make sense from the sense of making it easy > > to develop the program, in my opinion. So I think we should consider > > exporting a few basic functions by default, so we can again simply write > > "warn print_tree($element);" rather than > > "warn Texinfo::ManipulateTree::tree_print_details($element);". > > Do it, no problem, but please add a comment explaining why. Ok, thanks.