summaryrefslogtreecommitdiff
path: root/src/parser/contexts.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/contexts.h')
-rw-r--r--src/parser/contexts.h42
1 files changed, 35 insertions, 7 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h
index 544851859..ab82f3963 100644
--- a/src/parser/contexts.h
+++ b/src/parser/contexts.h
@@ -310,6 +310,7 @@ struct NullInstrParserCtx {
using ExprT = Ok;
using CatchT = Ok;
using CatchListT = Ok;
+ using TagLabelListT = Ok;
using FieldIdxT = Ok;
using FuncIdxT = Ok;
@@ -386,6 +387,9 @@ struct NullInstrParserCtx {
return Ok{};
}
+ TagLabelListT makeTagLabelList() { return Ok{}; }
+ void appendTagLabel(TagLabelListT&, TagIdxT, LabelIdxT) {}
+
Result<> makeUnreachable(Index) { return Ok{}; }
Result<> makeNop(Index) { return Ok{}; }
Result<> makeBinary(Index, BinaryOp) { return Ok{}; }
@@ -566,6 +570,10 @@ struct NullInstrParserCtx {
Result<> makeStringIterMove(Index, StringIterMoveOp) { return Ok{}; }
Result<> makeStringSliceWTF(Index, StringSliceWTFOp) { return Ok{}; }
Result<> makeStringSliceIter(Index) { return Ok{}; }
+ template<typename HeapTypeT>
+ Result<> makeResume(Index, HeapTypeT, const TagLabelListT&) {
+ return Ok{};
+ }
};
struct NullCtx : NullTypeParserCtx, NullInstrParserCtx {
@@ -1069,13 +1077,6 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
using TableTypeT = Ok;
using TypeUseT = HeapType;
- using ExprT = Expression*;
- using ElemListT = std::vector<Expression*>;
-
- struct CatchInfo;
- using CatchT = CatchInfo;
- using CatchListT = std::vector<CatchInfo>;
-
using FieldIdxT = Index;
using FuncIdxT = Name;
using LocalIdxT = Index;
@@ -1089,6 +1090,15 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
using MemargT = Memarg;
+ using ExprT = Expression*;
+ using ElemListT = std::vector<Expression*>;
+
+ struct CatchInfo;
+ using CatchT = CatchInfo;
+ using CatchListT = std::vector<CatchInfo>;
+
+ using TagLabelListT = std::vector<std::pair<TagIdxT, LabelIdxT>>;
+
ParseInput in;
Module& wasm;
@@ -1179,6 +1189,11 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
CatchInfo makeCatchAll(Index label) { return {{}, label, false}; }
CatchInfo makeCatchAllRef(Index label) { return {{}, label, true}; }
+ TagLabelListT makeTagLabelList() { return {}; }
+ void appendTagLabel(TagLabelListT& tagLabels, Name tag, Index label) {
+ tagLabels.push_back({tag, label});
+ }
+
Result<HeapTypeT> getHeapTypeFromIdx(Index idx) {
if (idx >= types.size()) {
return in.err("type index out of bounds");
@@ -1994,6 +2009,19 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
Result<> makeStringSliceIter(Index pos) {
return withLoc(pos, irBuilder.makeStringSliceIter());
}
+
+ Result<>
+ makeResume(Index pos, HeapType type, const TagLabelListT& tagLabels) {
+ std::vector<Name> tags;
+ std::vector<Index> labels;
+ tags.reserve(tagLabels.size());
+ labels.reserve(tagLabels.size());
+ for (auto& [tag, label] : tagLabels) {
+ tags.push_back(tag);
+ labels.push_back(label);
+ }
+ return withLoc(pos, irBuilder.makeResume(type, tags, labels));
+ }
};
} // namespace wasm::WATParser