@@ -456,23 +456,31 @@ impl<'a> DisassemblerX64<'a> {
456456
457457 // -- Read helpers --
458458 fn peek ( & self ) -> u8 {
459- self . code [ self . pos ]
459+ if self . pos < self . code . len ( ) {
460+ self . code [ self . pos ]
461+ } else {
462+ 0
463+ }
460464 }
461465
462466 fn read_u8 ( & mut self ) -> u8 {
463- let v = self . code [ self . pos ] ;
464- self . pos += 1 ;
465- v
467+ if self . pos < self . code . len ( ) {
468+ let v = self . code [ self . pos ] ;
469+ self . pos += 1 ;
470+ v
471+ } else {
472+ self . pos += 1 ;
473+ 0
474+ }
466475 }
467476
468477 fn read_i8 ( & mut self ) -> i8 {
469478 self . read_u8 ( ) as i8
470479 }
471480
472481 fn read_u16_le ( & mut self ) -> u16 {
473- let lo = self . code [ self . pos ] as u16 ;
474- let hi = self . code [ self . pos + 1 ] as u16 ;
475- self . pos += 2 ;
482+ let lo = self . read_u8 ( ) as u16 ;
483+ let hi = self . read_u8 ( ) as u16 ;
476484 lo | ( hi << 8 )
477485 }
478486
@@ -481,19 +489,21 @@ impl<'a> DisassemblerX64<'a> {
481489 }
482490
483491 fn read_u32_le ( & mut self ) -> u32 {
484- let b = & self . code [ self . pos ..self . pos + 4 ] ;
485- self . pos += 4 ;
486- u32:: from_le_bytes ( [ b[ 0 ] , b[ 1 ] , b[ 2 ] , b[ 3 ] ] )
492+ let b0 = self . read_u8 ( ) as u32 ;
493+ let b1 = self . read_u8 ( ) as u32 ;
494+ let b2 = self . read_u8 ( ) as u32 ;
495+ let b3 = self . read_u8 ( ) as u32 ;
496+ b0 | ( b1 << 8 ) | ( b2 << 16 ) | ( b3 << 24 )
487497 }
488498
489499 fn read_i32_le ( & mut self ) -> i32 {
490500 self . read_u32_le ( ) as i32
491501 }
492502
493503 fn read_i64_le ( & mut self ) -> i64 {
494- let b = & self . code [ self . pos .. self . pos + 8 ] ;
495- self . pos += 8 ;
496- i64 :: from_le_bytes ( [ b [ 0 ] , b [ 1 ] , b [ 2 ] , b [ 3 ] , b [ 4 ] , b [ 5 ] , b [ 6 ] , b [ 7 ] ] )
504+ let lo = self . read_u32_le ( ) as u64 ;
505+ let hi = self . read_u32_le ( ) as u64 ;
506+ ( lo | ( hi << 32 ) ) as i64
497507 }
498508
499509 fn peek_i8_at ( & self , offset : usize ) -> i8 {
0 commit comments