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.h115
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