@@ -2125,6 +2125,57 @@ struct GenericWitnessTable {
2125
2125
void *PrivateData[swift::NumGenericMetadataPrivateDataWords];
2126
2126
};
2127
2127
2128
+ // / The structure of a type metadata record.
2129
+ // /
2130
+ // / This contains enough static information to recover type metadata from a
2131
+ // / name. It is only emitted for types that do not have an explicit protocol
2132
+ // / conformance record.
2133
+ // /
2134
+ // / This structure is notionally a subtype of a protocol conformance record
2135
+ // / but as we cannot change the conformance record layout we have to make do
2136
+ // / with some duplicated code.
2137
+ struct TypeMetadataRecord {
2138
+ private:
2139
+ // Some description of the type that is resolvable at runtime.
2140
+ union {
2141
+ // / A direct reference to the metadata.
2142
+ RelativeDirectPointer<Metadata> DirectType;
2143
+
2144
+ // / The generic metadata pattern for an unbound generic type.
2145
+ RelativeDirectPointer<GenericMetadata> GenericPattern;
2146
+ };
2147
+
2148
+ // / Flags describing the type metadata record.
2149
+ TypeMetadataRecordFlags Flags;
2150
+
2151
+ public:
2152
+ TypeMetadataRecordKind getTypeKind () const {
2153
+ return Flags.getTypeKind ();
2154
+ }
2155
+
2156
+ const Metadata *getDirectType () const {
2157
+ switch (Flags.getTypeKind ()) {
2158
+ case TypeMetadataRecordKind::Universal:
2159
+ return nullptr ;
2160
+
2161
+ case TypeMetadataRecordKind::UniqueDirectType:
2162
+ case TypeMetadataRecordKind::NonuniqueDirectType:
2163
+ case TypeMetadataRecordKind::UniqueDirectClass:
2164
+ break ;
2165
+
2166
+ case TypeMetadataRecordKind::UniqueIndirectClass:
2167
+ case TypeMetadataRecordKind::UniqueGenericPattern:
2168
+ assert (false && " not direct type metadata" );
2169
+ }
2170
+
2171
+ return DirectType;
2172
+ }
2173
+
2174
+ // / Get the canonical metadata for the type referenced by this record, or
2175
+ // / return null if the record references a generic or universal type.
2176
+ const Metadata *getCanonicalTypeMetadata () const ;
2177
+ };
2178
+
2128
2179
// / The structure of a protocol conformance record.
2129
2180
// /
2130
2181
// / This contains enough static information to recover the witness table for a
@@ -2177,7 +2228,7 @@ struct ProtocolConformanceRecord {
2177
2228
return Flags;
2178
2229
}
2179
2230
2180
- ProtocolConformanceTypeKind getTypeKind () const {
2231
+ TypeMetadataRecordKind getTypeKind () const {
2181
2232
return Flags.getTypeKind ();
2182
2233
}
2183
2234
ProtocolConformanceReferenceKind getConformanceKind () const {
@@ -2186,16 +2237,16 @@ struct ProtocolConformanceRecord {
2186
2237
2187
2238
const Metadata *getDirectType () const {
2188
2239
switch (Flags.getTypeKind ()) {
2189
- case ProtocolConformanceTypeKind ::Universal:
2240
+ case TypeMetadataRecordKind ::Universal:
2190
2241
return nullptr ;
2191
2242
2192
- case ProtocolConformanceTypeKind ::UniqueDirectType:
2193
- case ProtocolConformanceTypeKind ::NonuniqueDirectType:
2243
+ case TypeMetadataRecordKind ::UniqueDirectType:
2244
+ case TypeMetadataRecordKind ::NonuniqueDirectType:
2194
2245
break ;
2195
2246
2196
- case ProtocolConformanceTypeKind ::UniqueDirectClass:
2197
- case ProtocolConformanceTypeKind ::UniqueIndirectClass:
2198
- case ProtocolConformanceTypeKind ::UniqueGenericPattern:
2247
+ case TypeMetadataRecordKind ::UniqueDirectClass:
2248
+ case TypeMetadataRecordKind ::UniqueIndirectClass:
2249
+ case TypeMetadataRecordKind ::UniqueGenericPattern:
2199
2250
assert (false && " not direct type metadata" );
2200
2251
}
2201
2252
@@ -2205,15 +2256,15 @@ struct ProtocolConformanceRecord {
2205
2256
// FIXME: This shouldn't exist
2206
2257
const ClassMetadata *getDirectClass () const {
2207
2258
switch (Flags.getTypeKind ()) {
2208
- case ProtocolConformanceTypeKind ::Universal:
2259
+ case TypeMetadataRecordKind ::Universal:
2209
2260
return nullptr ;
2210
- case ProtocolConformanceTypeKind ::UniqueDirectClass:
2261
+ case TypeMetadataRecordKind ::UniqueDirectClass:
2211
2262
break ;
2212
2263
2213
- case ProtocolConformanceTypeKind ::UniqueDirectType:
2214
- case ProtocolConformanceTypeKind ::NonuniqueDirectType:
2215
- case ProtocolConformanceTypeKind ::UniqueGenericPattern:
2216
- case ProtocolConformanceTypeKind ::UniqueIndirectClass:
2264
+ case TypeMetadataRecordKind ::UniqueDirectType:
2265
+ case TypeMetadataRecordKind ::NonuniqueDirectType:
2266
+ case TypeMetadataRecordKind ::UniqueGenericPattern:
2267
+ case TypeMetadataRecordKind ::UniqueIndirectClass:
2217
2268
assert (false && " not direct class object" );
2218
2269
}
2219
2270
@@ -2224,16 +2275,16 @@ struct ProtocolConformanceRecord {
2224
2275
2225
2276
const ClassMetadata * const *getIndirectClass () const {
2226
2277
switch (Flags.getTypeKind ()) {
2227
- case ProtocolConformanceTypeKind ::Universal:
2278
+ case TypeMetadataRecordKind ::Universal:
2228
2279
return nullptr ;
2229
2280
2230
- case ProtocolConformanceTypeKind ::UniqueIndirectClass:
2281
+ case TypeMetadataRecordKind ::UniqueIndirectClass:
2231
2282
break ;
2232
2283
2233
- case ProtocolConformanceTypeKind ::UniqueDirectType:
2234
- case ProtocolConformanceTypeKind ::UniqueDirectClass:
2235
- case ProtocolConformanceTypeKind ::NonuniqueDirectType:
2236
- case ProtocolConformanceTypeKind ::UniqueGenericPattern:
2284
+ case TypeMetadataRecordKind ::UniqueDirectType:
2285
+ case TypeMetadataRecordKind ::UniqueDirectClass:
2286
+ case TypeMetadataRecordKind ::NonuniqueDirectType:
2287
+ case TypeMetadataRecordKind ::UniqueGenericPattern:
2237
2288
assert (false && " not indirect class object" );
2238
2289
}
2239
2290
@@ -2242,16 +2293,16 @@ struct ProtocolConformanceRecord {
2242
2293
2243
2294
const GenericMetadata *getGenericPattern () const {
2244
2295
switch (Flags.getTypeKind ()) {
2245
- case ProtocolConformanceTypeKind ::Universal:
2296
+ case TypeMetadataRecordKind ::Universal:
2246
2297
return nullptr ;
2247
2298
2248
- case ProtocolConformanceTypeKind ::UniqueGenericPattern:
2299
+ case TypeMetadataRecordKind ::UniqueGenericPattern:
2249
2300
break ;
2250
2301
2251
- case ProtocolConformanceTypeKind ::UniqueDirectClass:
2252
- case ProtocolConformanceTypeKind ::UniqueIndirectClass:
2253
- case ProtocolConformanceTypeKind ::UniqueDirectType:
2254
- case ProtocolConformanceTypeKind ::NonuniqueDirectType:
2302
+ case TypeMetadataRecordKind ::UniqueDirectClass:
2303
+ case TypeMetadataRecordKind ::UniqueIndirectClass:
2304
+ case TypeMetadataRecordKind ::UniqueDirectType:
2305
+ case TypeMetadataRecordKind ::NonuniqueDirectType:
2255
2306
assert (false && " not generic metadata pattern" );
2256
2307
}
2257
2308
@@ -2817,7 +2868,12 @@ const WitnessTable *swift_conformsToProtocol(const Metadata *type,
2817
2868
extern " C"
2818
2869
void swift_registerProtocolConformances (const ProtocolConformanceRecord *begin,
2819
2870
const ProtocolConformanceRecord *end);
2820
-
2871
+
2872
+ // / Register a block of type metadata records dynamic lookup.
2873
+ extern " C"
2874
+ void swift_registerTypeMetadataRecords (const TypeMetadataRecord *begin,
2875
+ const TypeMetadataRecord *end);
2876
+
2821
2877
// / Return the type name for a given type metadata.
2822
2878
std::string nameForMetadata (const Metadata *type,
2823
2879
bool qualified = true );
0 commit comments