@@ -996,6 +996,119 @@ class MetadataReader {
996
996
swift_unreachable (" Unhandled MetadataKind in switch" );
997
997
}
998
998
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
+
999
1112
TypeLookupErrorOr<typename BuilderType::BuiltType>
1000
1113
readTypeFromMangledName (const char *MangledTypeName, size_t Length) {
1001
1114
Demangle::Demangler Dem;
@@ -2201,8 +2314,9 @@ class MetadataReader {
2201
2314
// / Resolve a relative target protocol descriptor pointer, which uses
2202
2315
// / the lowest bit to indicate an indirect vs. direct relative reference and
2203
2316
// / the second lowest bit to indicate whether it is an Objective-C protocol.
2317
+ template <typename Base>
2204
2318
StoredPointer resolveRelativeIndirectProtocol (
2205
- ContextDescriptorRef descriptor,
2319
+ RemoteRef<Base> descriptor,
2206
2320
const RelativeTargetProtocolDescriptorPointer<Runtime> &protocol) {
2207
2321
// Map the offset from within our local buffer to the remote address.
2208
2322
auto distance = (intptr_t )&protocol - (intptr_t )descriptor.getLocalBuffer ();
0 commit comments