diff options
Diffstat (limited to 'src/parser/contexts.h')
-rw-r--r-- | src/parser/contexts.h | 115 |
1 files changed, 113 insertions, 2 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 15b82fe64..620d10d60 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -104,6 +104,10 @@ struct NullTypeParserCtx { HeapTypeT makeI31() { return Ok{}; } HeapTypeT makeStructType() { return Ok{}; } HeapTypeT makeArrayType() { return Ok{}; } + HeapTypeT makeStringType() { return Ok{}; } + HeapTypeT makeStringViewWTF8Type() { return Ok{}; } + HeapTypeT makeStringViewWTF16Type() { return Ok{}; } + HeapTypeT makeStringViewIterType() { return Ok{}; } TypeT makeI32() { return Ok{}; } TypeT makeI64() { return Ok{}; } @@ -190,6 +194,10 @@ template<typename Ctx> struct TypeParserCtx { HeapTypeT makeI31() { return HeapType::i31; } HeapTypeT makeStructType() { return HeapType::struct_; } HeapTypeT makeArrayType() { return HeapType::array; } + HeapTypeT makeStringType() { return HeapType::string; } + HeapTypeT makeStringViewWTF8Type() { return HeapType::stringview_wtf8; } + HeapTypeT makeStringViewWTF16Type() { return HeapType::stringview_wtf16; } + HeapTypeT makeStringViewIterType() { return HeapType::stringview_iter; } TypeT makeI32() { return Type::i32; } TypeT makeI64() { return Type::i64; } @@ -284,8 +292,9 @@ struct NullInstrParserCtx { using FuncIdxT = Ok; using LocalIdxT = Ok; using TableIdxT = Ok; - using GlobalIdxT = Ok; using MemoryIdxT = Ok; + using GlobalIdxT = Ok; + using ElemIdxT = Ok; using DataIdxT = Ok; using LabelIdxT = Ok; using TagIdxT = Ok; @@ -310,6 +319,8 @@ struct NullInstrParserCtx { TableIdxT getTableFromName(Name) { return Ok{}; } MemoryIdxT getMemoryFromIdx(uint32_t) { return Ok{}; } MemoryIdxT getMemoryFromName(Name) { return Ok{}; } + ElemIdxT getElemFromIdx(uint32_t) { return Ok{}; } + ElemIdxT getElemFromName(Name) { return Ok{}; } DataIdxT getDataFromIdx(uint32_t) { return Ok{}; } DataIdxT getDataFromName(Name) { return Ok{}; } LabelIdxT getLabelFromIdx(uint32_t, bool) { return Ok{}; } @@ -458,7 +469,7 @@ struct NullInstrParserCtx { return Ok{}; } template<typename HeapTypeT> - Result<> makeArrayNewElem(Index, HeapTypeT, DataIdxT) { + Result<> makeArrayNewElem(Index, HeapTypeT, ElemIdxT) { return Ok{}; } template<typename HeapTypeT> @@ -479,7 +490,28 @@ struct NullInstrParserCtx { template<typename HeapTypeT> Result<> makeArrayFill(Index, HeapTypeT) { return Ok{}; } + template<typename HeapTypeT> + Result<> makeArrayInitData(Index, HeapTypeT, DataIdxT) { + return Ok{}; + } + template<typename HeapTypeT> + Result<> makeArrayInitElem(Index, HeapTypeT, ElemIdxT) { + return Ok{}; + } Result<> makeRefAs(Index, RefAsOp) { return Ok{}; } + Result<> makeStringNew(Index, StringNewOp, bool, MemoryIdxT*) { return Ok{}; } + Result<> makeStringConst(Index, std::string_view) { return Ok{}; } + Result<> makeStringMeasure(Index, StringMeasureOp) { return Ok{}; } + Result<> makeStringEncode(Index, StringEncodeOp, MemoryIdxT*) { return Ok{}; } + Result<> makeStringConcat(Index) { return Ok{}; } + Result<> makeStringEq(Index, StringEqOp) { return Ok{}; } + Result<> makeStringAs(Index, StringAsOp) { return Ok{}; } + Result<> makeStringWTF8Advance(Index) { return Ok{}; } + Result<> makeStringWTF16Get(Index) { return Ok{}; } + Result<> makeStringIterNext(Index) { return Ok{}; } + Result<> makeStringIterMove(Index, StringIterMoveOp) { return Ok{}; } + Result<> makeStringSliceWTF(Index, StringSliceWTFOp) { return Ok{}; } + Result<> makeStringSliceIter(Index) { return Ok{}; } }; // Phase 1: Parse definition spans for top-level module elements and determine @@ -968,6 +1000,7 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { using GlobalIdxT = Name; using TableIdxT = Name; using MemoryIdxT = Name; + using ElemIdxT = Name; using DataIdxT = Name; using TagIdxT = Name; @@ -1141,6 +1174,20 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { return name; } + Result<Name> getElemFromIdx(uint32_t idx) { + if (idx >= wasm.elementSegments.size()) { + return in.err("elem index out of bounds"); + } + return wasm.elementSegments[idx]->name; + } + + Result<Name> getElemFromName(Name name) { + if (!wasm.getElementSegmentOrNull(name)) { + return in.err("elem $" + name.toString() + " does not exist"); + } + return name; + } + Result<Name> getDataFromIdx(uint32_t idx) { if (idx >= wasm.dataSegments.size()) { return in.err("data index out of bounds"); @@ -1658,9 +1705,73 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { return withLoc(pos, irBuilder.makeArrayFill(type)); } + Result<> makeArrayInitData(Index pos, HeapType type, Name data) { + return withLoc(pos, irBuilder.makeArrayInitData(type, data)); + } + + Result<> makeArrayInitElem(Index pos, HeapType type, Name elem) { + return withLoc(pos, irBuilder.makeArrayInitElem(type, elem)); + } + Result<> makeRefAs(Index pos, RefAsOp op) { return withLoc(pos, irBuilder.makeRefAs(op)); } + + Result<> makeStringNew(Index pos, StringNewOp op, bool try_, Name* mem) { + auto m = getMemory(pos, mem); + CHECK_ERR(m); + return withLoc(pos, irBuilder.makeStringNew(op, try_, *m)); + } + + Result<> makeStringConst(Index pos, std::string_view str) { + return withLoc(pos, irBuilder.makeStringConst(Name(str))); + } + + Result<> makeStringMeasure(Index pos, StringMeasureOp op) { + return withLoc(pos, irBuilder.makeStringMeasure(op)); + } + + Result<> makeStringEncode(Index pos, StringEncodeOp op, Name* mem) { + auto m = getMemory(pos, mem); + CHECK_ERR(m); + return withLoc(pos, irBuilder.makeStringEncode(op, *m)); + } + + Result<> makeStringConcat(Index pos) { + return withLoc(pos, irBuilder.makeStringConcat()); + } + + Result<> makeStringEq(Index pos, StringEqOp op) { + return withLoc(pos, irBuilder.makeStringEq(op)); + } + + Result<> makeStringAs(Index pos, StringAsOp op) { + return withLoc(pos, irBuilder.makeStringAs(op)); + } + + Result<> makeStringWTF8Advance(Index pos) { + return withLoc(pos, irBuilder.makeStringWTF8Advance()); + } + + Result<> makeStringWTF16Get(Index pos) { + return withLoc(pos, irBuilder.makeStringWTF16Get()); + } + + Result<> makeStringIterNext(Index pos) { + return withLoc(pos, irBuilder.makeStringIterNext()); + } + + Result<> makeStringIterMove(Index pos, StringIterMoveOp op) { + return withLoc(pos, irBuilder.makeStringIterMove(op)); + } + + Result<> makeStringSliceWTF(Index pos, StringSliceWTFOp op) { + return withLoc(pos, irBuilder.makeStringSliceWTF(op)); + } + + Result<> makeStringSliceIter(Index pos) { + return withLoc(pos, irBuilder.makeStringSliceIter()); + } }; } // namespace wasm::WATParser |