summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser/contexts.h4
-rw-r--r--src/parser/parsers.h12
-rw-r--r--test/lit/wat-kitchen-sink.wast6
3 files changed, 20 insertions, 2 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h
index 0979461a0..d68d475a0 100644
--- a/src/parser/contexts.h
+++ b/src/parser/contexts.h
@@ -112,10 +112,12 @@ struct NullTypeParserCtx {
HeapTypeT makeStringViewWTF8Type() { return Ok{}; }
HeapTypeT makeStringViewWTF16Type() { return Ok{}; }
HeapTypeT makeStringViewIterType() { return Ok{}; }
+ HeapTypeT makeContType() { return Ok{}; }
HeapTypeT makeNoneType() { return Ok{}; }
HeapTypeT makeNoextType() { return Ok{}; }
HeapTypeT makeNofuncType() { return Ok{}; }
HeapTypeT makeNoexnType() { return Ok{}; }
+ HeapTypeT makeNocontType() { return Ok{}; }
TypeT makeI32() { return Ok{}; }
TypeT makeI64() { return Ok{}; }
@@ -211,10 +213,12 @@ template<typename Ctx> struct TypeParserCtx {
HeapTypeT makeStringViewWTF8Type() { return HeapType::stringview_wtf8; }
HeapTypeT makeStringViewWTF16Type() { return HeapType::stringview_wtf16; }
HeapTypeT makeStringViewIterType() { return HeapType::stringview_iter; }
+ HeapTypeT makeContType() { return HeapType::cont; }
HeapTypeT makeNoneType() { return HeapType::none; }
HeapTypeT makeNoextType() { return HeapType::noext; }
HeapTypeT makeNofuncType() { return HeapType::nofunc; }
HeapTypeT makeNoexnType() { return HeapType::noexn; }
+ HeapTypeT makeNocontType() { return HeapType::nocont; }
TypeT makeI32() { return Type::i32; }
TypeT makeI64() { return Type::i64; }
diff --git a/src/parser/parsers.h b/src/parser/parsers.h
index 51b5d8f9e..bcae62e14 100644
--- a/src/parser/parsers.h
+++ b/src/parser/parsers.h
@@ -425,6 +425,9 @@ template<typename Ctx> Result<typename Ctx::HeapTypeT> heaptype(Ctx& ctx) {
if (ctx.in.takeKeyword("stringview_iter"sv)) {
return ctx.makeStringViewIterType();
}
+ if (ctx.in.takeKeyword("cont"sv)) {
+ return ctx.makeContType();
+ }
if (ctx.in.takeKeyword("none"sv)) {
return ctx.makeNoneType();
}
@@ -437,6 +440,9 @@ template<typename Ctx> Result<typename Ctx::HeapTypeT> heaptype(Ctx& ctx) {
if (ctx.in.takeKeyword("noexn"sv)) {
return ctx.makeNoexnType();
}
+ if (ctx.in.takeKeyword("nocont"sv)) {
+ return ctx.makeNocontType();
+ }
auto type = typeidx(ctx);
CHECK_ERR(type);
return *type;
@@ -487,6 +493,9 @@ 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("contref"sv)) {
+ return ctx.makeRefType(ctx.makeContType(), Nullable);
+ }
if (ctx.in.takeKeyword("nullref"sv)) {
return ctx.makeRefType(ctx.makeNoneType(), Nullable);
}
@@ -499,6 +508,9 @@ template<typename Ctx> MaybeResult<typename Ctx::TypeT> reftype(Ctx& ctx) {
if (ctx.in.takeKeyword("nullexnref"sv)) {
return ctx.makeRefType(ctx.makeNoexnType(), Nullable);
}
+ if (ctx.in.takeKeyword("nullcontref"sv)) {
+ return ctx.makeRefType(ctx.makeNocontType(), Nullable);
+ }
if (!ctx.in.takeSExprStart("ref"sv)) {
return {};
diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast
index c56523af1..e67d3f438 100644
--- a/test/lit/wat-kitchen-sink.wast
+++ b/test/lit/wat-kitchen-sink.wast
@@ -250,7 +250,7 @@
(type $cont-bind-before-func (func (param i32) (param i64) (param i32) (param i64) (result f32)))
(type $cont-bind-before (cont $cont-bind-before-func))
- ;; CHECK: (type $all-types (struct (field externref) (field (ref extern)) (field funcref) (field (ref func)) (field anyref) (field (ref any)) (field eqref) (field (ref eq)) (field i31ref) (field (ref i31)) (field structref) (field (ref struct)) (field arrayref) (field (ref array)) (field exnref) (field (ref exn)) (field stringref) (field (ref string)) (field stringview_wtf8) (field (ref stringview_wtf8)) (field stringview_wtf16) (field (ref stringview_wtf16)) (field stringview_iter) (field (ref stringview_iter)) (field nullref) (field (ref none)) (field nullexternref) (field (ref noextern)) (field nullfuncref) (field (ref nofunc)) (field nullexnref) (field (ref noexn))))
+ ;; CHECK: (type $all-types (struct (field externref) (field (ref extern)) (field funcref) (field (ref func)) (field anyref) (field (ref any)) (field eqref) (field (ref eq)) (field i31ref) (field (ref i31)) (field structref) (field (ref struct)) (field arrayref) (field (ref array)) (field exnref) (field (ref exn)) (field stringref) (field (ref string)) (field stringview_wtf8) (field (ref stringview_wtf8)) (field stringview_wtf16) (field (ref stringview_wtf16)) (field stringview_iter) (field (ref stringview_iter)) (field contref) (field (ref cont)) (field nullref) (field (ref none)) (field nullexternref) (field (ref noextern)) (field nullfuncref) (field (ref nofunc)) (field nullexnref) (field (ref noexn)) (field nullcontref) (field (ref nocont))))
(type $all-types (struct externref (ref extern)
funcref (ref func)
anyref (ref any)
@@ -263,10 +263,12 @@
stringview_wtf8 (ref stringview_wtf8)
stringview_wtf16 (ref stringview_wtf16)
stringview_iter (ref stringview_iter)
+ contref (ref cont)
nullref (ref none)
nullexternref (ref noextern)
nullfuncref (ref nofunc)
- nullexnref (ref noexn)))
+ nullexnref (ref noexn)
+ nullcontref (ref nocont)))
;; imported memories
(memory (export "mem") (export "mem2") (import "" "mem") 0)