@@ -281,12 +281,6 @@ impl<'a> BinaryReader<'a> {
281
281
} )
282
282
}
283
283
284
- fn read_first_byte_and_var_u32 ( & mut self ) -> Result < ( u8 , u32 ) > {
285
- let pos = self . position ;
286
- let val = self . read_var_u32 ( ) ?;
287
- Ok ( ( self . buffer [ pos] , val) )
288
- }
289
-
290
284
fn read_memarg ( & mut self , max_align : u8 ) -> Result < MemArg > {
291
285
let flags_pos = self . original_position ( ) ;
292
286
let mut flags = self . read_var_u32 ( ) ?;
@@ -833,8 +827,8 @@ impl<'a> BinaryReader<'a> {
833
827
0x10 => visitor. visit_call ( self . read_var_u32 ( ) ?) ,
834
828
0x11 => {
835
829
let index = self . read_var_u32 ( ) ?;
836
- let ( table_byte , table_index ) = self . read_first_byte_and_var_u32 ( ) ?;
837
- visitor. visit_call_indirect ( index, table_index , table_byte )
830
+ let table = self . read_table_index_or_zero_if_not_reference_types ( ) ?;
831
+ visitor. visit_call_indirect ( index, table )
838
832
}
839
833
0x12 => visitor. visit_return_call ( self . read_var_u32 ( ) ?) ,
840
834
0x13 => visitor. visit_return_call_indirect ( self . read_var_u32 ( ) ?, self . read_var_u32 ( ) ?) ,
@@ -888,12 +882,12 @@ impl<'a> BinaryReader<'a> {
888
882
0x3d => visitor. visit_i64_store16 ( self . read_memarg ( 1 ) ?) ,
889
883
0x3e => visitor. visit_i64_store32 ( self . read_memarg ( 2 ) ?) ,
890
884
0x3f => {
891
- let ( mem_byte , mem) = self . read_first_byte_and_var_u32 ( ) ?;
892
- visitor. visit_memory_size ( mem, mem_byte )
885
+ let mem = self . read_memory_index_or_zero_if_not_multi_memory ( ) ?;
886
+ visitor. visit_memory_size ( mem)
893
887
}
894
888
0x40 => {
895
- let ( mem_byte , mem) = self . read_first_byte_and_var_u32 ( ) ?;
896
- visitor. visit_memory_grow ( mem, mem_byte )
889
+ let mem = self . read_memory_index_or_zero_if_not_multi_memory ( ) ?;
890
+ visitor. visit_memory_grow ( mem)
897
891
}
898
892
899
893
0x41 => visitor. visit_i32_const ( self . read_var_i32 ( ) ?) ,
@@ -1754,6 +1748,32 @@ impl<'a> BinaryReader<'a> {
1754
1748
}
1755
1749
}
1756
1750
}
1751
+
1752
+ fn read_memory_index_or_zero_if_not_multi_memory ( & mut self ) -> Result < u32 > {
1753
+ if self . features . multi_memory ( ) {
1754
+ self . read_var_u32 ( )
1755
+ } else {
1756
+ // Before bulk memory this byte was required to be a single zero
1757
+ // byte, not a LEB-encoded zero, so require a precise zero byte.
1758
+ match self . read_u8 ( ) ? {
1759
+ 0 => Ok ( 0 ) ,
1760
+ _ => bail ! ( self . original_position( ) - 1 , "zero byte expected" ) ,
1761
+ }
1762
+ }
1763
+ }
1764
+
1765
+ fn read_table_index_or_zero_if_not_reference_types ( & mut self ) -> Result < u32 > {
1766
+ if self . features . reference_types ( ) {
1767
+ self . read_var_u32 ( )
1768
+ } else {
1769
+ // Before reference types this byte was required to be a single zero
1770
+ // byte, not a LEB-encoded zero, so require a precise zero byte.
1771
+ match self . read_u8 ( ) ? {
1772
+ 0 => Ok ( 0 ) ,
1773
+ _ => bail ! ( self . original_position( ) - 1 , "zero byte expected" ) ,
1774
+ }
1775
+ }
1776
+ }
1757
1777
}
1758
1778
1759
1779
impl < ' a > BrTable < ' a > {
0 commit comments