diff --git a/include/swift/Reflection/TypeRefBuilder.h b/include/swift/Reflection/TypeRefBuilder.h index 05e64bfa509d7..5e088c1cb36de 100644 --- a/include/swift/Reflection/TypeRefBuilder.h +++ b/include/swift/Reflection/TypeRefBuilder.h @@ -630,7 +630,7 @@ class TypeRefBuilder { private: std::vector ReflectionInfos; - std::string normalizeReflectionName(RemoteRef name); + llvm::Optional normalizeReflectionName(RemoteRef name); bool reflectionNameMatches(RemoteRef reflectionName, StringRef searchName); @@ -654,7 +654,7 @@ class TypeRefBuilder { // TypeRefBuilder struct, to isolate its template-ness from the rest of // TypeRefBuilder. unsigned PointerSize; - std::function)> + std::function, bool)> TypeRefDemangler; std::function OpaqueUnderlyingTypeReader; @@ -665,10 +665,10 @@ class TypeRefBuilder { : TC(*this), PointerSize(sizeof(typename Runtime::StoredPointer)), TypeRefDemangler( - [this, &reader](RemoteRef string) -> Demangle::Node * { + [this, &reader](RemoteRef string, bool useOpaqueTypeSymbolicReferences) -> Demangle::Node * { return reader.demangle(string, remote::MangledNameKind::Type, - Dem, /*useOpaqueTypeSymbolicReferences*/ true); + Dem, useOpaqueTypeSymbolicReferences); }), OpaqueUnderlyingTypeReader( [&reader](uint64_t descriptorAddr, unsigned ordinal) -> const TypeRef* { @@ -677,8 +677,9 @@ class TypeRefBuilder { }) {} - Demangle::Node *demangleTypeRef(RemoteRef string) { - return TypeRefDemangler(string); + Demangle::Node *demangleTypeRef(RemoteRef string, + bool useOpaqueTypeSymbolicReferences = true) { + return TypeRefDemangler(string, useOpaqueTypeSymbolicReferences); } TypeConverter &getTypeConverter() { return TC; } diff --git a/stdlib/public/Reflection/TypeRefBuilder.cpp b/stdlib/public/Reflection/TypeRefBuilder.cpp index fb7fcc7b8e6b9..13d07b742a00a 100644 --- a/stdlib/public/Reflection/TypeRefBuilder.cpp +++ b/stdlib/public/Reflection/TypeRefBuilder.cpp @@ -84,13 +84,22 @@ RemoteRef TypeRefBuilder::readTypeRef(uint64_t remoteAddr) { } /// Load and normalize a mangled name so it can be matched with string equality. -std::string +llvm::Optional TypeRefBuilder::normalizeReflectionName(RemoteRef reflectionName) { // Remangle the reflection name to resolve symbolic references. - if (auto node = demangleTypeRef(reflectionName)) { - auto result = mangleNode(node); - clearNodeFactory(); - return result; + if (auto node = demangleTypeRef(reflectionName, + /*useOpaqueTypeSymbolicReferences*/ false)) { + switch (node->getKind()) { + case Node::Kind::TypeSymbolicReference: + case Node::Kind::ProtocolSymbolicReference: + case Node::Kind::OpaqueTypeDescriptorSymbolicReference: + // Symbolic references cannot be mangled, return a failure. + return {}; + default: + auto result = mangleNode(node); + clearNodeFactory(); + return result; + } } // Fall back to the raw string. @@ -102,7 +111,9 @@ bool TypeRefBuilder::reflectionNameMatches(RemoteRef reflectionName, StringRef searchName) { auto normalized = normalizeReflectionName(reflectionName); - return searchName.equals(normalized); + if (!normalized) + return false; + return searchName.equals(*normalized); } const TypeRef * TypeRefBuilder:: @@ -194,8 +205,8 @@ TypeRefBuilder::getFieldTypeInfo(const TypeRef *TR) { if (!FD->hasMangledTypeName()) continue; auto CandidateMangledName = readTypeRef(FD, FD->MangledTypeName); - auto NormalizedName = normalizeReflectionName(CandidateMangledName); - FieldTypeInfoCache[NormalizedName] = FD; + if (auto NormalizedName = normalizeReflectionName(CandidateMangledName)) + FieldTypeInfoCache[*NormalizedName] = FD; } }