33use super :: no_std_floats:: NoStdFloatExt ;
44
55use alloc:: boxed:: Box ;
6- use alloc:: { format , rc:: Rc , string:: ToString } ;
6+ use alloc:: { rc:: Rc , string:: ToString } ;
77use core:: ops:: ControlFlow ;
88
99use interpreter:: stack:: CallFrame ;
@@ -78,7 +78,7 @@ impl<'store> Executor<'store> {
7878 } } ;
7979 }
8080
81- let next = match self . func . instructions . 0 . get ( self . cf . instr_ptr ) {
81+ let next = match self . func . instructions . 0 . get ( self . cf . instr_ptr as usize ) {
8282 Some ( instr) => instr,
8383 None => unreachable ! (
8484 "Instruction pointer out of bounds: {} ({} instructions)" ,
@@ -89,7 +89,7 @@ impl<'store> Executor<'store> {
8989
9090 #[ rustfmt:: skip]
9191 match next {
92- Nop | I32ReinterpretF32 | I64ReinterpretF64 | F32ReinterpretI32 | F64ReinterpretI64 => { }
92+ Nop | I32ReinterpretF32 | I64ReinterpretF64 | F32ReinterpretI32 | F64ReinterpretI64 | BranchTableTarget { .. } => { }
9393 Unreachable => return ControlFlow :: Break ( Some ( Trap :: Unreachable . into ( ) ) ) ,
9494 Drop32 => self . store . stack . values . drop :: < Value32 > ( ) ,
9595 Drop64 => self . store . stack . values . drop :: < Value64 > ( ) ,
@@ -107,66 +107,66 @@ impl<'store> Executor<'store> {
107107 ReturnCallSelf => return self . exec_call_self :: < true > ( ) ,
108108 ReturnCallIndirect ( ty, table) => return self . exec_call_indirect :: < true > ( * ty, * table) ,
109109 Jump ( ip) => {
110- self . cf . instr_ptr = * ip as usize ;
110+ self . cf . instr_ptr = * ip;
111111 return ControlFlow :: Continue ( ( ) ) ;
112112 }
113113 JumpIfZero ( ip) => {
114114 let cond = self . store . stack . values . pop :: < i32 > ( ) ;
115115
116116 if cond == 0 {
117- self . cf . instr_ptr = * ip as usize ;
117+ self . cf . instr_ptr = * ip;
118118 } else {
119119 self . cf . incr_instr_ptr ( ) ;
120120 }
121121 return ControlFlow :: Continue ( ( ) ) ;
122122 }
123123 DropKeepSmall { base32, keep32, base64, keep64, base128, keep128, base_ref, keep_ref } => {
124- let b32 = self . cf . stack_base ( ) . s32 + * base32 as usize ;
124+ let b32 = self . cf . stack_base ( ) . s32 + * base32 as u32 ;
125125 let k32 = * keep32 as usize ;
126- self . store . stack . values . stack_32 . truncate_keep ( b32, k32) ;
127- let b64 = self . cf . stack_base ( ) . s64 + * base64 as usize ;
126+ self . store . stack . values . stack_32 . truncate_keep ( b32 as usize , k32) ;
127+ let b64 = self . cf . stack_base ( ) . s64 + * base64 as u32 ;
128128 let k64 = * keep64 as usize ;
129- self . store . stack . values . stack_64 . truncate_keep ( b64, k64) ;
130- let b128 = self . cf . stack_base ( ) . s128 + * base128 as usize ;
129+ self . store . stack . values . stack_64 . truncate_keep ( b64 as usize , k64) ;
130+ let b128 = self . cf . stack_base ( ) . s128 + * base128 as u32 ;
131131 let k128 = * keep128 as usize ;
132- self . store . stack . values . stack_128 . truncate_keep ( b128, k128) ;
133- let bref = self . cf . stack_base ( ) . sref + * base_ref as usize ;
132+ self . store . stack . values . stack_128 . truncate_keep ( b128 as usize , k128) ;
133+ let bref = self . cf . stack_base ( ) . sref + * base_ref as u32 ;
134134 let kref = * keep_ref as usize ;
135- self . store . stack . values . stack_ref . truncate_keep ( bref, kref) ;
135+ self . store . stack . values . stack_ref . truncate_keep ( bref as usize , kref) ;
136136 }
137137 DropKeep32 ( base, keep) => {
138- let b = self . cf . stack_base ( ) . s32 + * base as usize ;
138+ let b = self . cf . stack_base ( ) . s32 + * base as u32 ;
139139 let k = * keep as usize ;
140- self . store . stack . values . stack_32 . truncate_keep ( b, k) ;
140+ self . store . stack . values . stack_32 . truncate_keep ( b as usize , k) ;
141141 }
142142 DropKeep64 ( base, keep) => {
143- let b = self . cf . stack_base ( ) . s64 + * base as usize ;
143+ let b = self . cf . stack_base ( ) . s64 + * base as u32 ;
144144 let k = * keep as usize ;
145- self . store . stack . values . stack_64 . truncate_keep ( b, k) ;
145+ self . store . stack . values . stack_64 . truncate_keep ( b as usize , k) ;
146146 }
147147 DropKeep128 ( base, keep) => {
148- let b = self . cf . stack_base ( ) . s128 + * base as usize ;
148+ let b = self . cf . stack_base ( ) . s128 + * base as u32 ;
149149 let k = * keep as usize ;
150- self . store . stack . values . stack_128 . truncate_keep ( b, k) ;
150+ self . store . stack . values . stack_128 . truncate_keep ( b as usize , k) ;
151151 }
152152 DropKeepRef ( base, keep) => {
153- let b = self . cf . stack_base ( ) . sref + * base as usize ;
153+ let b = self . cf . stack_base ( ) . sref + * base as u32 ;
154154 let k = * keep as usize ;
155- self . store . stack . values . stack_ref . truncate_keep ( b, k) ;
155+ self . store . stack . values . stack_ref . truncate_keep ( b as usize , k) ;
156156 }
157157 BranchTable ( default_ip, len) => {
158158 let idx = self . store . stack . values . pop :: < i32 > ( ) ;
159159 let start = self . cf . instr_ptr + 1 ;
160160
161161 let target_ip = if idx >= 0 && ( idx as u32 ) < * len {
162- match self . func . instructions . 0 . get ( start + idx as usize ) {
162+ match self . func . instructions . 0 . get ( ( start + idx as u32 ) as usize ) {
163163 Some ( Instruction :: BranchTableTarget ( ip) ) => * ip,
164164 _ => * default_ip,
165165 }
166166 } else {
167167 * default_ip
168168 } ;
169- self . cf . instr_ptr = target_ip as usize ;
169+ self . cf . instr_ptr = target_ip;
170170 return ControlFlow :: Continue ( ( ) ) ;
171171 }
172172 Return => return self . exec_return ( ) ,
@@ -434,10 +434,10 @@ impl<'store> Executor<'store> {
434434 V128Load16x4U ( arg) => self . exec_mem_load :: < u64 , 8 , Value128 > ( arg. mem_addr ( ) , arg. offset ( ) , |v| Value128 :: v128_load16x4_u ( v. to_le_bytes ( ) ) ) ?,
435435 V128Load32x2S ( arg) => self . exec_mem_load :: < u64 , 8 , Value128 > ( arg. mem_addr ( ) , arg. offset ( ) , |v| Value128 :: v128_load32x2_s ( v. to_le_bytes ( ) ) ) ?,
436436 V128Load32x2U ( arg) => self . exec_mem_load :: < u64 , 8 , Value128 > ( arg. mem_addr ( ) , arg. offset ( ) , |v| Value128 :: v128_load32x2_u ( v. to_le_bytes ( ) ) ) ?,
437- V128Load8Splat ( _arg ) => self . exec_mem_load :: < i8 , 1 , Value128 > ( _arg . mem_addr ( ) , _arg . offset ( ) , Value128 :: splat_i8) ?,
438- V128Load16Splat ( _arg ) => self . exec_mem_load :: < i16 , 2 , Value128 > ( _arg . mem_addr ( ) , _arg . offset ( ) , Value128 :: splat_i16) ?,
439- V128Load32Splat ( _arg ) => self . exec_mem_load :: < i32 , 4 , Value128 > ( _arg . mem_addr ( ) , _arg . offset ( ) , Value128 :: splat_i32) ?,
440- V128Load64Splat ( _arg ) => self . exec_mem_load :: < i64 , 8 , Value128 > ( _arg . mem_addr ( ) , _arg . offset ( ) , Value128 :: splat_i64) ?,
437+ V128Load8Splat ( arg ) => self . exec_mem_load :: < i8 , 1 , Value128 > ( arg . mem_addr ( ) , arg . offset ( ) , Value128 :: splat_i8) ?,
438+ V128Load16Splat ( arg ) => self . exec_mem_load :: < i16 , 2 , Value128 > ( arg . mem_addr ( ) , arg . offset ( ) , Value128 :: splat_i16) ?,
439+ V128Load32Splat ( arg ) => self . exec_mem_load :: < i32 , 4 , Value128 > ( arg . mem_addr ( ) , arg . offset ( ) , Value128 :: splat_i32) ?,
440+ V128Load64Splat ( arg ) => self . exec_mem_load :: < i64 , 8 , Value128 > ( arg . mem_addr ( ) , arg . offset ( ) , Value128 :: splat_i64) ?,
441441 V128Store ( arg) => self . exec_mem_store :: < Value128 , Value128 , 16 > ( arg. mem_addr ( ) , arg. offset ( ) , |v| v) ?,
442442 V128Store8Lane ( arg, lane) => self . exec_mem_store_lane :: < i8 , 1 > ( arg. mem_addr ( ) , arg. offset ( ) , * lane) ?,
443443 V128Store16Lane ( arg, lane) => self . exec_mem_store_lane :: < i16 , 2 > ( arg. mem_addr ( ) , arg. offset ( ) , * lane) ?,
@@ -655,9 +655,6 @@ impl<'store> Executor<'store> {
655655 F64x2PromoteLowF32x4 => stack_op ! ( unary Value128 , |v| v. f64x2_promote_low_f32x4( ) ) ,
656656 I32x4TruncSatF64x2SZero => stack_op ! ( unary Value128 , |v| v. i32x4_trunc_sat_f64x2_s_zero( ) ) ,
657657 I32x4TruncSatF64x2UZero => stack_op ! ( unary Value128 , |v| v. i32x4_trunc_sat_f64x2_u_zero( ) ) ,
658-
659- #[ allow( unreachable_patterns) ]
660- i => return ControlFlow :: Break ( Some ( Error :: UnsupportedFeature ( format ! ( "unimplemented opcode: {i:?}" ) ) ) ) ,
661658 } ;
662659
663660 self . cf . incr_instr_ptr ( ) ;
@@ -670,10 +667,6 @@ impl<'store> Executor<'store> {
670667 func_addr : FuncAddr ,
671668 owner : ModuleInstanceAddr ,
672669 ) -> ControlFlow < Option < Error > > {
673- if !IS_RETURN_CALL && self . store . stack . call_stack . is_full ( ) {
674- return ControlFlow :: Break ( Some ( Trap :: CallStackOverflow . into ( ) ) ) ;
675- }
676-
677670 if !Rc :: ptr_eq ( & self . func , & wasm_func) {
678671 self . func = wasm_func. clone ( ) ;
679672 }
@@ -726,10 +719,6 @@ impl<'store> Executor<'store> {
726719 }
727720
728721 fn exec_call_self < const IS_RETURN_CALL : bool > ( & mut self ) -> ControlFlow < Option < Error > > {
729- if !IS_RETURN_CALL && self . store . stack . call_stack . is_full ( ) {
730- return ControlFlow :: Break ( Some ( Trap :: CallStackOverflow . into ( ) ) ) ;
731- }
732-
733722 let params = self . func . params ;
734723 let locals = self . func . locals ;
735724
0 commit comments