B-C
view release on metacpan or search on metacpan
lib/B/Disassembler.pm view on Meta::CPAN
printf "#archflag %d\n", $archflag if defined $archflag;
printf "#perlversion %s\n", $perlversion if $perlversion;
print "\n";
}
while ( defined( $c = $fh->getc ) ) {
$c = ord($c);
$insn = $insn_name[$c];
if ( !defined($insn) || $insn eq "unused" ) {
my $pos = $fh->tell - 1;
warn "Illegal instruction code $c at stream offset $pos.\n";
}
$getmeth = $insn_data{$insn}->[2];
#warn "EOF at $insn $getmeth" if $fh->eof();
$arg = $fh->$getmeth();
if ( defined($arg) ) {
&$out( $insn, $arg, $verbose );
}
else {
&$out( $insn, undef, $verbose );
}
}
}
1;
__END__
=head1 NAME
B::Disassembler - Disassemble Perl bytecode
=head1 SYNOPSIS
use Disassembler qw(print_insn);
my $fh = new FileHandle "<$ARGV[0]";
disassemble_fh($fh, \&print_insn);
=head1 DESCRIPTION
disassemble_fh takes an filehandle with bytecode and a printer function.
The printer function gets three arguments: insn, arg (optional) and the comment.
See F<lib/B/Disassembler.pm> and F<scripts/disassemble>.
=head1 disassemble_fh (filehandle, printer_coderef, [ verbose ])
disassemble_fh takes an filehandle with bytecode and a printer coderef.
Two default printer functions are provided:
print_insn print_insn_bare
=head1 print_insn
Callback function for disassemble_fh, which gets three arguments from
the disassembler. insn (a string), arg (a string or number or undef)
and the comment (an optional string).
This supports the new behaviour in F<scripts/disassemble>. It prints
each insn and optional argument with some additional comments, which
looks similar to B::Assembler with option -S (commented source).
=head1 print_insn_bare
This is the same as the old behaviour of scripts/disassemble. It
prints each insn and optional argument without any comments. Line per
line.
=head1 get_header
Returns the .plc header as array of
( magic, archname, blversion, ivsize, ptrsize,
byteorder, longsize, archflag, perlversion )
in ARRAY context, or in SCALAR context the array from above as named hash.
B<magic> is always "PLBC". "PLJC" is reserved for JIT'ted code also
loaded via ByteLoader.
B<archname> is the archname string and is in the ByteLoader up to 0.06
checked strictly. Starting with ByteLoader 0.06_05 platform
compatibility is implemented by checking the $archflag, and doing
byteorder swapping for same length longsize, and adjusting the ivsize
and ptrsize.
B<blversion> is the ByteLoader version from the header as string.
Up to ByteLoader 0.06 this version must have matched exactly, since 0.07
earlier ByteLoader versions are also accepted in the ByteLoader.
B<ivsize> matches $Config{ivsize} of the assembling perl.
A number, 4 or 8 only supported.
B<ptrsize> matches $Config{ptrsize} of the assembling perl.
A number, 4 or 8 only supported.
B<longsize> is $Config{longsize} of the assembling perl.
A number, 4 or 8.
Only since blversion 0.06_03.
B<byteorder> is a string of "0x12345678" on big-endian or "0x78563412" (?)
on little-endian machines. The beginning "0x" is stripped for compatibility
with intermediate ByteLoader versions, i.e. 5.6.1 to 5.8.0,
Added with blversion 0.06_03, and also with blversion 0.04.
See L<BcVersions>
B<archflag> is a bitmask of opcode platform-dependencies.
Currently used:
bit 1 for USE_ITHREADS
bit 2 for MULTIPLICITY
Added with blversion 0.06_05.
B<perlversion> $] of the perl which produced this bytecode as string.
Added with blversion 0.06_06.
=head1 AUTHORS
Malcolm Beattie C<MICB at cpan.org> I<(retired)>,
Reini Urban C<perl-compiler@googlegroups.com> since 2008.
=cut
( run in 0.609 second using v1.01-cache-2.11-cpan-39bf76dae61 )