@@ -17,7 +17,6 @@ use crate::*;
1717
1818pub ( crate ) struct Executor < ' store > {
1919 cf : CallFrame ,
20- instructions : ArcSlice < Instruction > ,
2120 func : Rc < WasmFunction > ,
2221 module : Rc < ModuleInstanceInner > ,
2322 store : & ' store mut Store ,
@@ -27,8 +26,7 @@ impl<'store> Executor<'store> {
2726 pub ( crate ) fn new ( store : & ' store mut Store , cf : CallFrame ) -> Result < Self > {
2827 let module = store. get_module_instance_raw ( cf. module_addr ) . clone ( ) ;
2928 let func = store. state . get_wasm_func ( cf. func_addr ) . clone ( ) ;
30- let instructions = func. instructions . clone ( ) ;
31- Ok ( Self { module, store, cf, func, instructions } )
29+ Ok ( Self { module, store, cf, func } )
3230 }
3331
3432 pub ( crate ) fn run_to_completion ( & mut self ) -> Result < ( ) > {
@@ -76,12 +74,12 @@ impl<'store> Executor<'store> {
7674 } ;
7775 }
7876
79- let next = match self . instructions . 0 . get ( self . cf . instr_ptr ) {
77+ let next = match self . func . instructions . 0 . get ( self . cf . instr_ptr ) {
8078 Some ( instr) => instr,
8179 None => unreachable ! (
8280 "Instruction pointer out of bounds: {} ({} instructions)" ,
8381 self . cf. instr_ptr,
84- self . instructions. 0 . len( )
82+ self . func . instructions. 0 . len( )
8583 ) ,
8684 } ;
8785
@@ -116,36 +114,36 @@ impl<'store> Executor<'store> {
116114 return ControlFlow :: Continue ( ( ) ) ;
117115 }
118116 DropKeepSmall { base32, keep32, base64, keep64, base128, keep128, base_ref, keep_ref } => {
119- let b32 = self . cf . stack_base . s32 as usize + * base32 as usize ;
117+ let b32 = self . cf . stack_base . s32 + * base32 as usize ;
120118 let k32 = * keep32 as usize ;
121119 self . store . stack . values . stack_32 . truncate_keep ( b32, k32) ;
122- let b64 = self . cf . stack_base . s64 as usize + * base64 as usize ;
120+ let b64 = self . cf . stack_base . s64 + * base64 as usize ;
123121 let k64 = * keep64 as usize ;
124122 self . store . stack . values . stack_64 . truncate_keep ( b64, k64) ;
125- let b128 = self . cf . stack_base . s128 as usize + * base128 as usize ;
123+ let b128 = self . cf . stack_base . s128 + * base128 as usize ;
126124 let k128 = * keep128 as usize ;
127125 self . store . stack . values . stack_128 . truncate_keep ( b128, k128) ;
128- let bref = self . cf . stack_base . sref as usize + * base_ref as usize ;
126+ let bref = self . cf . stack_base . sref + * base_ref as usize ;
129127 let kref = * keep_ref as usize ;
130128 self . store . stack . values . stack_ref . truncate_keep ( bref, kref) ;
131129 }
132130 DropKeep32 ( base, keep) => {
133- let b = self . cf . stack_base . s32 as usize + * base as usize ;
131+ let b = self . cf . stack_base . s32 + * base as usize ;
134132 let k = * keep as usize ;
135133 self . store . stack . values . stack_32 . truncate_keep ( b, k) ;
136134 }
137135 DropKeep64 ( base, keep) => {
138- let b = self . cf . stack_base . s64 as usize + * base as usize ;
136+ let b = self . cf . stack_base . s64 + * base as usize ;
139137 let k = * keep as usize ;
140138 self . store . stack . values . stack_64 . truncate_keep ( b, k) ;
141139 }
142140 DropKeep128 ( base, keep) => {
143- let b = self . cf . stack_base . s128 as usize + * base as usize ;
141+ let b = self . cf . stack_base . s128 + * base as usize ;
144142 let k = * keep as usize ;
145143 self . store . stack . values . stack_128 . truncate_keep ( b, k) ;
146144 }
147145 DropKeepRef ( base, keep) => {
148- let b = self . cf . stack_base . sref as usize + * base as usize ;
146+ let b = self . cf . stack_base . sref + * base as usize ;
149147 let k = * keep as usize ;
150148 self . store . stack . values . stack_ref . truncate_keep ( b, k) ;
151149 }
@@ -154,7 +152,7 @@ impl<'store> Executor<'store> {
154152 let start = self . cf . instr_ptr + 1 ;
155153
156154 let target_ip = if idx >= 0 && ( idx as u32 ) < * len {
157- match self . instructions . 0 . get ( start + idx as usize ) {
155+ match self . func . instructions . 0 . get ( start + idx as usize ) {
158156 Some ( Instruction :: BranchTableTarget ( ip) ) => * ip,
159157 _ => * default_ip,
160158 }
@@ -629,9 +627,8 @@ impl<'store> Executor<'store> {
629627 func_addr : FuncAddr ,
630628 owner : ModuleInstanceAddr ,
631629 ) -> ControlFlow < Option < Error > > {
632- if self . func != wasm_func {
630+ if ! Rc :: ptr_eq ( & self . func , & wasm_func) {
633631 self . func = wasm_func. clone ( ) ;
634- self . instructions = wasm_func. instructions . clone ( ) ;
635632 }
636633
637634 if IS_RETURN_CALL {
@@ -716,7 +713,6 @@ impl<'store> Executor<'store> {
716713
717714 if cf. func_addr != self . cf . func_addr {
718715 self . func = self . store . state . get_wasm_func ( cf. func_addr ) . clone ( ) ;
719- self . instructions = self . func . instructions . clone ( ) ;
720716
721717 if cf. module_addr != self . module . idx {
722718 self . module = self . store . get_module_instance_raw ( cf. module_addr ) . clone ( ) ;
@@ -751,14 +747,14 @@ impl<'store> Executor<'store> {
751747 }
752748 fn exec_memory_grow ( & mut self , addr : u32 ) -> Result < ( ) > {
753749 let mem = self . store . state . get_mem_mut ( self . module . resolve_mem_addr ( addr) ) ;
754- let prev_size = mem. page_count ;
755- let pages_delta = match mem . is_64bit ( ) {
750+ let is_64bit = mem. is_64bit ( ) ;
751+ let pages_delta = match is_64bit {
756752 true => self . store . stack . values . pop :: < i64 > ( ) ,
757753 false => i64:: from ( self . store . stack . values . pop :: < i32 > ( ) ) ,
758754 } ;
759755
760- let size = mem. grow ( pages_delta) . map ( |_| prev_size as i64 ) . unwrap_or ( -1 ) ;
761- match mem . is_64bit ( ) {
756+ let size = mem. grow ( pages_delta) . unwrap_or ( -1 ) ;
757+ match is_64bit {
762758 true => self . store . stack . values . push :: < i64 > ( size) ?,
763759 false => self . store . stack . values . push :: < i32 > ( size as i32 ) ?,
764760 } ;
0 commit comments