diff options
author | Thomas Lively <tlively@google.com> | 2024-02-09 15:42:43 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-09 15:42:43 -0800 |
commit | 7e20a3b1bdc1a3d26b13c2597d0286c79851e9ac (patch) | |
tree | 13fdf3350ee496ba9b944a457fa70a8900cf6eb3 /src/parser/contexts.h | |
parent | 90087f0972aa34ee37860b70072cb8fc33c89ce3 (diff) | |
download | binaryen-7e20a3b1bdc1a3d26b13c2597d0286c79851e9ac.tar.gz binaryen-7e20a3b1bdc1a3d26b13c2597d0286c79851e9ac.tar.bz2 binaryen-7e20a3b1bdc1a3d26b13c2597d0286c79851e9ac.zip |
[Parser] Parse `resume` (#6295)
Diffstat (limited to 'src/parser/contexts.h')
-rw-r--r-- | src/parser/contexts.h | 42 |
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 |