summaryrefslogtreecommitdiff
path: root/src/wasm-s-parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-s-parser.h')
-rw-r--r--src/wasm-s-parser.h28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index f0745f63f..381a57bb8 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -29,6 +29,7 @@
#include "shared-constants.h"
#include "parsing.h"
#include "asm_v_wasm.h"
+#include "ast_utils.h"
namespace wasm {
@@ -789,9 +790,32 @@ private:
Expression* makeIf(Element& s) {
auto ret = allocator.alloc<If>();
ret->condition = parseExpression(s[1]);
- ret->ifTrue = parseExpression(s[2]);
+ // ifTrue and ifFalse may get implicit blocks
+ Name ifTrueName = getPrefixedName("if-true");
+ labelStack.push_back(ifTrueName);
+ auto* ifTrue = parseExpression(s[2]);
+ labelStack.pop_back();
+ if (BreakSeeker::has(ifTrue, ifTrueName)) {
+ auto* block = allocator.alloc<Block>();
+ block->name = ifTrueName;
+ block->list.push_back(ifTrue);
+ block->finalize();
+ ifTrue = block;
+ }
+ ret->ifTrue = ifTrue;
if (s.size() == 4) {
- ret->ifFalse = parseExpression(s[3]);
+ Name ifFalseName = getPrefixedName("if-false");
+ labelStack.push_back(ifFalseName);
+ auto* ifFalse = parseExpression(s[3]);
+ labelStack.pop_back();
+ if (BreakSeeker::has(ifFalse, ifFalseName)) {
+ auto* block = allocator.alloc<Block>();
+ block->name = ifFalseName;
+ block->list.push_back(ifFalse);
+ block->finalize();
+ ifFalse = block;
+ }
+ ret->ifFalse = ifFalse;
ret->finalize();
}
return ret;