B-DeparseTree

 view release on metacpan or  search on metacpan

ChangeLog  view on Meta::CPAN


2018-06-02  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/P518.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/P522.pm, lib/B/DeparseTree/P524.pm,
	lib/B/DeparseTree/P526.pm, lib/B/DeparseTree/P526c.pm,
	lib/B/DeparseTree/PPfns.pm: Move dq to PPfns

2018-06-02  Rocky Bernstein <rocky@cpan.org>

	* t/unit/03-treemain.t, t/unit/04-fragment.t: Administrivia

2018-06-02  Rocky Bernstein <rocky@cpan.org>

	* MANIFEST: Administrivia

2018-06-02  Rocky Bernstein <rocky@cpan.org>

	* MANIFEST, lib/B/DeparseTree/P526c.pm, lib/B/DeparseTree/PP.pm,
	lib/B/DeparseTree/TreeMain.pm, t/20-deparse-small.t,
	t/testdata/P526-short.pm, t/unit/03-fragment.t,
	t/unit/04-treemain.t: Minimal C Perl! + Administrivia

2018-06-02  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/PP.pm, lib/B/DeparseTree/PPfns.pm,
	lib/B/DeparseTree/TreeMain.pm: Misc cleanups...  move single_delim from TreeMain to PPfns, define flag bits as
	contants.

2018-06-02  Rocky Bernstein <rocky@cpan.org>

ChangeLog  view on Meta::CPAN


	* lib/B/DeparseTree/P518.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/PPfns.pm, t/testdata/subst.pm: fn exports futzing

2018-05-29  rocky <rb@dustyfeet.com>

	* t/testdata/P524-short.pm, t/testdata/P526-short.pm: Bang on tests

2018-05-29  rocky <rb@dustyfeet.com>

	* MANIFEST, lib/B/DeparseTree/PPfns.pm, scripts/frag.pl,
	t/20-deparse-small.t, t/testdata/P524.pm, t/testdata/P526-short.pm,
	t/testdata/subst.pm: Better test utilities

2018-05-28  rocky <rb@dustyfeet.com>

	* t/roundtrip/runtests.pl: One more CI try

2018-05-28  rocky <rb@dustyfeet.com>

	* GNUmakefile, t/roundtrip/runtests.pl: Another pass getting

ChangeLog  view on Meta::CPAN

	t/10-core.t, t/testdata/P526-short.pm, t/testdata/core-ops.pm: WIP:
	rework indirop..  there is some regression in tests here.

2018-05-25  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Fragment.pm: Bang on prev_op handling...

2018-05-25  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Fragment.pm, lib/B/DeparseTree/PP.pm,
	scripts/frag.pl: Bang on other_op handling...  Handle position field in extract_node_entry

2018-05-25  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/P518.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/P522.pm, lib/B/DeparseTree/P524.pm,
	lib/B/DeparseTree/P526.pm, lib/B/DeparseTree/P526c.pm,
	lib/B/DeparseTree/PP.pm, lib/B/DeparseTree/PPfns.pm,
	t/testdata/P526-short.pm: DRY but ...  there is a slight regression

2018-05-25  Rocky Bernstein <rocky@cpan.org>

ChangeLog  view on Meta::CPAN

2018-05-23  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P518.pm,
	lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P522.pm,
	lib/B/DeparseTree/P524.pm, lib/B/DeparseTree/P526.pm,
	lib/B/DeparseTree/P526c.pm: DRY ops more

2018-05-23  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/PPfns.pm,
	lib/B/DeparseTree/SyntaxTree.pm, scripts/frag.pl: %; needs trailing
	";" Move ops to PPfns.pm

2018-05-23  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P522.pm,
	lib/B/DeparseTree/P526.pm, lib/B/DeparseTree/P526c.pm: Sync P5xx's

2018-05-23  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P524.pm: Reinstate

ChangeLog  view on Meta::CPAN

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/PPfns.pm,
	lib/B/DeparseTree/SyntaxTree.pm: Start to simplify indexes arg Covert binop to use templates

2018-05-22  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/PP.pm: Misc bugs

2018-05-22  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Node.pm, lib/B/DeparseTree/SyntaxTree.pm,
	scripts/frag.pl: Clean Node structure a little...  Don't add "sep" or "texts" when it is not needed.

2018-05-22  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P518.pm,
	lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P522.pm,
	lib/B/DeparseTree/P524.pm, lib/B/DeparseTree/P526.pm,
	lib/B/DeparseTree/P526c.pm, lib/B/DeparseTree/PP.pm,
	lib/B/DeparseTree/PPfns.pm, lib/B/DeparseTree/SyntaxTree.pm,
	t/unit/03-common.t: Start rolling in info_from_string ..  and rolling out info_from_text which uses a whacky paremeter
	ordering

ChangeLog  view on Meta::CPAN

	* lib/B/DeparseTree/Common.pm, t/testdata/P518-short.pm,
	t/testdata/P522-short.pm, t/testdata/P522.pm,
	t/testdata/P524-short.pm, t/testdata/P524.pm,
	t/testdata/P526-short.pm, t/testdata/P526.pm: ??? -> ?unrecoverable
	constant?...  which is more clear about what's gone on.

2018-05-21  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree.pm, lib/B/DeparseTree/Common.pm,
	lib/B/DeparseTree/Fragment.pm, lib/B/DeparseTree/Node.pm,
	lib/B/DeparseTree/P526c.pm, scripts/frag.pl: Remove extraneous \n's
	in "use". Start dumptree.

2018-05-21  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/Common.pm: Fix wrong call.

2018-05-21  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/PP.pm: Move almost
	all of pp_() in Common to PP.pm

ChangeLog  view on Meta::CPAN

	* lib/B/DeparseTree/Common.pm: Use B::Deparse::stash_subs

2018-05-19  R. Bernstein <rocky@users.noreply.github.com>

	* : Merge pull request #2 from rocky/template-refactor Template refactor

2018-05-18  Rocky Bernstein <rocky@cpan.org>

	* MANIFEST, lib/B/DeparseTree/Fragment.pm,
	lib/B/DeparseTree/P526.pm, t/20-deparse-526c.t,
	t/unit/03-fragment.t: Fix up child-parent context line finding

2018-05-18  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P526.pm,
	lib/B/DeparseTree/PP.pm: Fix up 5.26 repeat

2018-05-18  rocky <rb@dustyfeet.com>

	* MANIFEST, lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P518.pm,
	t/20-deparse-518-small.t, t/20-deparse-522-small.t,

ChangeLog  view on Meta::CPAN

	* t/20-core-526.t, t/helper.pm, t/testdata/P526-core.pm: Move common
	test code to helper.

2018-05-16  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree.pm, lib/B/DeparseTree/Common.pm,
	lib/B/DeparseTree/Fragment.pm, lib/B/DeparseTree/Node.pm,
	lib/B/DeparseTree/P518.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/P522.pm, lib/B/DeparseTree/P524.pm,
	lib/B/DeparseTree/P526.pm, lib/B/DeparseTree/P526c.pm,
	lib/B/DeparseTree/PP.pm, scripts/frag.pl, t/20-core-526.t,
	t/testdata/P526-core.pm, t/unit/03-common.t: Reinstate op testing on
	5.26...  and in the process we've fixed some bugs.  A bit of refactoring too.

2018-05-16  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/Fragment.pm,
	lib/B/DeparseTree/Node.pm, lib/B/DeparseTree/P518.pm,
	lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P522.pm,
	lib/B/DeparseTree/P524.pm, lib/B/DeparseTree/P526.pm,
	lib/B/DeparseTree/P526c.pm, lib/B/DeparseTree/PP.pm,

ChangeLog  view on Meta::CPAN

2018-05-07  Rocky Bernstein <rocky@cpan.org>

	* MANIFEST, MANIFEST.SKIP, admin/how-to-make-a-release.md,
	{testdata => scripts}/.gitignore, {testdata => scripts}/Makefile,
	{testdata => scripts}/README.md, {testdata => scripts}/base/cond.t,
	{testdata => scripts}/base/if.t, {testdata => scripts}/base/lex.t,
	{testdata => scripts}/base/num.t, {testdata => scripts}/base/pat.t,
	{testdata => scripts}/base/rs.t, {testdata => scripts}/base/term.t,
	{testdata => scripts}/base/while.t, scripts/benchtests.pl,
	{testdata => scripts}/bug-sample.pm, scripts/deparse.sh, {testdata
	=> scripts}/fib.pl, {testdata => scripts}/frag.pl, {testdata =>
	scripts}/opbasic/arith.t, {testdata =>
	scripts}/opbasic/magic_phase.t, {testdata => scripts}/opbasic/qq.t,
	{testdata => scripts}/runtests.pl: Reorganize

2018-05-07  Rocky Bernstein <rocky@cpan.org>

	* : commit c5c6922deeb8a44a07b6da56465222a052b4d48b Author: Rocky
	Bernstein <rocky@cpan.org> Date:   Mon May 7 19:04:27 2018 -0400

2018-05-07  Rocky Bernstein <rocky@cpan.org>

ChangeLog  view on Meta::CPAN

	* .travis.yml, testdata/Makefile: CI Administrivia

2018-05-07  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Node.pm: Remove debuging schmutz again.

2018-05-07  Rocky Bernstein <rocky@cpan.org>

	* MANIFEST, README.md, lib/B/DeparseTree/Common.pm,
	lib/B/DeparseTree/Node.pm, lib/B/DeparseTree/PP.pm,
	testdata/Makefile, testdata/README.md, testdata/frag.pl: Fix full
	file deparsing ("compile") and document

2018-05-07  Rocky Bernstein <rocky@cpan.org>

	* MANIFEST, lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/P522.pm, lib/B/DeparseTree/P524.pm,
	lib/B/DeparseTree/P526.pm, lib/B/DeparseTree/P526c.pm,
	t/testdata/P522-short.pm, t/testdata/P524-short.pm: More DRY +
	Administivia

ChangeLog  view on Meta::CPAN


2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/P522.pm, t/20-core-522.t,
	t/20-deparse-522-small.t, t/20-deparse-522.t,
	t/testdata/P522-short.pm, testdata/.gitignore,
	testdata/bug-sample.pm: Reinstate tests

2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Fragment.pm: Add Alternate underline fragment
	method

2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Fragment.pm: Fragment separator needed is parent
	separator

2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P524.pm,
	lib/B/DeparseTree/P526.pm: Sync

2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/P522.pm: Misc
	fragment fixes

2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P524.pm,
	lib/B/DeparseTree/P526.pm, lib/B/DeparseTree/PP.pm,
	t/testdata/bug.pm: Sync a bit more

2018-05-06  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/Fragment.pm,
	lib/B/DeparseTree/Node.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/P522.pm, lib/B/DeparseTree/PP.pm,
	t/20-core-522.t, t/20-deparse-522-small.t, t/20-deparse-522.t: WIP -
	fragment handling

2018-05-05  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P526.pm,
	lib/B/DeparseTree/P526c.pm: Sync 5.22 changes somewhat

2018-05-05  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/Fragment.pm,
	lib/B/DeparseTree/P522.pm, lib/B/DeparseTree/PP.pm,
	t/20-core-522.t, t/testdata/bug.pm, testdata/frag.pl: WIP: start
	fragment/parent correspondences

2018-05-04  Rocky Bernstein <rocky@cpan.org>

	* lib/B/DeparseTree/Common.pm, lib/B/DeparseTree/Fragment.pm,
	lib/B/DeparseTree/Node.pm, lib/B/DeparseTree/P520.pm,
	lib/B/DeparseTree/P522.pm, t/20-deparse-522-small.t: WIP: Record
	more info in fragment...  Start a separate module for this.

2018-05-02  rocky <rb@dustyfeet.com>

	* lib/B/DeparseTree/P520.pm, lib/B/DeparseTree/P522.pm,
	lib/B/DeparseTree/P524.pm, lib/B/DeparseTree/P526.pm,
	lib/B/DeparseTree/P526c.pm: Fix Bug introduced in recording child
	position

2018-05-02  rocky <rb@dustyfeet.com>

MANIFEST  view on Meta::CPAN

lib/B/DeparseTree/Printer.pm
lib/B/DeparseTree/SyntaxTree.pm
lib/B/DeparseTree/TreeMain.pm
lib/B/DeparseTree/TreeNode.pm
scripts/Makefile
scripts/README.md
scripts/benchtests.pl
scripts/bug-sample.pm
scripts/deparse.sh
scripts/fib.pl
scripts/frag.pl
t/04-baseops.t
t/04-indirops.t
t/04-mapops.t
t/05-listops.t
t/05-unops.t
t/10-core.t
t/20-deparse-526c.t
t/20-deparse-small.t
t/helper.pm
t/roundtrip/5.014/base/cond.t

MANIFEST  view on Meta::CPAN

t/testdata/indirops.pm
t/testdata/listops.pm
t/testdata/mapops.pm
t/testdata/small.pm
t/testdata/subst.pm
t/testdata/unops.pm
t/unit/01-test-pod.t
t/unit/02-node.t
t/unit/03-ppfns.t
t/unit/03-treemain.t
t/unit/04-fragment.t
t/unit/05-load.t

Makefile.PL
SIGNATURE    Added here by Module::Build

NEWS  view on Meta::CPAN


Major revision after the previous major revision...

- Revise namespace and OO heirarchy, which facilitated...
- A lot of code moved into common areas (more work is needed)
- Use B::Deparse routines more pervasively when possible
- Improve testing regime
  - roundtip testing
  - more unit testing
  - write out Perl test failures to a file
- Improve node tagging for fragment use
- Numerous bug fixes

3.1.0 2018 05 19 Rocket Scientist

Add template formatting mechanism use that many places. (More work is
needed though.

Go over mechanism for marking child/parent text.

DRY code a more and expand tests, but  more refactoring, DRY, and more tests are

README.md  view on Meta::CPAN

[![Build Status](https://travis-ci.org/rocky/p5-B-DeparseTree.png)](https://travis-ci.org/rocky/p5-B-DeparseTree)

Synopsis
--------

Perl's B::Deparse but we save abstract tree information and associate
that with Perl text fragments.  These are fragments accessible by OP
address. With this, you can determine get exactly where you inside Perl in
a program with granularity finer that at a line number boundary.

Uses for this could be in stack trace routines like _Carp_. It is used
in the [deparse](https://metacpan.org/pod/Devel::Trepan::Deparse)
command extension to
[Devel::Trepan](https://metacpan.org/pod/Devel::Trepan).

Example
-------

SIGNATURE  view on Meta::CPAN

SHA1 427ccc85398a70210a338cd52865c7951eb108e3 lib/B/DeparseTree/Printer.pm
SHA1 47da6724390d498db5d173a8d6d9f415a56345c9 lib/B/DeparseTree/SyntaxTree.pm
SHA1 cbfb2dcb562d25233148d841b6d014844904691f lib/B/DeparseTree/TreeMain.pm
SHA1 8cc0c268c0aa45fef7da45b84f56d7e5cd0282e9 lib/B/DeparseTree/TreeNode.pm
SHA1 a45870a8a350f38fbb6959b4db62317d3b2a2bb0 scripts/Makefile
SHA1 fe34a77c511e9e92ca70a23c0768348f6ee9f121 scripts/README.md
SHA1 70a7b2faaec126c100f83692f3df434591d0ba69 scripts/benchtests.pl
SHA1 8c8b02fc1fff96dec723f2d407c32d8d75640f39 scripts/bug-sample.pm
SHA1 3057ad0f1fe1324cd7a3327aae1c37f2bf76a127 scripts/deparse.sh
SHA1 aa39a9798cec0f2db4ab28c490b0dfbc2b1148ca scripts/fib.pl
SHA1 63ccd35794e80e3333fc6dea1ceff578d7d22540 scripts/frag.pl
SHA1 71b6a984b990d3163c1fb97eabb3167a0f3ef25f t/04-baseops.t
SHA1 1f37ca15a2812a98ba1040a5d68667f949626e79 t/04-indirops.t
SHA1 6f1509149289da16ce866fab3f6c0126fa5074e2 t/04-mapops.t
SHA1 cc3a883999b6a7c70b56ff355b7c49f0de33fb28 t/05-listops.t
SHA1 065638ff1beecc3af3bb63e4c73fa0afb70ba1e6 t/05-unops.t
SHA1 3073eb5153266a02a75cb09aea06ae3c223a75b1 t/10-core.t
SHA1 ff3567076ae30b181d120662ff8f5c57e0fa9e36 t/20-deparse-526c.t
SHA1 59e169038ae6627f6d80c4e79080272480f09c66 t/20-deparse-small.t
SHA1 a177b85cea342478241487e4622e69ccd4bda623 t/helper.pm
SHA1 ea65bdf23e169973a040a42e8aec6342afe55217 t/roundtrip/5.014/base/cond.t

SIGNATURE  view on Meta::CPAN

SHA1 82277c20c97128e33f3bfaefe6a7960987c79960 t/testdata/indirops.pm
SHA1 7e538b0c036aa2f511a87a5c5935e2e882e2752e t/testdata/listops.pm
SHA1 ffb8b63ae65639ba40eb961a7084b17b9d14ec0c t/testdata/mapops.pm
SHA1 a4aea19689c9ff9fc708dc487d89f613bb6f2d6c t/testdata/small.pm
SHA1 a14094a9f6cafd2ee8667191b3feb27f0e7ba002 t/testdata/subst.pm
SHA1 d1cccb77f9ecfbf5b016af973e38841dd8a15a51 t/testdata/unops.pm
SHA1 8df64e1b9bafe4e4b795fe69ffbc74a82e69a5d0 t/unit/01-test-pod.t
SHA1 2b8f578c592b4921b5cbb3086bd489cdad6d1c38 t/unit/02-node.t
SHA1 17cae979595172797d1dd7bd2f344ef44bc56faf t/unit/03-ppfns.t
SHA1 188bb91a1f05c2130f77eebf325bd1c6239d75dc t/unit/03-treemain.t
SHA1 6b7559435defb6db081e870fb7e6adf90c6ebc7f t/unit/04-fragment.t
SHA1 85370074ebc28c5bede6192ec64bcd0de4ab8cdf t/unit/05-load.t
-----BEGIN PGP SIGNATURE-----

iF0EARECAB0WIQTapjvCWCA0oCuSPVIajeUAgnXsIQUCW0tdlAAKCRAajeUAgnXs
ISihAJ9hK6i6B11YfUre0Lf4ALmjTlEWCQCfVWwibiovZf6DUqciRbrgToNPU4g=
=QN6v
-----END PGP SIGNATURE-----

doc/notes.md  view on Meta::CPAN


## Round trip tests

I have ameliorated somewhat of the difficulty in figuring out what
went wrong when a test fails by improving the error message and
writing out the test. However, there still is the problem that the
tests are frail, even though a regular expression is used in
comparison. We have this conundrum: if you want something that a
person can easily detect difference you would compare using a string
or a very simple regular expressions. But as you move to making tests
less fragile and less subject to the whim of how `B::Deparse` format
Perls, you move onto more complicated regular expressions. But this is
harder to suss when there is a difference. So how do we do better?

We can avoid all of the frailty associated comparisons or pattern
matching by doing round trip testing. In the Perl source code
distribution there already are a number of Perl programs that check
themselves when run. These are in Perl's `t` directory. Some files in
that are `t/base/cond.t`, or `t/base.if.t`.

So all that is needed is have `B::Deparse` compile and decompile these

doc/notes.md  view on Meta::CPAN

name "egrent" got converted to "endgrent" which didn't happen in other
shown entries?

Having mappings from PP opcode to function makes it easier to
customize the entries as required as the Perl version varies.  In some
versions, some ops we need to surround an the text from an operation
with a "my", while in other versions that is not the case. It is
clearer and simpler just to change table entries than it is to muck
with OO lookup or doing subroutine assignments.

# Format-spec driven fragment creation

How `B::Deparse` works is conceptually simple: it walks the optree
building and combining string fragments at node from the nodes'
children. When you return from root or top node after walking the
tree, you have a string representing the entire function or module that
the root represents.

However understanding what goes on inside a given node, is very
haphazard. So if you have a bug somewhere, figuring out where there
was a problem and why is difficult.

This kind of thing you may have already encountered in a different
guise, and a good solution to that problem applies here. Imagine you
are trying to create a nicely formatted report with lots of data
values. You can try combining strings together interspersed with calls
to conversion routines to different data items.

But instead what most people do is use some sort of format specifiers
so that in a template you get a sense of what's going on, and then
just fill in the values. And that's a good solution here.

# Swapping out Node and Syntax tree for String-oriented routines.

The focus of code right now has been for handling this new fragment
deparsing feature. However I believe `B::DeparseTree` would be a good
replacement for `B::Deparse` because of its modularity, and ease with
which you can see what's going on.  The template specifiers assists
separation in traversing code from building string.

lib/B/DeparseTree.pod  view on Meta::CPAN

    return $a < 0 ? -$a : $a
           -----------------
    12: ==================================================
    ....

The subroutine C<extract_node_info> is what produces the text with its underline.

=head2 Description

Perl's L<B::Deparse> but we save abstract tree information and associate
that with Perl text fragments.  These are fragments accessible by OP
address. With this, in Perl you can determine more precisely where you in
a program with granularity finer that at a line number boundary.

Uses for this could be in stack trace routines like L<Carp>. It is used
in the L<deparse |https://metacpan.org/pod/Devel::Trepan::Deparse>
command extension to L<Devel::Trepan>.

=head2 See also:

=over  4

scripts/README.md  view on Meta::CPAN

# Standalone testing programs

Here we have some more standalone tests to assist in deparsing.

## frag.pl

`frag.pl` shows information about all B::DeparseTree nodes so you can check that the tree is build properly and what source-code fragments would be associated with each node.

If you pass an argument is it assumed to be a path to a Perl module
relative to this directory.  The default file is `bug.pm`. That module
is assumed to have a subroutine called "bug" which is then decompiled
after the module file. it is `required`.

To start you off, you can copy `bug-sample.pm` to `bug.pm` and modify from there.

## deparse.sh

scripts/frag.pl  view on Meta::CPAN


# Change this or comment it out
# use B::DeparseTree::P522;

use File::Basename qw(dirname basename); use File::Spec;
use strict; use warnings;

use constant data_dir => File::Spec->catfile(dirname(__FILE__));

use Getopt::Long;
my ($show_tree, $show_orig, $show_fragments) = (0, 1, 0);
GetOptions ("tree|t" => \$show_tree,
	    "frag|f" => \$show_fragments,
	    "orig|o" => \$show_orig)
    or die("Error in command line arguments\n");

my $short_name = $ARGV[0] || 'bug.pm';
my $test_data = File::Spec->catfile(data_dir, $short_name);
require $test_data;


my $deparse_tree = B::DeparseTree->new();
my $deparse_orig = B::Deparse->new();

scripts/frag.pl  view on Meta::CPAN

    print '-' x 50, "\n";
}

my $tree_text = $deparse_tree->coderef2text(\&bug);
if ($tree_text eq $orig_text) {
    print "Same as above\n";
} else {
    print $tree_text, "\n";
}

if ($show_fragments) {
    B::DeparseTree::Fragment::dump($deparse_tree);
}

if ($show_tree) {
    my $svref = B::svref_2object(\&bug);
    my $x =  $deparse_tree->deparse_sub($svref);
    B::DeparseTree::Fragment::dump_tree($deparse_tree, $x);
}



( run in 1.526 second using v1.01-cache-2.11-cpan-364913b4093 )