# New Ticket Created by  Geoffrey Broadwell 
# Please include the string:  [perl #54148]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=54148 >


The attached patch adds the new utility script tools/util/dump-pbc.pl,
which produces a (mostly) easy to read weave of PBC disassembly and PIR
source (from possibly multiple files).  It also enables compile of the
'disassemble' program in the Makefile.  (All of the structure was there,
it just wasn't enabled.)


-'f

=== MANIFEST
==================================================================
--- MANIFEST	(revision 5166)
+++ MANIFEST	(local)
@@ -3705,6 +3705,7 @@
 tools/docs/write_docs.pl                                    [devel]
 tools/install/smoke.pl                                      []
 tools/util/crow.pir                                         []
+tools/util/dump-pbc.pl                                      []
 tools/util/gen_release_info.pl                              []
 tools/util/ncidef2pasm.pl                                   []
 tools/util/perltidy.conf                                    []
=== config/gen/makefiles/root.in
==================================================================
--- config/gen/makefiles/root.in	(revision 5166)
+++ config/gen/makefiles/root.in	(local)
@@ -585,6 +585,7 @@
     dynoplibs \
     compilers \
     $(PBC_TO_EXE) \
+    $(DIS) \
     $(PBCMERGE)
 
 $(GEN_LIBRARY) : $(PARROT)
=== tools/util/dump-pbc.pl
==================================================================
--- tools/util/dump-pbc.pl	(revision 5166)
+++ tools/util/dump-pbc.pl	(local)
@@ -0,0 +1,105 @@
+#! perl
+
+# Copyright (C) 2008, The Perl Foundation.
+# $Id: $
+
+=head1 NAME
+
+tools/util/dump-pbc.pl - Weave together PBC disassembly with PIR source
+
+=head1 SYNOPSIS
+
+ perl tools/util/dump-pbc.pl foo.pbc
+
+=head1 DESCRIPTION
+
+dump-pbc.pl uses Parrot's F<disassemble> program to disassemble the opcodes
+in a PBC (Parrot ByteCode) file, then weaves the disassembly together with
+the original PIR source file(s).  This makes it easier to see how the PIR
+syntactic sugar is desugared into raw Parrot opcodes.
+
+=head1 BUGS
+
+This program has only been tested for a few simple cases.  Also, the name
+might suggest a different use than its actual purpose.
+
+While it is not a bug in F<dump-pbc.pl> per se, there is a line numbering
+bug for some PBC opcode sequences that will result in the disassembled
+opcodes appearing just before the source lines they represent, rather
+than just after.  There does not appear to be consensus yet about where
+this bug actually resides.
+
+=cut
+
+use strict;
+use warnings;
+use Cwd;
+use FindBin;
+
+my $PARROT_ROOT  = Cwd::abs_path("$FindBin::Bin/../..");
+my $RUNTIME_DIR  = "$PARROT_ROOT/runtime/parrot";
+my $DISASSEMBLER = "$PARROT_ROOT/disassemble";
+
+go(@ARGV);
+
+sub go {
+    my $pbc = shift;
+
+    open my $dis, '-|', $DISASSEMBLER, $pbc
+        or die   "Could not start disassembler '$DISASSEMBLER': $!";
+
+    my $cur_file = '';
+    my $cur_line = -1;
+    my %cache;
+
+    while (<$dis>) {
+        if    (/^Current Source Filename (.*)/) {
+            if ($cur_file ne $1) {
+                $cur_file           = $1;
+                $cache{$cur_file} ||= slurp_file($cur_file);
+                $cur_line           = -1;
+
+                print "\n#### $cur_file\n";
+            }
+        }
+        elsif (my ($info, $seq, $pc, $line, $code) = /^((\d+)-(\d+) (\d+): )(.*)/) {
+            my $int_line = int    $line;
+            my $len_line = length $line;
+            if ($cur_line != $int_line) {
+                $cur_line = 0 if $cur_line == -1;
+                print "\n";
+                foreach my $i ($cur_line + 1 .. $int_line) {
+                    my $source_code = $cache{$cur_file}[$i-1];
+                    # next    unless $source_code =~ /\S/;
+                    printf "# %*d:   %s", $len_line, $i, $source_code;
+                    print  "\n" if $source_code =~ /^\.end/;
+                }
+                $cur_line  = $int_line;
+            }
+
+            print ' ' x ($len_line + 4), "$code\n";
+        }
+    }
+}
+
+sub slurp_file {
+    my $file = shift;
+    my $source;
+
+       open $source, '<', $file
+    or open $source, '<', "$PARROT_ROOT/$file"
+    or open $source, '<', "$RUNTIME_DIR/$file"
+    or die "Could not open source file '$file': $!";
+
+    my @lines = <$source>;
+
+    return [EMAIL PROTECTED];
+}
+
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Property changes on: tools/util/dump-pbc.pl
___________________________________________________________________
Name: svn:executable
 +*

Reply via email to