On Wed, 2008-05-14 at 07:50 -0700, Will Coleda via RT wrote:
> Nifty!
>
> Minor nits:
>
> - can we use _ instead of - in the filename?
> - can we make the error message more graceful if the disassemble
> executable hasn't been built?
> - it's not always going to be called "disassemble" - you'll need to
> poke into Parrot::Config and pull out the executable suffix and use
> that. (Might be disassemble.exe on windows, for example).
I believe the attached patch addresses all of these nits, and also adds
the matching CREDITS diff that I had forgotten to include last time.
-'f
=== CREDITS
==================================================================
--- CREDITS (revision 5166)
+++ CREDITS (local)
@@ -257,7 +257,8 @@
N: Geoff Broadwell
D: OpenGL binding
-D: examples fixes
+D: Disassembly/source weaver
+D: Miscellaneous fixes
N: Gerard Goossen
D: Documentation patch for Parrot_PMC_get_pointer_intkey()
=== 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,112 @@
+#! 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, $RUNTIME_DIR);
+BEGIN {
+ $PARROT_ROOT = Cwd::abs_path("$FindBin::Bin/../..");
+ $RUNTIME_DIR = "$PARROT_ROOT/runtime/parrot";
+}
+
+use lib "$PARROT_ROOT/lib";
+use Parrot::Config '%PConfig';
+
+my $DISASSEMBLER = "$PConfig{build_dir}$PConfig{slash}disassemble$PConfig{exe}";
+
+go(@ARGV);
+
+sub go {
+ my $pbc = shift;
+
+ open my $dis, '-|', $DISASSEMBLER, $pbc
+ or die "Could not start disassembler, did you remember to make parrot first?\n";
+
+ 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
+*