@@ -3644,13 +3644,13 @@ static void copySuperclassMetadataToSubclass(ClassMetadata *theClass,
36443644#endif
36453645}
36463646
3647- static void installOverrideInVTable (
3648- ClassDescriptor::MethodOverrideDescriptor const &descriptor,
3649- ClassDescriptor::OverrideTableHeader const *overrideTable,
3650- void **classWords) {
3647+ template <typename GetImpl>
3648+ static void installOverrideInVTable (ContextDescriptor const *baseContext,
3649+ MethodDescriptor const *baseMethod,
3650+ GetImpl getImpl, void const *table,
3651+ void **classWords) {
36513652 // Get the base class and method.
3652- auto *baseClass = cast_or_null<ClassDescriptor>(descriptor.Class .get ());
3653- auto *baseMethod = descriptor.Method .get ();
3653+ auto *baseClass = cast_or_null<ClassDescriptor>(baseContext);
36543654
36553655 // If the base method is null, it's an unavailable weak-linked
36563656 // symbol.
@@ -3669,14 +3669,14 @@ static void installOverrideInVTable(
36693669 fatalError (0 ,
36703670 " resilient vtable at %p contains out-of-bounds "
36713671 " method descriptor %p\n " ,
3672- overrideTable , baseMethod);
3672+ table , baseMethod);
36733673 }
36743674
36753675 // Install the method override in our vtable.
36763676 auto baseVTable = baseClass->getVTableDescriptor ();
36773677 auto offset = (baseVTable->getVTableOffset (baseClass) +
36783678 (baseMethod - baseClassMethods.data ()));
3679- swift_ptrauth_init_code_or_data (&classWords[offset], descriptor. getImpl (),
3679+ swift_ptrauth_init_code_or_data (&classWords[offset], getImpl (),
36803680 baseMethod->Flags .getExtraDiscriminator (),
36813681 !baseMethod->Flags .isData ());
36823682}
@@ -3707,7 +3707,10 @@ static void initClassVTable(ClassMetadata *self) {
37073707 for (unsigned i = 0 , e = overrideTable->NumEntries ; i < e; ++i) {
37083708 auto &descriptor = overrideDescriptors[i];
37093709
3710- installOverrideInVTable (descriptor, overrideTable, classWords);
3710+ installOverrideInVTable (
3711+ descriptor.Class .get (), descriptor.Method .get (),
3712+ [&descriptor]() { return descriptor.getImpl (); }, overrideTable,
3713+ classWords);
37113714 }
37123715 }
37133716}
0 commit comments