summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/asm2wasm.h24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 474a36121..204e014c9 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -413,6 +413,13 @@ private:
return nullptr;
}
+ Block* blockify(Expression* expression) {
+ if (expression->is<Block>()) return expression->dyn_cast<Block>();
+ auto ret = allocator.alloc<Block>();
+ ret->list.push_back(expression);
+ return ret;
+ }
+
Function* processFunction(Ref ast);
};
@@ -1210,6 +1217,12 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
body->list.push_back(process(ast[2]));
ret->body = body;
}
+ // loops do not automatically loop, add a branch back
+ Block* block = blockify(ret->body);
+ auto continuer = allocator.alloc<Break>();
+ continuer->name = ret->in;
+ block->list.push_back(continuer);
+ ret->body = block;
continueStack.pop_back();
breakStack.pop_back();
return ret;
@@ -1256,14 +1269,9 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
condition->condition = process(ast[1]);
condition->ifTrue = allocator.alloc<Nop>();
condition->ifFalse = breakOut;
- if (Block *block = ret->body->dyn_cast<Block>()) {
- block->list.push_back(condition);
- } else {
- auto newBody = allocator.alloc<Block>();
- newBody->list.push_back(ret->body);
- newBody->list.push_back(condition);
- ret->body = newBody;
- }
+ Block *block = blockify(ret->body);
+ block->list.push_back(condition);
+ ret->body = block;
return ret;
} else if (what == LABEL) {
assert(parentLabel.isNull());