@@ -929,6 +929,85 @@ class MetadataReader {
929929 TypeCache[MetadataAddress] = BuiltExist;
930930 return BuiltExist;
931931 }
932+ case MetadataKind::ExtendedExistential: {
933+ auto Exist = cast<TargetExtendedExistentialTypeMetadata<Runtime>>(Meta);
934+
935+ // Read the shape for this existential.
936+ StoredPointer shapeAddress = stripSignedPointer (Exist->Shape );
937+ ShapeRef Shape = readShape (shapeAddress);
938+ if (!Shape)
939+ return BuiltType ();
940+
941+ const unsigned shapeArgumentCount
942+ = Shape->getGenSigArgumentLayoutSizeInWords ();
943+ // Pull out the arguments to the generalization signature.
944+ assert (Shape->hasGeneralizationSignature ());
945+ std::vector<BuiltType> builtArgs;
946+ for (unsigned i = 0 ; i < shapeArgumentCount; ++i) {
947+ auto remoteArg = Exist->getGeneralizationArguments ()[i];
948+ auto builtArg = readTypeFromMetadata (remoteArg);
949+ if (!builtArg)
950+ return BuiltType ();
951+ builtArgs.push_back (builtArg);
952+ }
953+
954+ // Pull out the existential type from the mangled type name.
955+ Demangler dem;
956+ auto mangledExistentialAddr =
957+ resolveRelativeField (Shape, Shape->ExistentialType );
958+ auto node = readMangledName (RemoteAddress (mangledExistentialAddr),
959+ MangledNameKind::Type, dem);
960+ if (!node)
961+ return BuiltType ();
962+
963+ BuiltType builtProto = decodeMangledType (node).getType ();
964+ if (!builtProto)
965+ return BuiltType ();
966+
967+ // Build up a substitution map for the generalized signature.
968+ BuiltGenericSignature sig =
969+ decodeRuntimeGenericSignature (Shape,
970+ Shape->getGeneralizationSignature ())
971+ .getType ();
972+ if (!sig)
973+ return BuiltType ();
974+
975+ BuiltSubstitutionMap subst =
976+ Builder.createSubstitutionMap (sig, builtArgs);
977+ if (subst.empty ())
978+ return BuiltType ();
979+
980+ builtProto = Builder.subst (builtProto, subst);
981+ if (!builtProto)
982+ return BuiltType ();
983+
984+ // Read the type expression to build up any remaining layers of
985+ // existential metatype.
986+ if (Shape->Flags .hasTypeExpression ()) {
987+ Demangler dem;
988+
989+ // Read the mangled name.
990+ auto mangledContextName = Shape->getTypeExpression ();
991+ auto mangledNameAddress =
992+ resolveRelativeField (Shape, mangledContextName->name );
993+ auto node = readMangledName (RemoteAddress (mangledNameAddress),
994+ MangledNameKind::Type, dem);
995+ if (!node)
996+ return BuiltType ();
997+
998+ while (node->getKind () == Demangle::Node::Kind::Type &&
999+ node->getNumChildren () &&
1000+ node->getChild (0 )->getKind () == Demangle::Node::Kind::Metatype &&
1001+ node->getChild (0 )->getNumChildren ()) {
1002+ builtProto = Builder.createExistentialMetatypeType (builtProto);
1003+ node = node->getChild (0 )->getChild (0 );
1004+ }
1005+ }
1006+
1007+ TypeCache[MetadataAddress] = builtProto;
1008+ return builtProto;
1009+ }
1010+
9321011 case MetadataKind::Metatype: {
9331012 auto Metatype = cast<TargetMetatypeMetadata<Runtime>>(Meta);
9341013 auto Instance = readTypeFromMetadata (Metatype->InstanceType );
@@ -1044,7 +1123,7 @@ class MetadataReader {
10441123 break ;
10451124 }
10461125 case GenericRequirementKind::Protocol: {
1047- // / Resolver to turn a protocol reference into a protocol declaration .
1126+ // / Resolver to turn a protocol reference into an existential type .
10481127 struct ProtocolReferenceResolver {
10491128 using Result = BuiltType;
10501129
@@ -1895,6 +1974,8 @@ class MetadataReader {
18951974 }
18961975 case MetadataKind::ExistentialMetatype:
18971976 return _readMetadata<TargetExistentialMetatypeMetadata>(address);
1977+ case MetadataKind::ExtendedExistential:
1978+ return _readMetadata<TargetExtendedExistentialTypeMetadata>(address);
18981979 case MetadataKind::ForeignClass:
18991980 return _readMetadata<TargetForeignClassMetadata>(address);
19001981 case MetadataKind::Function: {
0 commit comments