diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-s-parser.h | 18 | ||||
-rw-r--r-- | src/wasm.h | 21 |
2 files changed, 35 insertions, 4 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index fa3d8cb67..f71d65707 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -36,6 +36,7 @@ IString MODULE("module"), NAN_("nan"), NEG_NAN("-nan"), CASE("case"), + BR("br"), FAKE_RETURN("fake_return_waka123"); int unhex(char c) { @@ -1019,9 +1020,22 @@ private: Element& table = *s[i]; i++; for (size_t j = 1; j < table.size(); j++) { - ret->targets.push_back((*table[j])[1]->str()); + Element& curr = *table[j]; + if (curr[0]->str() == CASE) { + ret->targets.push_back(curr[1]->str()); + } else { + assert(curr[0]->str() == BR); + assert(curr[1]->str() == ret->name); + ret->targets.push_back(Name()); + } + } + Element& curr = *s[i]; + if (curr[0]->str() == CASE) { + ret->default_ = curr[1]->str(); + } else { + assert(curr[0]->str() == BR); + assert(curr[1]->str() == ret->name); } - ret->default_ = (*s[i])[1]->str(); i++; for (; i < s.size(); i++) { Element& curr = *s[i]; diff --git a/src/wasm.h b/src/wasm.h index 68bee7e5a..31abf6cc9 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -412,9 +412,9 @@ public: printFullLine(o, indent, value); doIndent(o, indent) << "[ "; for (auto& t : targets) { - o << t.str << ' '; + o << (t.is() ? t.str : "br-out") << ' '; } - o << "] (default " << default_.str << ")\n"; + o << "] (default " << (default_.is() ? default_.str : "br-out") << ")\n"; for (auto& c : cases) { doIndent(o, indent); printMinorOpening(o, "case ") << c.name.str; @@ -1317,6 +1317,23 @@ bool Module::validateFunction(Function *func) { void visitStore(Store *curr) override { if (!validateAlignment(curr->align)) valid = false; } + void visitSwitch(Switch *curr) override { +std::cerr << "validate switch "; +curr->doPrint(std::cerr, 0) << "\n"; + std::set<Name> inTable; + for (auto target : curr->targets) { + if (target.is()) { + inTable.insert(target); +std::cerr << "in table: " << target << '\n'; + } + } + for (auto& c : curr->cases) { +std::cerr << "chack: " << c.name.is() << " : " << (c.name.is() ? c.name.str : "ASSDAS") << '\n'; + if (c.name.is() && inTable.find(c.name) == inTable.end()) { + valid = false; + } + } + } bool validateAlignment(size_t align) { switch (align) { |