summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/s2wasm.h8
-rw-r--r--src/wasm-binary.h4
-rw-r--r--src/wasm.h4
3 files changed, 10 insertions, 6 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h
index 31b28f1e2..649b32196 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -952,12 +952,16 @@ class S2WasmBuilder {
bstack.pop_back();
} else if (match("br")) {
auto curr = allocator.alloc<Break>();
+ bool hasCondition = false;
if (*s == '_') {
mustMatch("_if");
- curr->condition = getInput();
- skipComma();
+ hasCondition = true;
}
curr->name = getBranchLabel(getInt());
+ if (hasCondition) {
+ skipComma();
+ curr->condition = getInput();
+ }
addToBlock(curr);
} else if (match("call")) {
makeCall(none);
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index 440689ea0..2c884a4f5 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -663,12 +663,12 @@ assert(0);
o << int8_t(curr->condition ? BinaryConsts::BrIf : BinaryConsts::Br);
int offset = getBreakIndex(curr->name);
o << int8_t(offset);
- if (curr->condition) recurse(curr->condition);
if (curr->value) {
recurse(curr->value);
} else {
visitNop(nullptr);
}
+ if (curr->condition) recurse(curr->condition);
}
void visitSwitch(Switch *curr) {
if (debug) std::cerr << "zz node: Switch" << std::endl;
@@ -1356,8 +1356,8 @@ public:
if (debug) std::cerr << "zz node: Break" << std::endl;
auto offset = getInt8();
curr->name = getBreakName(offset);
- if (code == BinaryConsts::BrIf) readExpression(curr->condition);
readExpression(curr->value);
+ if (code == BinaryConsts::BrIf) readExpression(curr->condition);
}
void visitSwitch(Switch *curr) {
if (debug) std::cerr << "zz node: Switch" << std::endl;
diff --git a/src/wasm.h b/src/wasm.h
index 20a7b34ef..e30a891b9 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -501,13 +501,13 @@ public:
class Break : public Expression {
public:
- Break() : Expression(BreakId), condition(nullptr), value(nullptr) {
+ Break() : Expression(BreakId), value(nullptr), condition(nullptr) {
type = unreachable;
}
- Expression *condition;
Name name;
Expression *value;
+ Expression *condition;
std::ostream& doPrint(std::ostream &o, unsigned indent) {
if (condition) {