summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/asm2wasm.h11
-rw-r--r--src/passes/LowerCase.cpp2
-rw-r--r--src/passes/LowerIfElse.cpp2
-rw-r--r--src/passes/LowerInt64.cpp3
-rw-r--r--src/s2wasm.h3
-rw-r--r--src/wasm-binary.h4
-rw-r--r--src/wasm-s-parser.h7
-rw-r--r--src/wasm.h6
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 {