X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FB%2FB%2FDisassembler.pm;h=e1993aa9537b02b7561bf5d37f3387a731429628;hb=461824dcfbc00b3c4e20590f06d6c9881e4a416b;hp=b8b5262f41b64d0cf7d5d40954640d590ec33fbf;hpb=f4abc3e7120c79388800ae3eaccafb9461d38553;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/B/B/Disassembler.pm b/ext/B/B/Disassembler.pm index b8b5262..e1993aa 100644 --- a/ext/B/B/Disassembler.pm +++ b/ext/B/B/Disassembler.pm @@ -4,9 +4,10 @@ # # You may distribute under the terms of either the GNU General Public # License or the Artistic License, as specified in the README file. -package B::Disassembler::BytecodeStream; -our $VERSION = '1.01'; +$B::Disassembler::VERSION = '1.05'; + +package B::Disassembler::BytecodeStream; use FileHandle; use Carp; @@ -56,7 +57,7 @@ sub GET_I32 { my $fh = shift; my $str = $fh->readn(4); croak "reached EOF while reading I32" unless length($str) == 4; - return cast_I32(unpack("L", $str)); + return unpack("l", $str); } sub GET_objindex { @@ -137,20 +138,31 @@ sub GET_none {} sub GET_op_tr_array { my $fh = shift; - my @ary = unpack("S256", $fh->readn(256 * 2)); - return join(",", @ary); + my $len = unpack "S", $fh->readn(2); + my @ary = unpack "S*", $fh->readn($len*2); + return join(",", $len, @ary); } sub GET_IV64 { my $fh = shift; - my ($hi, $lo) = unpack("LL", $fh->readn(8)); - return sprintf("0x%x%08x", $hi, $lo); # cheat + my $str = $fh->readn(8); + croak "reached EOF while reading I32" unless length($str) == 8; + return sprintf "0x%09llx", unpack("q", $str); } sub GET_IV { $Config{ivsize} == 4 ? &GET_I32 : &GET_IV64; } +sub GET_PADOFFSET { + $Config{ptrsize} == 8 ? &GET_IV64 : &GET_U32; +} + +sub GET_long { + $Config{longsize} == 8 ? &GET_IV64 : &GET_U32; +} + + package B::Disassembler; use Exporter; @ISA = qw(Exporter); @@ -160,7 +172,7 @@ use strict; use B::Asmdata qw(%insn_data @insn_name); -our( $magic, $archname, $blversion, $ivsize, $ptrsize, $byteorder ); +our( $magic, $archname, $blversion, $ivsize, $ptrsize ); sub dis_header($){ my( $fh ) = @_; @@ -170,11 +182,10 @@ sub dis_header($){ $blversion = $fh->GET_strconst(); $ivsize = $fh->GET_U32(); $ptrsize = $fh->GET_U32(); - $byteorder = $fh->GET_strconst(); } sub get_header(){ - return( $magic, $archname, $blversion, $ivsize, $ptrsize, $byteorder ); + return( $magic, $archname, $blversion, $ivsize, $ptrsize); } sub disassemble_fh {