diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 11 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 7 |
2 files changed, 6 insertions, 12 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index f0787600e..9c0e5cd37 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -670,7 +670,7 @@ void WasmBinaryWriter::visitBreak(Break *curr) { // then either the condition or the value is unreachable, which is // extremely rare, and may require us to make the stack polymorphic // (if the block we branch to has a value, we may lack one as we - // are not a taken branch; the wasm spec on the other hand does + // are not a reachable branch; the wasm spec on the other hand does // presume the br_if emits a value of the right type, even if it // popped unreachable) o << int8_t(BinaryConsts::Unreachable); @@ -683,11 +683,10 @@ void WasmBinaryWriter::visitSwitch(Switch *curr) { recurse(curr->value); } recurse(curr->condition); - if (!BranchUtils::isBranchTaken(curr)) { - // if the branch is not taken, then it's dangerous to emit it, as - // wasm type checking rules are stricter than ours - we tolerate - // an untaken branch to a target with a different value, but not - // wasm. so just don't emit it + if (!BranchUtils::isBranchReachable(curr)) { + // if the branch is not reachable, then it's dangerous to emit it, as + // wasm type checking rules are different, especially in unreachable + // code. so just don't emit that unreachable code. o << int8_t(BinaryConsts::Unreachable); return; } diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 877232521..8e93b1c38 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -58,7 +58,6 @@ void WasmValidator::visitBlock(Block *curr) { } } breakTargets.erase(curr->name); - namedBreakTargets.erase(curr->name); } if (curr->list.size() > 1) { for (Index i = 0; i < curr->list.size() - 1; i++) { @@ -88,7 +87,6 @@ void WasmValidator::visitLoop(Loop *curr) { if (curr->name.is()) { noteLabelName(curr->name); breakTargets.erase(curr->name); - namedBreakTargets.erase(curr->name); if (breakInfos.count(curr) > 0) { auto& info = breakInfos[curr]; shouldBeEqual(info.arity, Index(0), curr, "breaks to a loop cannot pass a value"); @@ -128,7 +126,6 @@ void WasmValidator::visitIf(If *curr) { } void WasmValidator::noteBreak(Name name, Expression* value, Expression* curr) { - namedBreakTargets.insert(name); WasmType valueType = none; Index arity = 0; if (value) { @@ -550,9 +547,7 @@ void WasmValidator::visitFunction(Function *curr) { if (returnType != unreachable) { shouldBeEqual(curr->result, returnType, curr->body, "function result must match, if function has returns"); } - if (!shouldBeTrue(namedBreakTargets.empty(), curr->body, "all named break targets must exist") && !quiet) { - std::cerr << "(on label " << *namedBreakTargets.begin() << ")\n"; - } + shouldBeTrue(breakTargets.empty(), curr->body, "all named break targets must exist"); returnType = unreachable; labelNames.clear(); } |