@@ -281,12 +281,6 @@ impl<'a> BinaryReader<'a> {
281281 } )
282282 }
283283
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-
290284 fn read_memarg ( & mut self , max_align : u8 ) -> Result < MemArg > {
291285 let flags_pos = self . original_position ( ) ;
292286 let mut flags = self . read_var_u32 ( ) ?;
@@ -833,8 +827,8 @@ impl<'a> BinaryReader<'a> {
833827 0x10 => visitor. visit_call ( self . read_var_u32 ( ) ?) ,
834828 0x11 => {
835829 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 )
838832 }
839833 0x12 => visitor. visit_return_call ( self . read_var_u32 ( ) ?) ,
840834 0x13 => visitor. visit_return_call_indirect ( self . read_var_u32 ( ) ?, self . read_var_u32 ( ) ?) ,
@@ -888,12 +882,12 @@ impl<'a> BinaryReader<'a> {
888882 0x3d => visitor. visit_i64_store16 ( self . read_memarg ( 1 ) ?) ,
889883 0x3e => visitor. visit_i64_store32 ( self . read_memarg ( 2 ) ?) ,
890884 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)
893887 }
894888 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)
897891 }
898892
899893 0x41 => visitor. visit_i32_const ( self . read_var_i32 ( ) ?) ,
@@ -1754,6 +1748,32 @@ impl<'a> BinaryReader<'a> {
17541748 }
17551749 }
17561750 }
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+ }
17571777}
17581778
17591779impl < ' a > BrTable < ' a > {
0 commit comments