From 870a37fd64651dfe42d7a6e3b5e78fb86721c0bf Mon Sep 17 00:00:00 2001 From: NikVolf Date: Thu, 20 Apr 2017 12:37:20 +0300 Subject: [PATCH] if-else test with block split approach --- res/cases/v1/ifelse.wasm | Bin 46 -> 46 bytes res/cases/v1/ifelse.wast | 4 ++-- src/elements/ops.rs | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/res/cases/v1/ifelse.wasm b/res/cases/v1/ifelse.wasm index 58ee3e0db3ced7638169b4d727a0c73e606bcdd2..48b3e422bccc05b8b1f30fd78b7c08cac07e0ddb 100644 GIT binary patch delta 16 XcmdPXo1o0i%Ie6@t;nFjz|Rc;6mtR7 delta 16 XcmdPXo1o0i!RpAut;nFjz|Rc;6np{G 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