@@ -49,10 +49,7 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
4949
5050 #[ inline( always) ]
5151 fn exec < const ITERATIONS : usize > ( & mut self ) -> Result < Option < ( ) > > {
52- for _ in 0 ..ITERATIONS {
53- use tinywasm_types:: Instruction :: * ;
54-
55- macro_rules! stack_op {
52+ macro_rules! stack_op {
5653 ( simd_unary $method: ident) => { stack_op!( unary Value128 , |v| v. $method( ) ) } ;
5754 ( simd_binary $method: ident) => { stack_op!( binary Value128 , |a, b| a. $method( b) ) } ;
5855 ( unary $ty: ty, |$v: ident| $expr: expr) => { self . store. stack. values. unary:: <$ty>( |$v| Ok ( $expr) ) ? } ;
@@ -73,6 +70,9 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
7370 } } ;
7471 }
7572
73+ for _ in 0 ..ITERATIONS {
74+ use tinywasm_types:: Instruction :: * ;
75+
7676 let next = match self . func . instructions . 0 . get ( self . cf . instr_ptr as usize ) {
7777 Some ( instr) => instr,
7878 None => unreachable ! (
@@ -164,9 +164,7 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
164164 let mem = self . store . state . get_mem_mut ( self . module . resolve_mem_addr ( m. mem_addr ( ) ) ) ;
165165 let addr = u64:: from ( self . store . stack . values . local_get :: < u32 > ( & self . cf , * addr_local) ) ;
166166 let value = self . store . stack . values . local_get :: < u32 > ( & self . cf , * value_local) . to_mem_bytes ( ) ;
167- if let Err ( e) = mem. store ( ( m. offset ( ) + addr) as usize , value. len ( ) , & value) {
168- return Err ( e) ;
169- }
167+ mem. store ( ( m. offset ( ) + addr) as usize , value. len ( ) , & value) ?;
170168 }
171169 I32LoadLocalTee ( m, addr_local, dst_local) => {
172170 let mem = self . store . state . get_mem ( self . module . resolve_mem_addr ( m. mem_addr ( ) ) ) ;
@@ -677,24 +675,15 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
677675 self . store . stack . values . truncate_keep_counts ( self . cf . locals_base , wasm_func. params ) ;
678676 }
679677
680- let ( locals_base, _stack_base, stack_offset) =
681- match self . store . stack . values . enter_locals ( wasm_func. params , wasm_func. locals ) {
682- Ok ( v) => v,
683- Err ( Error :: Trap ( Trap :: ValueStackOverflow ) ) if !IS_RETURN_CALL => {
684- return Err ( Trap :: CallStackOverflow . into ( ) ) ;
685- }
686- Err ( err) => return Err ( err) ,
687- } ;
688-
689- let new_call_frame = CallFrame :: new ( func_addr, owner, locals_base, stack_offset) ;
678+ let res = self . store . stack . values . enter_locals ( & wasm_func. params , & wasm_func. locals ) ;
679+ let locals_base = res. map_err ( |err| if IS_RETURN_CALL { err } else { Error :: Trap ( Trap :: CallStackOverflow ) } ) ?;
680+ let new_call_frame = CallFrame :: new ( func_addr, owner, locals_base, wasm_func. locals ) ;
690681
691- if IS_RETURN_CALL {
692- self . cf = new_call_frame;
693- } else {
682+ if !IS_RETURN_CALL {
694683 self . cf . incr_instr_ptr ( ) ; // skip the call instruction
695684 self . store . stack . call_stack . push ( self . cf ) ?;
696- self . cf = new_call_frame;
697685 }
686+ self . cf = new_call_frame;
698687
699688 if self . cf . module_addr != self . module . idx {
700689 self . module = self . store . get_module_instance_raw ( self . cf . module_addr ) . clone ( ) ;
@@ -730,24 +719,15 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
730719 self . store . stack . values . truncate_keep_counts ( self . cf . locals_base , params) ;
731720 }
732721
733- let ( locals_base, _stack_base, stack_offset) = match self . store . stack . values . enter_locals ( params, locals) {
734- Ok ( v) => v,
735- Err ( Error :: Trap ( Trap :: ValueStackOverflow ) ) if !IS_RETURN_CALL => {
736- return Err ( Trap :: CallStackOverflow . into ( ) ) ;
737- }
738- Err ( err) => return Err ( err) ,
739- } ;
740-
741- let new_call_frame = CallFrame :: new ( self . cf . func_addr , self . cf . module_addr , locals_base, stack_offset) ;
722+ let res = self . store . stack . values . enter_locals ( & params, & locals) ;
723+ let locals_base = res. map_err ( |err| if IS_RETURN_CALL { err } else { Error :: Trap ( Trap :: CallStackOverflow ) } ) ?;
724+ let new_call_frame = CallFrame :: new ( self . cf . func_addr , self . cf . module_addr , locals_base, locals) ;
742725
743- if IS_RETURN_CALL {
744- self . cf = new_call_frame;
745- } else {
726+ if !IS_RETURN_CALL {
746727 self . cf . incr_instr_ptr ( ) ;
747728 self . store . stack . call_stack . push ( self . cf ) ?;
748- self . cf = new_call_frame;
749729 }
750-
730+ self . cf = new_call_frame ;
751731 Ok ( ( ) )
752732 }
753733
@@ -987,9 +967,7 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
987967 false => self . store . stack . values . pop :: < i32 > ( ) as u32 as u64 ,
988968 } ;
989969
990- if let Err ( e) = mem. store ( ( offset + addr) as usize , val. len ( ) , & val) {
991- return Err ( e) ;
992- }
970+ mem. store ( ( offset + addr) as usize , val. len ( ) , & val) ?;
993971
994972 Ok ( ( ) )
995973 }
@@ -1009,9 +987,7 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> {
1009987 false => u64:: from ( self . store . stack . values . pop :: < i32 > ( ) as u32 ) ,
1010988 } ;
1011989
1012- if let Err ( e) = mem. store ( ( offset + addr) as usize , val. len ( ) , & val) {
1013- return Err ( e) ;
1014- }
990+ mem. store ( ( offset + addr) as usize , val. len ( ) , & val) ?;
1015991
1016992 Ok ( ( ) )
1017993 }
0 commit comments