diff options
-rw-r--r-- | src/wasm2asm.h | 4 | ||||
-rw-r--r-- | test/unit.2asm.js | 59 |
2 files changed, 58 insertions, 5 deletions
diff --git a/src/wasm2asm.h b/src/wasm2asm.h index 6cdebe204..2630a3c82 100644 --- a/src/wasm2asm.h +++ b/src/wasm2asm.h @@ -543,13 +543,13 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) { Ref value; if (isStatement(curr->value)) { ScopedTemp temp(i32, parent); - ret[2]->push_back(visit(curr->value, temp)); + flattenAppend(ret[2], visit(curr->value, temp)); value = temp.getAstName(); } else { value = visit(curr->value, EXPRESSION_RESULT); } Ref theSwitch = ValueBuilder::makeSwitch(value); - ret[2]->push_back(theSwitch); + ret[2][1]->push_back(theSwitch); for (auto& c : curr->cases) { bool added = false; for (size_t i = 0; i < curr->targets.size(); i++) { diff --git a/test/unit.2asm.js b/test/unit.2asm.js index 136d404c8..c33a750d0 100644 --- a/test/unit.2asm.js +++ b/test/unit.2asm.js @@ -83,9 +83,62 @@ function asmFunc() { x = x | 0; var wasm2asm_i32$0 = 0; topmost : { - switch$0 : {} - switch$4 : {} - label$break$Lout : {} + switch$0 : { + switch (x - 1 | 0) { + case 0: + wasm2asm_i32$0 = 1; + break topmost; + case 1: + wasm2asm_i32$0 = 2; + break topmost; + default: + } + } + switch$4 : { + switch (x - 5 | 0) { + case 7: + wasm2asm_i32$0 = 121; + break topmost; + case 0: + wasm2asm_i32$0 = 51; + break topmost; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + default: + } + } + label$break$Lout : { + switch (x - 2 | 0) { + case 10: + break label$break$Lout; + case 8: + break label$break$Lout; + case 3: + do while_out$10 : { + break while_out$10; + continue while_out$10; + } while (0); + break label$break$Lout; + case 0: + do while_out$13 : { + break label$break$Lout; + continue while_out$13; + } while (0); + break label$break$Lout; + case 1: + case 2: + case 4: + case 5: + case 6: + case 7: + case 9: + default: + } + } wasm2asm_i32$0 = 0; } return wasm2asm_i32$0; |