Skip to content

Commit 9c6bc9c

Browse files
committed
Runtime: Generalize TypeMetadataRecords to non-type contexts.
We could introduce non-nominal-type context descriptors, such as those for opaque declarations, which are also interesting to be able to look up for reflection or remote purposes. This should be a backward compatible change with old runtimes, which always ignore any context descriptor kind they don't know about.
1 parent d044696 commit 9c6bc9c

File tree

2 files changed

+21
-20
lines changed

2 files changed

+21
-20
lines changed

include/swift/ABI/Metadata.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ template <typename Runtime> struct TargetStructMetadata;
457457
template <typename Runtime> struct TargetOpaqueMetadata;
458458
template <typename Runtime> struct TargetValueMetadata;
459459
template <typename Runtime> struct TargetForeignClassMetadata;
460+
template <typename Runtime> struct TargetContextDescriptor;
460461
template <typename Runtime> class TargetTypeContextDescriptor;
461462
template <typename Runtime> class TargetClassDescriptor;
462463
template <typename Runtime> class TargetValueTypeDescriptor;
@@ -2085,12 +2086,12 @@ struct TargetTypeMetadataRecord {
20852086
private:
20862087
union {
20872088
/// A direct reference to a nominal type descriptor.
2088-
RelativeDirectPointerIntPair<TargetTypeContextDescriptor<Runtime>,
2089+
RelativeDirectPointerIntPair<TargetContextDescriptor<Runtime>,
20892090
TypeReferenceKind>
20902091
DirectNominalTypeDescriptor;
20912092

20922093
/// An indirect reference to a nominal type descriptor.
2093-
RelativeDirectPointerIntPair<TargetTypeContextDescriptor<Runtime> * const,
2094+
RelativeDirectPointerIntPair<TargetContextDescriptor<Runtime> * const,
20942095
TypeReferenceKind>
20952096
IndirectNominalTypeDescriptor;
20962097

@@ -2103,8 +2104,8 @@ struct TargetTypeMetadataRecord {
21032104
return DirectNominalTypeDescriptor.getInt();
21042105
}
21052106

2106-
const TargetTypeContextDescriptor<Runtime> *
2107-
getTypeContextDescriptor() const {
2107+
const TargetContextDescriptor<Runtime> *
2108+
getContextDescriptor() const {
21082109
switch (getTypeKind()) {
21092110
case TypeReferenceKind::DirectTypeDescriptor:
21102111
return DirectNominalTypeDescriptor.getPointer();

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ swift::swift_registerTypeMetadataRecords(const TypeMetadataRecord *begin,
242242
}
243243

244244
static const ContextDescriptor *
245-
_findNominalTypeDescriptor(Demangle::NodePointer node,
245+
_findContextDescriptor(Demangle::NodePointer node,
246246
Demangle::Demangler &Dem);
247247

248248
/// Find the context descriptor for the type extended by the given extension.
@@ -267,7 +267,7 @@ _findExtendedTypeContextDescriptor(const ExtensionContextDescriptor *extension,
267267
node = Demangle::getUnspecialized(node, demangler);
268268
}
269269

270-
return _findNominalTypeDescriptor(node, demangler);
270+
return _findContextDescriptor(node, demangler);
271271
}
272272

273273
/// Recognize imported tag types, which have a special mangling rule.
@@ -438,7 +438,7 @@ swift::_contextDescriptorMatchesMangling(const ContextDescriptor *context,
438438
DemanglerForRuntimeTypeResolution<> demangler;
439439

440440
auto extendedDescriptorFromNode =
441-
_findNominalTypeDescriptor(extendedContextNode, demangler);
441+
_findContextDescriptor(extendedContextNode, demangler);
442442

443443
Demangle::NodePointer extendedContextDemangled;
444444
auto extendedDescriptorFromDemangled =
@@ -581,14 +581,14 @@ swift::_contextDescriptorMatchesMangling(const ContextDescriptor *context,
581581
}
582582

583583
// returns the nominal type descriptor for the type named by typeName
584-
static const TypeContextDescriptor *
584+
static const ContextDescriptor *
585585
_searchTypeMetadataRecords(TypeMetadataPrivateState &T,
586586
Demangle::NodePointer node) {
587587
for (auto &section : T.SectionsToScan.snapshot()) {
588588
for (const auto &record : section) {
589-
if (auto ntd = record.getTypeContextDescriptor()) {
590-
if (_contextDescriptorMatchesMangling(ntd, node)) {
591-
return ntd;
589+
if (auto context = record.getContextDescriptor()) {
590+
if (_contextDescriptorMatchesMangling(context, node)) {
591+
return context;
592592
}
593593
}
594594
}
@@ -598,9 +598,9 @@ _searchTypeMetadataRecords(TypeMetadataPrivateState &T,
598598
}
599599

600600
static const ContextDescriptor *
601-
_findNominalTypeDescriptor(Demangle::NodePointer node,
601+
_findContextDescriptor(Demangle::NodePointer node,
602602
Demangle::Demangler &Dem) {
603-
const ContextDescriptor *foundNominal = nullptr;
603+
const ContextDescriptor *foundContext = nullptr;
604604
auto &T = TypeMetadataRecords.get();
605605

606606
// If we have a symbolic reference to a context, resolve it immediately.
@@ -620,18 +620,18 @@ _findNominalTypeDescriptor(Demangle::NodePointer node,
620620
return Value->getDescription();
621621

622622
// Check type metadata records
623-
foundNominal = _searchTypeMetadataRecords(T, node);
623+
foundContext = _searchTypeMetadataRecords(T, node);
624624

625625
// Check protocol conformances table. Note that this has no support for
626626
// resolving generic types yet.
627-
if (!foundNominal)
628-
foundNominal = _searchConformancesByMangledTypeName(node);
627+
if (!foundContext)
628+
foundContext = _searchConformancesByMangledTypeName(node);
629629

630-
if (foundNominal) {
631-
T.NominalCache.getOrInsert(mangledName, foundNominal);
630+
if (foundContext) {
631+
T.NominalCache.getOrInsert(mangledName, foundContext);
632632
}
633633

634-
return foundNominal;
634+
return foundContext;
635635
}
636636

637637
#pragma mark Protocol descriptor cache
@@ -1107,7 +1107,7 @@ class DecodedMetadataBuilder {
11071107
BuiltTypeDecl createTypeDecl(NodePointer node,
11081108
bool &typeAlias) const {
11091109
// Look for a nominal type descriptor based on its mangled name.
1110-
return _findNominalTypeDescriptor(node, demangler);
1110+
return _findContextDescriptor(node, demangler);
11111111
}
11121112

11131113
BuiltProtocolDecl createProtocolDecl(NodePointer node) const {

0 commit comments

Comments
 (0)