@@ -64,13 +64,13 @@ impl<'store, 'stack> Executor<'store, 'stack> {
6464 }
6565
6666 #[ inline( always) ]
67- pub ( crate ) fn exec_next ( & mut self ) -> Result < ControlFlow < ( ) > > {
67+ fn exec_next ( & mut self ) -> Result < ControlFlow < ( ) > > {
6868 use tinywasm_types:: Instruction :: * ;
6969 match self . cf . fetch_instr ( ) {
70- Nop => cold ( ) ,
70+ Nop => self . exec_noop ( ) ,
7171 Unreachable => self . exec_unreachable ( ) ?,
7272
73- Drop => self . stack . values . pop ( ) . map ( |_| ( ) ) ?,
73+ Drop => self . exec_drop ( ) ?,
7474 Select ( _valtype) => self . exec_select ( ) ?,
7575
7676 Call ( v) => return self . exec_call_direct ( * v) ,
@@ -80,7 +80,7 @@ impl<'store, 'stack> Executor<'store, 'stack> {
8080 Else ( end_offset) => self . exec_else ( * end_offset) ?,
8181 Loop ( args, end) => self . enter_block ( self . cf . instr_ptr , * end, BlockType :: Loop , * args) ,
8282 Block ( args, end) => self . enter_block ( self . cf . instr_ptr , * end, BlockType :: Block , * args) ,
83- Br ( v) => break_to ! ( * v, self ) ,
83+ Br ( v) => return self . exec_br ( * v) ,
8484 BrIf ( v) => return self . exec_br_if ( * v) ,
8585 BrTable ( default, len) => return self . exec_brtable ( * default, * len) ,
8686 Return => return self . exec_return ( ) ,
@@ -310,7 +310,6 @@ impl<'store, 'stack> Executor<'store, 'stack> {
310310 I32StoreLocal { local, const_i32, offset, mem_addr } => {
311311 self . exec_i32_store_local ( * local, * const_i32, * offset, * mem_addr) ?
312312 }
313-
314313 i => {
315314 cold ( ) ;
316315 return Err ( Error :: UnsupportedFeature ( format ! ( "unimplemented instruction: {:?}" , i) ) ) ;
@@ -344,6 +343,13 @@ impl<'store, 'stack> Executor<'store, 'stack> {
344343 Ok ( ( ) )
345344 }
346345
346+ #[ inline( always) ]
347+ fn exec_br ( & mut self , to : u32 ) -> Result < ControlFlow < ( ) > > {
348+ break_to ! ( to, self ) ;
349+ self . cf . instr_ptr += 1 ;
350+ Ok ( ControlFlow :: Continue ( ( ) ) )
351+ }
352+
347353 #[ inline( always) ]
348354 fn exec_br_if ( & mut self , to : u32 ) -> Result < ControlFlow < ( ) > > {
349355 let val: i32 = self . stack . values . pop ( ) ?. into ( ) ;
@@ -396,6 +402,9 @@ impl<'store, 'stack> Executor<'store, 'stack> {
396402 Err ( Error :: Trap ( Trap :: Unreachable ) )
397403 }
398404
405+ #[ inline( always) ]
406+ fn exec_noop ( & self ) { }
407+
399408 #[ inline( always) ]
400409 fn exec_ref_is_null ( & mut self ) -> Result < ( ) > {
401410 self . stack . values . replace_top ( |val| ( ( i32:: from ( val) == -1 ) as i32 ) . into ( ) )
@@ -551,18 +560,24 @@ impl<'store, 'stack> Executor<'store, 'stack> {
551560 let table_idx = self . module . resolve_table_addr ( table_index) ;
552561 let table = self . store . get_table ( table_idx) ?;
553562 let delta: i32 = self . stack . values . pop ( ) ?. into ( ) ;
554- let prev_size = table. borrow ( ) . size ( ) as i32 ;
563+ let prev_size = table. borrow ( ) . size ( ) ;
555564 table. borrow_mut ( ) . grow_to_fit ( ( prev_size + delta) as usize ) ?;
556565 self . stack . values . push ( prev_size. into ( ) ) ;
557566 Ok ( ( ) )
558567 }
559568
560569 #[ inline( always) ]
561- fn exec_table_fill ( & mut self , table_index : u32 ) -> Result < ( ) > {
570+ fn exec_table_fill ( & mut self , _table_index : u32 ) -> Result < ( ) > {
562571 // TODO: implement
563572 Ok ( ( ) )
564573 }
565574
575+ #[ inline( always) ]
576+ fn exec_drop ( & mut self ) -> Result < ( ) > {
577+ self . stack . values . pop ( ) ?;
578+ Ok ( ( ) )
579+ }
580+
566581 #[ inline( always) ]
567582 fn exec_select ( & mut self ) -> Result < ( ) > {
568583 let cond: i32 = self . stack . values . pop ( ) ?. into ( ) ;
@@ -695,7 +710,7 @@ impl<'store, 'stack> Executor<'store, 'stack> {
695710 #[ inline( always) ]
696711 fn exec_call ( & mut self , wasm_func : Rc < WasmFunction > , owner : ModuleInstanceAddr ) -> Result < ControlFlow < ( ) > > {
697712 let params = self . stack . values . pop_n_rev ( wasm_func. ty . params . len ( ) ) ?;
698- let new_call_frame = CallFrame :: new ( wasm_func, owner, params, self . stack . blocks . len ( ) as u32 ) ;
713+ let new_call_frame = CallFrame :: new ( wasm_func, owner, & params, self . stack . blocks . len ( ) as u32 ) ;
699714 self . cf . instr_ptr += 1 ; // skip the call instruction
700715 self . stack . call_stack . push ( core:: mem:: replace ( & mut self . cf , new_call_frame) ) ?;
701716 self . module . swap_with ( self . cf . module_addr , self . store ) ;
0 commit comments