Skip to content

Commit c0f2f99

Browse files
committed
Read Runtime Generic Signatures
1 parent 1594cdb commit c0f2f99

File tree

1 file changed

+115
-1
lines changed

1 file changed

+115
-1
lines changed

include/swift/Remote/MetadataReader.h

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)