@@ -496,6 +496,10 @@ fuzztest::Domain<HeapTypePlan> AvailableStrictSubHeapType(TypeBuilderPlan plan,
496
496
return matchingOrAbstract (
497
497
[](auto kind) { return kind == ContKind; },
498
498
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))));
499
503
case HeapType::any:
500
504
return matchingOrAbstract (
501
505
[](auto kind) { return kind == StructKind || kind == ArrayKind; },
@@ -532,6 +536,7 @@ fuzztest::Domain<HeapTypePlan> AvailableStrictSubHeapType(TypeBuilderPlan plan,
532
536
case HeapType::nofunc:
533
537
case HeapType::nocont:
534
538
case HeapType::noexn:
539
+ case HeapType::nohandler:
535
540
// No strict subtypes, so just return super.
536
541
return fuzztest::Just (super);
537
542
}
@@ -586,6 +591,7 @@ AvailableStrictSuperHeapType(TypeBuilderPlan plan, HeapTypePlan sub) {
586
591
case HeapType::cont:
587
592
case HeapType::any:
588
593
case HeapType::exn:
594
+ case HeapType::handler:
589
595
// No strict supertypes, so just return sub.
590
596
return fuzztest::Just (sub);
591
597
case HeapType::eq:
@@ -617,6 +623,10 @@ AvailableStrictSuperHeapType(TypeBuilderPlan plan, HeapTypePlan sub) {
617
623
return matchingOrAbstract (
618
624
[](auto kind) { return kind == ContKind; },
619
625
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))));
620
630
case HeapType::noexn:
621
631
return fuzztest::Just (
622
632
HeapTypePlan{HeapType (HeapTypes::exn.getBasic (share))});
@@ -1134,6 +1144,15 @@ void TestBuiltTypes(std::pair<std::vector<HeapType>, TypeBuilderPlan> pair) {
1134
1144
}
1135
1145
};
1136
1146
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
+
1137
1156
auto checkDef = [&](TypeDefPlan& plan, HeapType type) {
1138
1157
if (auto * f = plan.getFunc ()) {
1139
1158
checkFunc (*f, type);
@@ -1143,6 +1162,8 @@ void TestBuiltTypes(std::pair<std::vector<HeapType>, TypeBuilderPlan> pair) {
1143
1162
checkArray (*a, type);
1144
1163
} else if (auto * c = plan.getCont ()) {
1145
1164
checkCont (*c, type);
1165
+ } else if (auto * h = plan.getHandler ()) {
1166
+ checkCont (*h, type);
1146
1167
} else {
1147
1168
WASM_UNREACHABLE (" unexpected variant" );
1148
1169
}
0 commit comments