@@ -204,30 +204,65 @@ class ReflectionContext {
204
204
}
205
205
206
206
TypeRefVector
207
- getGenericSubstitutions (TypeRefPointer Unsubstituted,
208
- StoredPointer MetadataAddress) {
209
- if (!Unsubstituted || !MetadataAddress)
210
- return {};
211
-
212
- if (!llvm::isa<BoundGenericTypeRef>(Unsubstituted.get ()))
213
- return {};
214
-
215
- auto Meta = readMetadata (MetadataAddress);
216
- if (!Meta)
217
- return {};
218
-
207
+ getGenericArguments (StoredPointer MetadataAddress,
208
+ SharedTargetNominalTypeDescriptorRef<Runtime> Descriptor){
219
209
TypeRefVector GenericArgTypeRefs;
220
- llvm_unreachable (" todo" );
210
+ auto NumGenericParams = Descriptor->GenericParams .NumPrimaryParams ;
211
+ auto OffsetToGenericArgs
212
+ = sizeof (StoredPointer) * (Descriptor->GenericParams .Offset );
213
+ auto AddressOfGenericArgAddress = MetadataAddress + OffsetToGenericArgs;
214
+
215
+ using ArgIndex = decltype (Descriptor->GenericParams .NumPrimaryParams );
216
+ for (ArgIndex i = 0 ; i < NumGenericParams; ++i,
217
+ AddressOfGenericArgAddress += sizeof (StoredPointer)) {
218
+ StoredPointer GenericArgAddress;
219
+ if (!Reader.readInteger (AddressOfGenericArgAddress,
220
+ &GenericArgAddress))
221
+ return {};
222
+ if (auto GenericArg = getTypeRef (GenericArgAddress))
223
+ GenericArgTypeRefs.push_back (GenericArg);
224
+ else
225
+ return {};
226
+ }
221
227
return GenericArgTypeRefs;
222
228
}
223
229
224
230
TypeRefPointer
225
231
resolveDependentMembers (TypeRefPointer Unresolved,
226
232
StoredPointer MetadataAddress) {
227
- llvm_unreachable ( " todo " );
233
+ // TODO: Resolve dependent members
228
234
return Unresolved;
229
235
}
230
236
237
+ TypeRefPointer
238
+ getNominalTypeRef (StoredPointer MetadataAddress,
239
+ StoredPointer DescriptorAddress) {
240
+ auto Descriptor = readNominalTypeDescriptor (DescriptorAddress);
241
+ if (!Descriptor)
242
+ return nullptr ;
243
+
244
+ auto NameAddress
245
+ = resolveRelativeOffset<int32_t >(DescriptorAddress +
246
+ Descriptor->offsetToNameOffset ());
247
+ auto MangledName = Reader.readString (NameAddress);
248
+ if (MangledName.empty ())
249
+ return nullptr ;
250
+
251
+ auto DemangleNode = Demangle::demangleTypeAsNode (MangledName);
252
+ if (!DemangleNode)
253
+ return nullptr ;
254
+
255
+ TypeRefPointer Nominal;
256
+ if (Descriptor->GenericParams .NumPrimaryParams ) {
257
+ auto Args = getGenericArguments (MetadataAddress, Descriptor);
258
+ Nominal = BoundGenericTypeRef::create (MangledName, Args);
259
+ } else {
260
+ Nominal = TypeRef::fromDemangleNode (DemangleNode);
261
+ }
262
+ TypeRefCache.insert ({MetadataAddress, Nominal});
263
+ return Nominal;
264
+ }
265
+
231
266
TypeRefPointer getTypeRef (StoredPointer MetadataAddress) {
232
267
auto Cached = TypeRefCache.find (MetadataAddress);
233
268
if (Cached != TypeRefCache.end ())
@@ -245,84 +280,24 @@ class ReflectionContext {
245
280
auto DescriptorAddress
246
281
= resolveRelativeOffset<StoredPointer>(MetadataAddress +
247
282
ClassMeta->offsetToDescriptorOffset ());
248
- auto Descriptor = readNominalTypeDescriptor (DescriptorAddress);
249
- if (!Descriptor)
250
- return nullptr ;
251
-
252
- auto NameAddress
253
- = resolveRelativeOffset<int32_t >(DescriptorAddress +
254
- Descriptor->offsetToNameOffset ());
255
- auto MangledName = Reader.readString (NameAddress);
256
- if (MangledName.empty ())
257
- return nullptr ;
258
-
259
- auto DemangleNode = Demangle::demangleTypeAsNode (MangledName);
260
- if (!DemangleNode)
261
- return nullptr ;
262
283
263
- auto Unsubstituted = TypeRef::fromDemangleNode (DemangleNode);
264
- auto Substitutions = getGenericSubstitutions (Unsubstituted,
265
- MetadataAddress);
266
- auto Substituted = Unsubstituted->substituteGenerics (Substitutions);
267
- auto Resolved = resolveDependentMembers (Substituted, MetadataAddress);
268
- TypeRefCache.insert ({MetadataAddress, Resolved});
269
- return Resolved;
284
+ return getNominalTypeRef (MetadataAddress, DescriptorAddress);
270
285
}
271
286
case MetadataKind::Struct: {
272
287
auto StructMeta = cast<TargetStructMetadata<Runtime>>(Meta.get ());
273
288
274
289
auto DescriptorAddress
275
290
= resolveRelativeOffset<StoredPointer>(MetadataAddress +
276
291
StructMeta->offsetToDescriptorOffset ());
277
- auto Descriptor = readNominalTypeDescriptor (DescriptorAddress);
278
- if (!Descriptor)
279
- return nullptr ;
280
-
281
- auto NameAddress
282
- = resolveRelativeOffset<int32_t >(DescriptorAddress +
283
- Descriptor->offsetToNameOffset ());
284
- auto MangledName = Reader.readString (NameAddress);
285
- if (MangledName.empty ())
286
- return nullptr ;
287
-
288
- auto DemangleNode = Demangle::demangleTypeAsNode (MangledName);
289
- if (!DemangleNode)
290
- return nullptr ;
291
-
292
- auto Unsubstituted = TypeRef::fromDemangleNode (DemangleNode);
293
- auto Substitutions = getGenericSubstitutions (Unsubstituted,
294
- MetadataAddress);
295
- auto Substituted = Unsubstituted->substituteGenerics (Substitutions);
296
- auto Resolved = resolveDependentMembers (Substituted, MetadataAddress);
297
- TypeRefCache.insert ({MetadataAddress, Resolved});
298
- return Resolved;
292
+ return getNominalTypeRef (MetadataAddress, DescriptorAddress);
299
293
}
300
294
case MetadataKind::Enum:
301
295
case MetadataKind::Optional: {
302
296
auto EnumMeta = cast<TargetEnumMetadata<Runtime>>(Meta.get ());
303
297
auto DescriptorAddress
304
298
= resolveRelativeOffset<StoredPointer>(MetadataAddress +
305
299
EnumMeta->offsetToDescriptorOffset ());
306
- auto Descriptor = readNominalTypeDescriptor (DescriptorAddress);
307
- if (!Descriptor)
308
- return nullptr ;
309
-
310
- auto NameAddress
311
- = resolveRelativeOffset<int32_t >(DescriptorAddress +
312
- Descriptor->offsetToNameOffset ());
313
- auto MangledName = Reader.readString (NameAddress);
314
- if (MangledName.empty ()) return nullptr ;
315
-
316
- auto DemangleNode = Demangle::demangleTypeAsNode (MangledName);
317
- if (!DemangleNode) return nullptr ;
318
-
319
- auto Unsubstituted = TypeRef::fromDemangleNode (DemangleNode);
320
- auto Substitutions = getGenericSubstitutions (Unsubstituted,
321
- MetadataAddress);
322
- auto Substituted = Unsubstituted->substituteGenerics (Substitutions);
323
- auto Resolved = resolveDependentMembers (Substituted, MetadataAddress);
324
- TypeRefCache.insert ({MetadataAddress, Resolved});
325
- return Resolved;
300
+ return getNominalTypeRef (MetadataAddress, DescriptorAddress);
326
301
}
327
302
case MetadataKind::Tuple: {
328
303
auto TupleMeta = cast<TargetTupleTypeMetadata<Runtime>>(Meta.get ());
0 commit comments