@@ -3644,13 +3644,13 @@ static void copySuperclassMetadataToSubclass(ClassMetadata *theClass,
3644
3644
#endif
3645
3645
}
3646
3646
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) {
3651
3652
// 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);
3654
3654
3655
3655
// If the base method is null, it's an unavailable weak-linked
3656
3656
// symbol.
@@ -3669,14 +3669,14 @@ static void installOverrideInVTable(
3669
3669
fatalError (0 ,
3670
3670
" resilient vtable at %p contains out-of-bounds "
3671
3671
" method descriptor %p\n " ,
3672
- overrideTable , baseMethod);
3672
+ table , baseMethod);
3673
3673
}
3674
3674
3675
3675
// Install the method override in our vtable.
3676
3676
auto baseVTable = baseClass->getVTableDescriptor ();
3677
3677
auto offset = (baseVTable->getVTableOffset (baseClass) +
3678
3678
(baseMethod - baseClassMethods.data ()));
3679
- swift_ptrauth_init_code_or_data (&classWords[offset], descriptor. getImpl (),
3679
+ swift_ptrauth_init_code_or_data (&classWords[offset], getImpl (),
3680
3680
baseMethod->Flags .getExtraDiscriminator (),
3681
3681
!baseMethod->Flags .isData ());
3682
3682
}
@@ -3707,7 +3707,10 @@ static void initClassVTable(ClassMetadata *self) {
3707
3707
for (unsigned i = 0 , e = overrideTable->NumEntries ; i < e; ++i) {
3708
3708
auto &descriptor = overrideDescriptors[i];
3709
3709
3710
- installOverrideInVTable (descriptor, overrideTable, classWords);
3710
+ installOverrideInVTable (
3711
+ descriptor.Class .get (), descriptor.Method .get (),
3712
+ [&descriptor]() { return descriptor.getImpl (); }, overrideTable,
3713
+ classWords);
3711
3714
}
3712
3715
}
3713
3716
}
0 commit comments