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 +*