diff options
-rw-r--r-- | src/asm2wasm.h | 11 | ||||
-rw-r--r-- | src/passes/LowerCase.cpp | 2 | ||||
-rw-r--r-- | src/passes/LowerIfElse.cpp | 2 | ||||
-rw-r--r-- | src/passes/LowerInt64.cpp | 3 | ||||
-rw-r--r-- | src/s2wasm.h | 3 | ||||
-rw-r--r-- | src/wasm-binary.h | 4 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 7 | ||||
-rw-r--r-- | src/wasm.h | 6 |
8 files changed, 27 insertions, 11 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index c13c847e7..cb1998aa4 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -431,6 +431,7 @@ private: if (expression->is<Block>()) return expression->dyn_cast<Block>(); auto ret = allocator.alloc<Block>(); ret->list.push_back(expression); + ret->finalize(); return ret; } @@ -1154,7 +1155,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { select->condition = isNegative; select->type = i32; block->list.push_back(select); - block->type = i32; + block->finalize(); return block; } else if (value->type == f32 || value->type == f64) { auto ret = allocator.alloc<Unary>(); @@ -1237,6 +1238,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { block = allocator.alloc<Block>(); block->name = name; block->list.push_back(ret); + block->finalize(); ret = block; } } @@ -1279,6 +1281,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { auto body = allocator.alloc<Block>(); body->list.push_back(condition); body->list.push_back(process(ast[2])); + body->finalize(); ret->body = body; } // loops do not automatically loop, add a branch back @@ -1313,6 +1316,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { auto block = allocator.alloc<Block>(); block->list.push_back(child); block->name = stop; + block->finalize(); return block; } else { auto loop = allocator.alloc<Loop>(); @@ -1376,6 +1380,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { body->list.push_back(condition); body->list.push_back(process(fbody)); body->list.push_back(process(finc)); + body->finalize(); ret->body = body; // loops do not automatically loop, add a branch back Block* block = blockify(ret->body); @@ -1389,6 +1394,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { // add an outer block for the init as well outer->list.push_back(process(finit)); outer->list.push_back(ret); + outer->finalize(); return outer; } else if (what == LABEL) { assert(parentLabel.isNull()); @@ -1405,7 +1411,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { auto ret = allocator.alloc<Block>(); ret->list.push_back(process(ast[1])); ret->list.push_back(process(ast[2])); - ret->type = ret->list[1]->type; + ret->finalize(); return ret; } else if (what == SWITCH) { IString name; @@ -1510,6 +1516,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { for (unsigned i = from; i < ast->size(); i++) { block->list.push_back(process(ast[i])); } + block->finalize(); return block; }; // body diff --git a/src/passes/LowerCase.cpp b/src/passes/LowerCase.cpp index f890de411..c0ab8d235 100644 --- a/src/passes/LowerCase.cpp +++ b/src/passes/LowerCase.cpp @@ -84,11 +84,13 @@ struct LowerCase : public WalkerPass<WasmWalker<LowerCase, void>> { if (curr->cases.size() == 0) return; auto top = allocator->alloc<Block>(); top->list.push_back(curr); + top->finalize(); for (auto& c : curr->cases) { top->name = c.name; auto next = allocator->alloc<Block>(); next->list.push_back(top); next->list.push_back(c.body); + next->finalize(); top = next; } curr->cases.clear(); diff --git a/src/passes/LowerIfElse.cpp b/src/passes/LowerIfElse.cpp index fa575d87d..922a294d2 100644 --- a/src/passes/LowerIfElse.cpp +++ b/src/passes/LowerIfElse.cpp @@ -49,7 +49,7 @@ struct LowerIfElse : public WalkerPass<WasmWalker<LowerIfElse, void>> { block->name = name; block->list.push_back(curr); block->list.push_back(curr->ifFalse); - block->type = curr->type; + block->finalize(); curr->ifFalse = nullptr; auto break_ = allocator->alloc<Break>(); break_->name = name; diff --git a/src/passes/LowerInt64.cpp b/src/passes/LowerInt64.cpp index 58e56cba6..7af7443e5 100644 --- a/src/passes/LowerInt64.cpp +++ b/src/passes/LowerInt64.cpp @@ -112,7 +112,7 @@ struct LowerInt64 : public Pass { ret->list.push_back(curr); ret->list.push_back(set); ret->list.push_back(low); // so the block returns the low bits - ret->type = i32; + ret->finalize(); fixes[ret] = high; replaceCurrent(ret); } @@ -132,6 +132,7 @@ struct LowerInt64 : public Pass { set->type = value->type; ret->list.push_back(set); } + ret->finalize(); return ret; } diff --git a/src/s2wasm.h b/src/s2wasm.h index 0520d5c3b..2de6cd60f 100644 --- a/src/s2wasm.h +++ b/src/s2wasm.h @@ -528,6 +528,7 @@ class S2WasmBuilder { last = last->cast<Loop>()->body; } last->cast<Block>()->list.push_back(curr); + last->cast<Block>()->finalize(); }; bstack.push_back(func->body); std::vector<Expression*> estack; @@ -1023,6 +1024,7 @@ class S2WasmBuilder { for (auto block : loopBlocks) { block->name = Name(); } + func->body->dyn_cast<Block>()->finalize(); wasm.addFunction(func); // XXX for now, export all functions auto exp = allocator.alloc<Export>(); @@ -1243,6 +1245,7 @@ class S2WasmBuilder { call->operands.push_back(param); } block->list.push_back(call); + block->finalize(); } } } diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 8fc6beb6c..993b4522d 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1359,9 +1359,7 @@ public: curr->list.push_back(expressionStack[i]); } expressionStack.resize(start); - if (curr->list.size() > 0) { - curr->type = curr->list.back()->type; - } + curr->finalize(); breakStack.pop_back(); } void visitIf(If *curr, uint8_t code) { diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 24ca1b811..f0745f63f 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -380,6 +380,7 @@ private: if (!autoBlock) { autoBlock = allocator.alloc<Block>(); autoBlock->list.push_back(func->body); + autoBlock->finalize(); func->body = autoBlock; } autoBlock->list.push_back(ex); @@ -699,7 +700,7 @@ private: ret->list.push_back(parseExpression(s[i])); } labelStack.pop_back(); - if (ret->list.size() > 0) ret->type = ret->list.back()->type; + ret->finalize(); return ret; } @@ -802,9 +803,7 @@ private: for (; i < s.size() && i < stopAt; i++) { ret->list.push_back(parseExpression(s[i])); } - if (ret->list.size() > 0) { - ret->type = ret->list.back()->type; - } + ret->finalize(); // Note that we do not name these implicit/synthetic blocks. They // are the effects of syntactic sugar, and nothing can branch to // them anyhow. diff --git a/src/wasm.h b/src/wasm.h index ec2cd469e..ba9d7de3d 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -794,6 +794,12 @@ public: Name name; ExpressionList list; + + void finalize() { + if (list.size() > 0) { + type = list.back()->type; + } + } }; class If : public Expression { |