@@ -996,6 +996,119 @@ class MetadataReader {
996996 swift_unreachable (" Unhandled MetadataKind in switch" );
997997 }
998998
999+ TypeLookupErrorOr<typename BuilderType::BuiltGenericSignature>
1000+ decodeRuntimeGenericSignature (ShapeRef contextRef,
1001+ const RuntimeGenericSignature<Runtime> &Sig) {
1002+ std::vector<BuiltType> params;
1003+ for (unsigned sigIdx : indices (Sig.getParams ())) {
1004+ auto param =
1005+ Builder.createGenericTypeParameterType (/* depth*/ 0 , /* index*/ sigIdx);
1006+ if (!param)
1007+ return TypeLookupError (" Failed to read generic parameter type in "
1008+ " runtime generic signature." );
1009+ params.push_back (param);
1010+ }
1011+
1012+ std::vector<BuiltRequirement> reqs;
1013+ for (auto &req : Sig.getRequirements ()) {
1014+ if (!req.hasKnownKind ()) {
1015+ return TypeLookupError (" unknown kind" );
1016+ }
1017+
1018+ Demangler ldem;
1019+ auto lhsTypeNode = ldem.demangleType (req.getParam ());
1020+ if (!lhsTypeNode) {
1021+ return TypeLookupError (" Failed to read subject type in requirement of "
1022+ " runtime generic signature." );
1023+ }
1024+
1025+ BuiltType subjectType = decodeMangledType (lhsTypeNode).getType ();
1026+ if (!subjectType)
1027+ return TypeLookupError (" Failed to read subject type in requirement of "
1028+ " runtime generic signature." );
1029+
1030+ switch (req.Flags .getKind ()) {
1031+ case GenericRequirementKind::SameType: {
1032+ Demangler rdem;
1033+ auto demangledConstraint =
1034+ demangle (RemoteRef<char >(req.getMangledTypeName ().data (),
1035+ req.getMangledTypeName ().data ()),
1036+ MangledNameKind::Type, rdem);
1037+ auto constraintType = decodeMangledType (demangledConstraint);
1038+ if (auto *error = constraintType.getError ()) {
1039+ return *error;
1040+ }
1041+
1042+ reqs.push_back (BuiltRequirement (RequirementKind::SameType, subjectType,
1043+ constraintType.getType ()));
1044+ break ;
1045+ }
1046+ case GenericRequirementKind::Protocol: {
1047+ // / Resolver to turn a protocol reference into a protocol declaration.
1048+ struct ProtocolReferenceResolver {
1049+ using Result = BuiltType;
1050+
1051+ BuilderType &builder;
1052+
1053+ BuiltType failure () const { return BuiltType (); }
1054+
1055+ BuiltType swiftProtocol (Demangle::Node *node) {
1056+ auto decl = builder.createProtocolDecl (node);
1057+ if (!decl)
1058+ return failure ();
1059+ return builder.createProtocolTypeFromDecl (decl);
1060+ }
1061+
1062+ #if SWIFT_OBJC_INTEROP
1063+ BuiltType objcProtocol (StringRef name) {
1064+ auto decl = builder.createObjCProtocolDecl (name.str ());
1065+ if (!decl)
1066+ return failure ();
1067+ return builder.createProtocolTypeFromDecl (decl);
1068+ }
1069+ #endif
1070+ } resolver{Builder};
1071+
1072+ Demangler dem;
1073+ auto protocolAddress =
1074+ resolveRelativeIndirectProtocol (contextRef, req.Protocol );
1075+ auto protocol = readProtocol (protocolAddress, dem, resolver);
1076+ if (!protocol) {
1077+ return TypeLookupError (" Failed to read protocol type in conformance "
1078+ " requirement of runtime generic signature." );
1079+ }
1080+
1081+ reqs.push_back (BuiltRequirement (RequirementKind::Conformance,
1082+ subjectType, protocol));
1083+ break ;
1084+ }
1085+ case GenericRequirementKind::BaseClass: {
1086+ Demangler rdem;
1087+ auto demangledConstraint =
1088+ demangle (RemoteRef<char >(req.getMangledTypeName ().data (),
1089+ req.getMangledTypeName ().data ()),
1090+ MangledNameKind::Type, rdem);
1091+ auto constraintType = decodeMangledType (demangledConstraint);
1092+ if (auto *error = constraintType.getError ()) {
1093+ return *error;
1094+ }
1095+
1096+ reqs.push_back (BuiltRequirement (RequirementKind::Superclass,
1097+ subjectType, constraintType.getType ()));
1098+ break ;
1099+ }
1100+ case GenericRequirementKind::SameConformance:
1101+ return TypeLookupError (" Unexpected same conformance requirement in "
1102+ " runtime generic signature" );
1103+ case GenericRequirementKind::Layout:
1104+ return TypeLookupError (
1105+ " Unexpected layout requirement in runtime generic signature" );
1106+ }
1107+ }
1108+
1109+ return Builder.createGenericSignature (params, reqs);
1110+ }
1111+
9991112 TypeLookupErrorOr<typename BuilderType::BuiltType>
10001113 readTypeFromMangledName (const char *MangledTypeName, size_t Length) {
10011114 Demangle::Demangler Dem;
@@ -2201,8 +2314,9 @@ class MetadataReader {
22012314 // / Resolve a relative target protocol descriptor pointer, which uses
22022315 // / the lowest bit to indicate an indirect vs. direct relative reference and
22032316 // / the second lowest bit to indicate whether it is an Objective-C protocol.
2317+ template <typename Base>
22042318 StoredPointer resolveRelativeIndirectProtocol (
2205- ContextDescriptorRef descriptor,
2319+ RemoteRef<Base> descriptor,
22062320 const RelativeTargetProtocolDescriptorPointer<Runtime> &protocol) {
22072321 // Map the offset from within our local buffer to the remote address.
22082322 auto distance = (intptr_t )&protocol - (intptr_t )descriptor.getLocalBuffer ();
0 commit comments