summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-20 20:47:48 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-20 20:47:48 -0800
commit1f84970eab7c99122e50d475c4328ef1e76b7d53 (patch)
tree52e8a548e65a18bfe533a39a6785428a73fb0f31
parent02d9f159c96f46730c6a2f472521b11ec537a26c (diff)
downloadbinaryen-1f84970eab7c99122e50d475c4328ef1e76b7d53.tar.gz
binaryen-1f84970eab7c99122e50d475c4328ef1e76b7d53.tar.bz2
binaryen-1f84970eab7c99122e50d475c4328ef1e76b7d53.zip
handle labels on blocks in asm2wasm
-rw-r--r--src/asm2wasm.h19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 014658eb5..5f18a5811 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -1150,7 +1150,24 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
ret->value = !!ast[1] ? process(ast[1]) : nullptr;
return ret;
} else if (what == BLOCK) {
- return processStatements(ast[1], 0);
+ Name name;
+ if (parentLabel.is()) {
+ name = getBreakLabelName(parentLabel);
+ parentLabel = IString();
+ }
+ auto ret = processStatements(ast[1], 0);
+ if (name.is()) {
+ Block* block = ret->dyn_cast<Block>();
+ if (block && block->name.isNull()) {
+ block->name = name;
+ } else {
+ block = allocator.alloc<Block>();
+ block->name = name;
+ block->list.push_back(ret);
+ ret = block;
+ }
+ }
+ return ret;
} else if (what == BREAK) {
auto ret = allocator.alloc<Break>();
assert(breakStack.size() > 0);