@@ -84,23 +84,18 @@ fn exec_one(
8484 match instr {
8585 Nop => { /* do nothing */ }
8686 Unreachable => return Ok ( ExecResult :: Trap ( crate :: Trap :: Unreachable ) ) , // we don't need to include the call frame here because it's already on the stack
87- Drop => {
88- stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?;
89- }
87+ Drop => stack. values . pop ( ) . map ( |_| ( ) ) ?,
88+ Return => todo ! ( "called function returned" ) ,
9089 Select => {
91- let cond: i32 = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?. into ( ) ;
92- let val2 = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?;
90+ let cond: i32 = stack. values . pop ( ) ?. into ( ) ;
91+ let val2 = stack. values . pop ( ) ?;
9392
9493 // if cond != 0, we already have the right value on the stack
9594 if cond == 0 {
96- let _ = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?;
95+ let _ = stack. values . pop ( ) ?;
9796 stack. values . push ( val2) ;
9897 }
9998 }
100- Return => {
101- debug ! ( "return" ) ;
102- }
103-
10499 Call ( v) => {
105100 debug ! ( "start call" ) ;
106101 // prepare the call frame
@@ -131,7 +126,7 @@ fn exec_one(
131126 args : * args,
132127 ty : BlockType :: Loop ,
133128 } ) ;
134- stack. values . block_args ( * args) ?;
129+ stack. values . push_block_args ( * args) ?;
135130 }
136131
137132 Block ( args, end_offset) => {
@@ -142,7 +137,7 @@ fn exec_one(
142137 args : * args,
143138 ty : BlockType :: Block ,
144139 } ) ;
145- stack. values . block_args ( * args) ?;
140+ stack. values . push_block_args ( * args) ?;
146141 }
147142
148143 BrTable ( _default, len) => {
@@ -160,11 +155,10 @@ fn exec_one(
160155
161156 todo ! ( )
162157 }
158+
163159 Br ( v) => cf. break_to ( * v, & mut stack. values ) ?,
164160 BrIf ( v) => {
165- let val: i32 = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?. into ( ) ;
166- debug ! ( "br_if: {}" , val) ;
167- if val > 0 {
161+ if stack. values . pop_t :: < i32 > ( ) ? > 0 {
168162 cf. break_to ( * v, & mut stack. values ) ?
169163 } ;
170164 }
@@ -174,13 +168,12 @@ fn exec_one(
174168 panic ! ( "endfunc: block frames not empty, this should have been validated by the parser" ) ;
175169 }
176170
177- if stack. call_stack . is_empty ( ) {
178- debug ! ( "end: no block to end and no parent call frame, returning" ) ;
179- return Ok ( ExecResult :: Return ) ;
180- } else {
181- debug ! ( "end: no block to end, returning to parent call frame" ) ;
182- * cf = stack. call_stack . pop ( ) ?;
183- return Ok ( ExecResult :: Call ) ;
171+ match stack. call_stack . is_empty ( ) {
172+ true => return Ok ( ExecResult :: Return ) ,
173+ false => {
174+ * cf = stack. call_stack . pop ( ) ?;
175+ return Ok ( ExecResult :: Call ) ;
176+ }
184177 }
185178 }
186179
@@ -205,22 +198,15 @@ fn exec_one(
205198 stack. values . extend ( res. iter ( ) . copied ( ) ) ;
206199 }
207200
208- LocalGet ( local_index) => {
209- debug ! ( "local.get: {:?}" , local_index) ;
210- let val = cf. get_local ( * local_index as usize ) ;
211- stack. values . push ( val) ;
212- }
213- LocalSet ( local_index) => {
214- let val = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?;
215- cf. set_local ( * local_index as usize , val) ;
216- }
217- // Equivalent to local.set, local.get
218- LocalTee ( local_index) => {
219- let val = stack. values . last ( ) . ok_or ( Error :: StackUnderflow ) ?;
220- cf. set_local ( * local_index as usize , * val) ;
221- }
201+ LocalGet ( local_index) => stack. values . push ( cf. get_local ( * local_index as usize ) ) ,
202+ LocalSet ( local_index) => cf. set_local ( * local_index as usize , stack. values . pop ( ) ?) ,
203+ LocalTee ( local_index) => cf. set_local ( * local_index as usize , * stack. values . last ( ) ?) ,
204+
222205 I32Const ( val) => stack. values . push ( ( * val) . into ( ) ) ,
223206 I64Const ( val) => stack. values . push ( ( * val) . into ( ) ) ,
207+ F32Const ( val) => stack. values . push ( ( * val) . into ( ) ) ,
208+ F64Const ( val) => stack. values . push ( ( * val) . into ( ) ) ,
209+
224210 I64Add => add_instr ! ( i64 , stack) ,
225211 I32Add => add_instr ! ( i32 , stack) ,
226212 F32Add => add_instr ! ( f32 , stack) ,
@@ -233,16 +219,22 @@ fn exec_one(
233219
234220 I32LtS => lts_instr ! ( i32 , stack) ,
235221 I64LtS => lts_instr ! ( i64 , stack) ,
222+ I32LtU => ltu_instr ! ( i32 , u32 , stack) ,
223+ I64LtU => ltu_instr ! ( i64 , u64 , stack) ,
236224 F32Lt => lts_instr ! ( f32 , stack) ,
237225 F64Lt => lts_instr ! ( f64 , stack) ,
238226
239227 I32GeS => ges_instr ! ( i32 , stack) ,
240228 I64GeS => ges_instr ! ( i64 , stack) ,
229+ I32GeU => geu_instr ! ( i32 , u32 , stack) ,
230+ I64GeU => geu_instr ! ( i64 , u64 , stack) ,
241231 F32Ge => ges_instr ! ( f32 , stack) ,
242232 F64Ge => ges_instr ! ( f64 , stack) ,
243233
244- I32DivS => div_instr ! ( i32 , stack) ,
245- I64DivS => div_instr ! ( i64 , stack) ,
234+ I32DivS => checked_divs_instr ! ( i32 , stack) ,
235+ I64DivS => checked_divs_instr ! ( i64 , stack) ,
236+ I32DivU => checked_divu_instr ! ( i32 , u32 , stack) ,
237+ I64DivU => checked_divu_instr ! ( i64 , u64 , stack) ,
246238 F32Div => div_instr ! ( f32 , stack) ,
247239 F64Div => div_instr ! ( f64 , stack) ,
248240
@@ -253,18 +245,15 @@ fn exec_one(
253245
254246 I32Eq => eq_instr ! ( i32 , stack) ,
255247 I64Eq => eq_instr ! ( i64 , stack) ,
248+ I32Eqz => eqz_instr ! ( i32 , stack) ,
249+ I64Eqz => eqz_instr ! ( i64 , stack) ,
256250 F32Eq => eq_instr ! ( f32 , stack) ,
257251 F64Eq => eq_instr ! ( f64 , stack) ,
258252
259- I32Eqz => {
260- let val: i32 = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?. into ( ) ;
261- stack. values . push ( ( ( val == 0 ) as i32 ) . into ( ) ) ;
262- }
263-
264- I64Eqz => {
265- let val: i64 = stack. values . pop ( ) . ok_or ( Error :: StackUnderflow ) ?. into ( ) ;
266- stack. values . push ( ( ( val == 0 ) as i32 ) . into ( ) ) ;
267- }
253+ I32Ne => ne_instr ! ( i32 , stack) ,
254+ I64Ne => ne_instr ! ( i64 , stack) ,
255+ F32Ne => ne_instr ! ( f32 , stack) ,
256+ F64Ne => ne_instr ! ( f64 , stack) ,
268257
269258 i => todo ! ( "{:?}" , i) ,
270259 } ;
0 commit comments