diff --git a/res/cases/v1/ifelse.wasm b/res/cases/v1/ifelse.wasm index 58ee3e0..48b3e42 100644 Binary files a/res/cases/v1/ifelse.wasm and b/res/cases/v1/ifelse.wasm differ diff --git a/res/cases/v1/ifelse.wast b/res/cases/v1/ifelse.wast index 7a9b470..33a2b23 100644 --- a/res/cases/v1/ifelse.wast +++ b/res/cases/v1/ifelse.wast @@ -6,9 +6,9 @@ set_local 0 i32.const 0 if i32 - i32.const 8 + i32.const 5 else - i32.const 4 + i32.const 7 end set_local 0 get_local 0 diff --git a/src/elements/ops.rs b/src/elements/ops.rs index a96c603..8566984 100644 --- a/src/elements/ops.rs +++ b/src/elements/ops.rs @@ -913,3 +913,23 @@ impl Serialize for InitExpr { } } +#[test] +fn ifelse() { + // see if-else.wast/if-else.wasm + let opcode = super::deserialize_buffer::(vec![0x04, 0x7F, 0x41, 0x05, 0x05, 0x41, 0x07, 0x0B]) + .expect("valid hex of if instruction"); + match opcode { + Opcode::If(_, ops) => { + let before_else = ops.elements().iter() + .take_while(|op| match **op { Opcode::Else => false, _ => true }).count(); + let after_else = ops.elements().iter() + .skip_while(|op| match **op { Opcode::Else => false, _ => true }) + .take_while(|op| match **op { Opcode::End => false, _ => true }) + .count() + - 1; // minus Opcode::Else itself + + assert_eq!(before_else, after_else); + }, + _ => { panic!("Should be deserialized as if opcode"); } + } +} \ No newline at end of file