B-DeparseTree
view release on metacpan or search on metacpan
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>
* 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
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>
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
* 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
* 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
* 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,
* 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,
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>
* .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
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>
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
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
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
[](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
-------
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
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 )