summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-05 20:20:06 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-05 20:20:06 -0800
commit0f592cc75ce20168a76264a76ed8dd62d7d00885 (patch)
tree25454273e1003b1445e2d793e5deced557f518d3
parent1cdd8c414e3eeef6b69a4016ef23d639ce33cdee (diff)
downloadbinaryen-0f592cc75ce20168a76264a76ed8dd62d7d00885.tar.gz
binaryen-0f592cc75ce20168a76264a76ed8dd62d7d00885.tar.bz2
binaryen-0f592cc75ce20168a76264a76ed8dd62d7d00885.zip
fix wasm2asm switch
-rw-r--r--src/wasm2asm.h4
-rw-r--r--test/unit.2asm.js59
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;