summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser/contexts.h30
-rw-r--r--src/parser/parsers.h50
2 files changed, 60 insertions, 20 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h
index f489a2c05..7e9add5a7 100644
--- a/src/parser/contexts.h
+++ b/src/parser/contexts.h
@@ -97,17 +97,22 @@ struct NullTypeParserCtx {
using ElemListT = Ok;
using DataStringT = Ok;
- HeapTypeT makeFunc() { return Ok{}; }
- HeapTypeT makeAny() { return Ok{}; }
- HeapTypeT makeExtern() { return Ok{}; }
- HeapTypeT makeEq() { return Ok{}; }
- HeapTypeT makeI31() { return Ok{}; }
+ HeapTypeT makeFuncType() { return Ok{}; }
+ HeapTypeT makeAnyType() { return Ok{}; }
+ HeapTypeT makeExternType() { return Ok{}; }
+ HeapTypeT makeEqType() { return Ok{}; }
+ HeapTypeT makeI31Type() { return Ok{}; }
HeapTypeT makeStructType() { return Ok{}; }
HeapTypeT makeArrayType() { return Ok{}; }
+ HeapTypeT makeExnType() { return Ok{}; }
HeapTypeT makeStringType() { return Ok{}; }
HeapTypeT makeStringViewWTF8Type() { return Ok{}; }
HeapTypeT makeStringViewWTF16Type() { return Ok{}; }
HeapTypeT makeStringViewIterType() { return Ok{}; }
+ HeapTypeT makeNoneType() { return Ok{}; }
+ HeapTypeT makeNoextType() { return Ok{}; }
+ HeapTypeT makeNofuncType() { return Ok{}; }
+ HeapTypeT makeNoexnType() { return Ok{}; }
TypeT makeI32() { return Ok{}; }
TypeT makeI64() { return Ok{}; }
@@ -187,17 +192,22 @@ template<typename Ctx> struct TypeParserCtx {
Ctx& self() { return *static_cast<Ctx*>(this); }
- HeapTypeT makeFunc() { return HeapType::func; }
- HeapTypeT makeAny() { return HeapType::any; }
- HeapTypeT makeExtern() { return HeapType::ext; }
- HeapTypeT makeEq() { return HeapType::eq; }
- HeapTypeT makeI31() { return HeapType::i31; }
+ HeapTypeT makeFuncType() { return HeapType::func; }
+ HeapTypeT makeAnyType() { return HeapType::any; }
+ HeapTypeT makeExternType() { return HeapType::ext; }
+ HeapTypeT makeEqType() { return HeapType::eq; }
+ HeapTypeT makeI31Type() { return HeapType::i31; }
HeapTypeT makeStructType() { return HeapType::struct_; }
HeapTypeT makeArrayType() { return HeapType::array; }
+ HeapTypeT makeExnType() { return HeapType::exn; }
HeapTypeT makeStringType() { return HeapType::string; }
HeapTypeT makeStringViewWTF8Type() { return HeapType::stringview_wtf8; }
HeapTypeT makeStringViewWTF16Type() { return HeapType::stringview_wtf16; }
HeapTypeT makeStringViewIterType() { return HeapType::stringview_iter; }
+ HeapTypeT makeNoneType() { return HeapType::none; }
+ HeapTypeT makeNoextType() { return HeapType::noext; }
+ HeapTypeT makeNofuncType() { return HeapType::nofunc; }
+ HeapTypeT makeNoexnType() { return HeapType::noexn; }
TypeT makeI32() { return Type::i32; }
TypeT makeI64() { return Type::i64; }
diff --git a/src/parser/parsers.h b/src/parser/parsers.h
index 28110a628..1ae5cc080 100644
--- a/src/parser/parsers.h
+++ b/src/parser/parsers.h
@@ -236,19 +236,19 @@ template<typename Ctx> WithPosition(Ctx& ctx, Index) -> WithPosition<Ctx>;
// | 'extern' => extern
template<typename Ctx> Result<typename Ctx::HeapTypeT> heaptype(Ctx& ctx) {
if (ctx.in.takeKeyword("func"sv)) {
- return ctx.makeFunc();
+ return ctx.makeFuncType();
}
if (ctx.in.takeKeyword("any"sv)) {
- return ctx.makeAny();
+ return ctx.makeAnyType();
}
if (ctx.in.takeKeyword("extern"sv)) {
- return ctx.makeExtern();
+ return ctx.makeExternType();
}
if (ctx.in.takeKeyword("eq"sv)) {
- return ctx.makeEq();
+ return ctx.makeEqType();
}
if (ctx.in.takeKeyword("i31"sv)) {
- return ctx.makeI31();
+ return ctx.makeI31Type();
}
if (ctx.in.takeKeyword("struct"sv)) {
return ctx.makeStructType();
@@ -256,6 +256,9 @@ template<typename Ctx> Result<typename Ctx::HeapTypeT> heaptype(Ctx& ctx) {
if (ctx.in.takeKeyword("array"sv)) {
return ctx.makeArrayType();
}
+ if (ctx.in.takeKeyword("exn"sv)) {
+ return ctx.makeExnType();
+ }
if (ctx.in.takeKeyword("string"sv)) {
return ctx.makeStringType();
}
@@ -268,6 +271,18 @@ template<typename Ctx> Result<typename Ctx::HeapTypeT> heaptype(Ctx& ctx) {
if (ctx.in.takeKeyword("stringview_iter"sv)) {
return ctx.makeStringViewIterType();
}
+ if (ctx.in.takeKeyword("none"sv)) {
+ return ctx.makeNoneType();
+ }
+ if (ctx.in.takeKeyword("noextern"sv)) {
+ return ctx.makeNoextType();
+ }
+ if (ctx.in.takeKeyword("nofunc"sv)) {
+ return ctx.makeNofuncType();
+ }
+ if (ctx.in.takeKeyword("noexn"sv)) {
+ return ctx.makeNoexnType();
+ }
auto type = typeidx(ctx);
CHECK_ERR(type);
return *type;
@@ -283,19 +298,19 @@ template<typename Ctx> Result<typename Ctx::HeapTypeT> heaptype(Ctx& ctx) {
// | '(' ref null? t:heaptype ')' => ref null? t
template<typename Ctx> MaybeResult<typename Ctx::TypeT> reftype(Ctx& ctx) {
if (ctx.in.takeKeyword("funcref"sv)) {
- return ctx.makeRefType(ctx.makeFunc(), Nullable);
+ return ctx.makeRefType(ctx.makeFuncType(), Nullable);
}
if (ctx.in.takeKeyword("externref"sv)) {
- return ctx.makeRefType(ctx.makeExtern(), Nullable);
+ return ctx.makeRefType(ctx.makeExternType(), Nullable);
}
if (ctx.in.takeKeyword("anyref"sv)) {
- return ctx.makeRefType(ctx.makeAny(), Nullable);
+ return ctx.makeRefType(ctx.makeAnyType(), Nullable);
}
if (ctx.in.takeKeyword("eqref"sv)) {
- return ctx.makeRefType(ctx.makeEq(), Nullable);
+ return ctx.makeRefType(ctx.makeEqType(), Nullable);
}
if (ctx.in.takeKeyword("i31ref"sv)) {
- return ctx.makeRefType(ctx.makeI31(), Nullable);
+ return ctx.makeRefType(ctx.makeI31Type(), Nullable);
}
if (ctx.in.takeKeyword("structref"sv)) {
return ctx.makeRefType(ctx.makeStructType(), Nullable);
@@ -303,6 +318,9 @@ template<typename Ctx> MaybeResult<typename Ctx::TypeT> reftype(Ctx& ctx) {
if (ctx.in.takeKeyword("arrayref"sv)) {
return ctx.makeRefType(ctx.makeArrayType(), Nullable);
}
+ if (ctx.in.takeKeyword("exnref"sv)) {
+ return ctx.makeRefType(ctx.makeExnType(), Nullable);
+ }
if (ctx.in.takeKeyword("stringref"sv)) {
return ctx.makeRefType(ctx.makeStringType(), Nullable);
}
@@ -315,6 +333,18 @@ template<typename Ctx> MaybeResult<typename Ctx::TypeT> reftype(Ctx& ctx) {
if (ctx.in.takeKeyword("stringview_iter"sv)) {
return ctx.makeRefType(ctx.makeStringViewIterType(), Nullable);
}
+ if (ctx.in.takeKeyword("nullref"sv)) {
+ return ctx.makeRefType(ctx.makeNoneType(), Nullable);
+ }
+ if (ctx.in.takeKeyword("nullexternref"sv)) {
+ return ctx.makeRefType(ctx.makeNoextType(), Nullable);
+ }
+ if (ctx.in.takeKeyword("nullfuncref"sv)) {
+ return ctx.makeRefType(ctx.makeNofuncType(), Nullable);
+ }
+ if (ctx.in.takeKeyword("nullexnref"sv)) {
+ return ctx.makeRefType(ctx.makeNoexnType(), Nullable);
+ }
if (!ctx.in.takeSExprStart("ref"sv)) {
return {};