Implement handling of state variables in list assignment
[p5sagit/p5-mst-13.2.git] / ext / B / B / Disassembler.pm
index b8b5262..e1993aa 100644 (file)
@@ -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 {