@@ -184,6 +184,9 @@ std::ostream& operator<<(std::ostream& o, const TypeBuilderPlan& plan) {
184184 case ContKind:
185185 o << " s" ;
186186 break ;
187+ case HandlerKind:
188+ o << " h" ;
189+ break ;
187190 }
188191 if (auto super = plan.supertypes [i]) {
189192 o << " (" << *super << " )" ;
@@ -558,6 +561,9 @@ fuzztest::Domain<HeapTypePlan> AvailableStrictSubHeapType(TypeBuilderPlan plan,
558561 case ContKind:
559562 bottom = HeapTypes::nocont.getBasic (share);
560563 break ;
564+ case HandlerKind:
565+ bottom = HeapTypes::nohandler.getBasic (share);
566+ break ;
561567 }
562568 if (matches.empty ()) {
563569 return fuzztest::Just (HeapTypePlan{bottom});
@@ -659,6 +665,9 @@ AvailableStrictSuperHeapType(TypeBuilderPlan plan, HeapTypePlan sub) {
659665 case ContKind:
660666 abstract = {HeapTypes::cont.getBasic (share)};
661667 break ;
668+ case HandlerKind:
669+ abstract = {HeapTypes::handler.getBasic (share)};
670+ break ;
662671 }
663672 assert (!abstract.empty ());
664673 if (possibleIndices.empty ()) {
@@ -894,6 +903,22 @@ fuzztest::Domain<ContPlan> SubContDef(TypeBuilderPlan plan, ContPlan super) {
894903 }
895904}
896905
906+ fuzztest::Domain<HandlerPlan> HandlerDef (TypeBuilderPlan plan) {
907+ auto results = fuzztest::VectorOf (AvailableType (std::move (plan)))
908+ .WithMaxSize (MaxResultsSize);
909+ return fuzztest::Just (results);
910+ }
911+
912+ fuzztest::Domain<HandlerPlan> SubHandlerDef (TypeBuilderPlan plan,
913+ HandlerPlan super) {
914+ auto results = MapElements (
915+ [plan = std::move (plan)](TypePlan type) {
916+ return AvailableSubType (std::move (plan), type);
917+ },
918+ super.second );
919+ return fuzztest::Just (results);
920+ }
921+
897922fuzztest::Domain<TypeBuilderPlan> StepTypeDefinition (TypeBuilderPlan plan);
898923
899924template <typename T>
@@ -942,6 +967,12 @@ fuzztest::Domain<TypeBuilderPlan> StepTypeDefinition(TypeBuilderPlan plan) {
942967 return fuzztest::FlatMap (
943968 AppendTypeDef<ContPlan>, fuzztest::Just (std::move (plan)), def);
944969 }
970+ case ContKind: {
971+ auto def = super ? SubHandlerDef (plan, *plan.defs [*super].getHandler ())
972+ : HandlerDef (plan);
973+ return fuzztest::FlatMap (
974+ AppendTypeDef<HandlerPlan>, fuzztest::Just (std::move (plan)), def);
975+ }
945976 }
946977 WASM_UNREACHABLE (" unexpected kind" );
947978}
@@ -1146,10 +1177,10 @@ void TestBuiltTypes(std::pair<std::vector<HeapType>, TypeBuilderPlan> pair) {
11461177
11471178 auto checkHandler = [&](HandlerPlan& plan, HeapType type) {
11481179 ASSERT_TRUE (type.isHandler ());
1149- auto value_types = type.getHandler ().value_types ;
1150- ASSERT_EQ (plan.size (), value_types .size ());
1180+ auto results = type.getHandler ().results ;
1181+ ASSERT_EQ (plan.size (), results .size ());
11511182 for (size_t i = 0 ; i < plan.size (); ++i) {
1152- checkType (plan[i], value_types [i]);
1183+ checkType (plan[i], results [i]);
11531184 }
11541185 };
11551186
@@ -1163,7 +1194,7 @@ void TestBuiltTypes(std::pair<std::vector<HeapType>, TypeBuilderPlan> pair) {
11631194 } else if (auto * c = plan.getCont ()) {
11641195 checkCont (*c, type);
11651196 } else if (auto * h = plan.getHandler ()) {
1166- checkCont (*h, type);
1197+ checkHandler (*h, type);
11671198 } else {
11681199 WASM_UNREACHABLE (" unexpected variant" );
11691200 }
0 commit comments