@@ -496,6 +496,10 @@ fuzztest::Domain<HeapTypePlan> AvailableStrictSubHeapType(TypeBuilderPlan plan,
496496 return matchingOrAbstract (
497497 [](auto kind) { return kind == ContKind; },
498498 fuzztest::Just (HeapType (HeapTypes::nocont.getBasic (share))));
499+ case HeapType::handler:
500+ return matchingOrAbstract (
501+ [](auto kind) { return kind == HandlerKind; },
502+ fuzztest::Just (HeapType (HeapTypes::nocont.getBasic (share))));
499503 case HeapType::any:
500504 return matchingOrAbstract (
501505 [](auto kind) { return kind == StructKind || kind == ArrayKind; },
@@ -532,6 +536,7 @@ fuzztest::Domain<HeapTypePlan> AvailableStrictSubHeapType(TypeBuilderPlan plan,
532536 case HeapType::nofunc:
533537 case HeapType::nocont:
534538 case HeapType::noexn:
539+ case HeapType::nohandler:
535540 // No strict subtypes, so just return super.
536541 return fuzztest::Just (super);
537542 }
@@ -586,6 +591,7 @@ AvailableStrictSuperHeapType(TypeBuilderPlan plan, HeapTypePlan sub) {
586591 case HeapType::cont:
587592 case HeapType::any:
588593 case HeapType::exn:
594+ case HeapType::handler:
589595 // No strict supertypes, so just return sub.
590596 return fuzztest::Just (sub);
591597 case HeapType::eq:
@@ -617,6 +623,10 @@ AvailableStrictSuperHeapType(TypeBuilderPlan plan, HeapTypePlan sub) {
617623 return matchingOrAbstract (
618624 [](auto kind) { return kind == ContKind; },
619625 fuzztest::Just (HeapType (HeapTypes::cont.getBasic (share))));
626+ case HeapType::nohandler:
627+ return matchingOrAbstract (
628+ [](auto kind) { return kind == HandlerKind; },
629+ fuzztest::Just (HeapType (HeapTypes::handler.getBasic (share))));
620630 case HeapType::noexn:
621631 return fuzztest::Just (
622632 HeapTypePlan{HeapType (HeapTypes::exn.getBasic (share))});
@@ -1134,6 +1144,15 @@ void TestBuiltTypes(std::pair<std::vector<HeapType>, TypeBuilderPlan> pair) {
11341144 }
11351145 };
11361146
1147+ auto checkHandler = [&](HandlerPlan& plan, HeapType type) {
1148+ ASSERT_TRUE (type.isHandler ());
1149+ auto value_types = type.getHandler ().value_types ;
1150+ ASSERT_EQ (plan.size (), value_types.size ());
1151+ for (size_t i = 0 ; i < plan.size (); ++i) {
1152+ checkType (plan[i], value_types[i]);
1153+ }
1154+ };
1155+
11371156 auto checkDef = [&](TypeDefPlan& plan, HeapType type) {
11381157 if (auto * f = plan.getFunc ()) {
11391158 checkFunc (*f, type);
@@ -1143,6 +1162,8 @@ void TestBuiltTypes(std::pair<std::vector<HeapType>, TypeBuilderPlan> pair) {
11431162 checkArray (*a, type);
11441163 } else if (auto * c = plan.getCont ()) {
11451164 checkCont (*c, type);
1165+ } else if (auto * h = plan.getHandler ()) {
1166+ checkCont (*h, type);
11461167 } else {
11471168 WASM_UNREACHABLE (" unexpected variant" );
11481169 }
0 commit comments