@@ -2474,10 +2474,10 @@ static void initObjCClass(ClassMetadata *self,
2474
2474
// / corresponding entry in \p fieldOffsets, before asking the Objective-C
2475
2475
// / runtime to realize the class. The Objective-C runtime will then slide the
2476
2476
// / offsets in \p fieldOffsets.
2477
- static void initGenericObjCClass (ClassMetadata *self,
2478
- size_t numFields,
2479
- const TypeLayout * const *fieldTypes,
2480
- size_t *fieldOffsets) {
2477
+ static MetadataDependency
2478
+ initGenericObjCClass (ClassMetadata *self, size_t numFields,
2479
+ const TypeLayout * const *fieldTypes,
2480
+ size_t *fieldOffsets) {
2481
2481
// If the class is generic, we need to give it a name for Objective-C.
2482
2482
initGenericClassObjCName (self);
2483
2483
@@ -2580,24 +2580,25 @@ static void initGenericObjCClass(ClassMetadata *self,
2580
2580
delete [] _globalIvarOffsets;
2581
2581
}
2582
2582
}
2583
+
2584
+ return MetadataDependency ();
2583
2585
}
2584
2586
#endif
2585
2587
2586
- void
2587
- swift::swift_initClassMetadata (ClassMetadata *self,
2588
- ClassLayoutFlags layoutFlags,
2589
- size_t numFields,
2590
- const TypeLayout * const *fieldTypes,
2591
- size_t *fieldOffsets) {
2588
+ SWIFT_CC (swift)
2589
+ static std::pair<MetadataDependency, const ClassMetadata *>
2590
+ getSuperclassMetadata (ClassMetadata *self, bool allowDependency) {
2592
2591
// If there is a mangled superclass name, demangle it to the superclass
2593
2592
// type.
2594
2593
const ClassMetadata *super = nullptr ;
2595
2594
if (auto superclassNameBase = self->getDescription ()->SuperclassType .get ()) {
2596
2595
StringRef superclassName =
2597
2596
Demangle::makeSymbolicMangledNameStringRef (superclassNameBase);
2598
2597
SubstGenericParametersFromMetadata substitutions (self);
2599
- MetadataRequest request (/* FIXME*/ MetadataState::Abstract,
2600
- /* non-blocking*/ false );
2598
+ MetadataRequest request (allowDependency
2599
+ ? MetadataState::NonTransitiveComplete
2600
+ : /* FIXME*/ MetadataState::Abstract,
2601
+ /* non-blocking*/ allowDependency);
2601
2602
MetadataResponse response =
2602
2603
swift_getTypeByMangledName (request, superclassName,
2603
2604
substitutions, substitutions).getResponse ();
@@ -2609,6 +2610,13 @@ swift::swift_initClassMetadata(ClassMetadata *self,
2609
2610
superclassName.str ().c_str ());
2610
2611
}
2611
2612
2613
+ // If the request isn't satisfied, we have a new dependency.
2614
+ if (!request.isSatisfiedBy (response.State )) {
2615
+ assert (allowDependency);
2616
+ return {MetadataDependency (superclass, request.getState ()),
2617
+ cast<ClassMetadata>(superclass)};
2618
+ }
2619
+
2612
2620
#if SWIFT_OBJC_INTEROP
2613
2621
if (auto objcWrapper = dyn_cast<ObjCClassWrapperMetadata>(superclass))
2614
2622
superclass = objcWrapper->Class ;
@@ -2617,6 +2625,22 @@ swift::swift_initClassMetadata(ClassMetadata *self,
2617
2625
super = cast<ClassMetadata>(superclass);
2618
2626
}
2619
2627
2628
+ return {MetadataDependency (), super};
2629
+ }
2630
+
2631
+ static SWIFT_CC (swift) MetadataDependency
2632
+ _swift_initClassMetadataImpl (ClassMetadata *self,
2633
+ ClassLayoutFlags layoutFlags,
2634
+ size_t numFields,
2635
+ const TypeLayout * const *fieldTypes,
2636
+ size_t *fieldOffsets,
2637
+ bool allowDependency) {
2638
+ // Try to install the superclass.
2639
+ auto superDependencyAndSuper = getSuperclassMetadata (self, allowDependency);
2640
+ if (superDependencyAndSuper.first )
2641
+ return superDependencyAndSuper.first ;
2642
+ auto super = superDependencyAndSuper.second ;
2643
+
2620
2644
self->Superclass = super;
2621
2645
2622
2646
#if SWIFT_OBJC_INTEROP
@@ -2657,6 +2681,29 @@ swift::swift_initClassMetadata(ClassMetadata *self,
2657
2681
swift_instantiateObjCClass (self);
2658
2682
}
2659
2683
#endif
2684
+
2685
+ return MetadataDependency ();
2686
+ }
2687
+
2688
+ void swift::swift_initClassMetadata (ClassMetadata *self,
2689
+ ClassLayoutFlags layoutFlags,
2690
+ size_t numFields,
2691
+ const TypeLayout * const *fieldTypes,
2692
+ size_t *fieldOffsets) {
2693
+ (void ) _swift_initClassMetadataImpl (self, layoutFlags, numFields,
2694
+ fieldTypes, fieldOffsets,
2695
+ /* allowDependency*/ false );
2696
+ }
2697
+
2698
+ MetadataDependency
2699
+ swift::swift_initClassMetadata2 (ClassMetadata *self,
2700
+ ClassLayoutFlags layoutFlags,
2701
+ size_t numFields,
2702
+ const TypeLayout * const *fieldTypes,
2703
+ size_t *fieldOffsets) {
2704
+ return _swift_initClassMetadataImpl (self, layoutFlags, numFields,
2705
+ fieldTypes, fieldOffsets,
2706
+ /* allowDependency*/ true );
2660
2707
}
2661
2708
2662
2709
#if SWIFT_OBJC_INTEROP
@@ -2666,12 +2713,14 @@ swift::swift_initClassMetadata(ClassMetadata *self,
2666
2713
#pragma clang diagnostic push
2667
2714
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
2668
2715
2669
- void
2670
- swift::swift_updateClassMetadata (ClassMetadata *self,
2671
- ClassLayoutFlags layoutFlags,
2672
- size_t numFields,
2673
- const TypeLayout * const *fieldTypes,
2674
- size_t *fieldOffsets) {
2716
+
2717
+ static SWIFT_CC (swift) MetadataDependency
2718
+ _swift_updateClassMetadataImpl (ClassMetadata *self,
2719
+ ClassLayoutFlags layoutFlags,
2720
+ size_t numFields,
2721
+ const TypeLayout * const *fieldTypes,
2722
+ size_t *fieldOffsets,
2723
+ bool allowDependency) {
2675
2724
#ifndef OBJC_REALIZECLASSFROMSWIFT_DEFINED
2676
2725
// Temporary workaround until _objc_realizeClassFromSwift is in the SDK.
2677
2726
static auto _objc_realizeClassFromSwift =
@@ -2684,30 +2733,10 @@ swift::swift_updateClassMetadata(ClassMetadata *self,
2684
2733
// If we're on a newer runtime, we're going to be initializing the
2685
2734
// field offset vector. Realize the superclass metadata first, even
2686
2735
// though our superclass field references it statically.
2687
- const ClassMetadata *super = nullptr ;
2688
-
2689
- if (auto superclassNameBase = self->getDescription ()->SuperclassType .get ()) {
2690
- StringRef superclassName =
2691
- Demangle::makeSymbolicMangledNameStringRef (superclassNameBase);
2692
- SubstGenericParametersFromMetadata substitutions (self);
2693
- MetadataRequest request (/* FIXME*/ MetadataState::Abstract,
2694
- /* non-blocking*/ false );
2695
- MetadataResponse response =
2696
- swift_getTypeByMangledName (request, superclassName,
2697
- substitutions, substitutions).getResponse ();
2698
- const Metadata *superclass = response.Value ;
2699
- if (!superclass) {
2700
- fatalError (0 ,
2701
- " failed to demangle superclass of %s from mangled name '%s'\n " ,
2702
- self->getDescription ()->Name .get (),
2703
- superclassName.str ().c_str ());
2704
- }
2705
-
2706
- if (auto objcWrapper = dyn_cast<ObjCClassWrapperMetadata>(superclass))
2707
- superclass = objcWrapper->Class ;
2708
-
2709
- super = cast<ClassMetadata>(superclass);
2710
- }
2736
+ auto superDependencyAndSuper = getSuperclassMetadata (self, allowDependency);
2737
+ if (superDependencyAndSuper.first )
2738
+ return superDependencyAndSuper.first ;
2739
+ const ClassMetadata *super = superDependencyAndSuper.second ;
2711
2740
2712
2741
// Check that it matches what's already in there.
2713
2742
if (!super)
@@ -2741,6 +2770,29 @@ swift::swift_updateClassMetadata(ClassMetadata *self,
2741
2770
// See remark above about how this slides field offset globals.
2742
2771
_objc_realizeClassFromSwift ((Class)self, (Class)self);
2743
2772
}
2773
+
2774
+ return MetadataDependency ();
2775
+ }
2776
+
2777
+ void swift::swift_updateClassMetadata (ClassMetadata *self,
2778
+ ClassLayoutFlags layoutFlags,
2779
+ size_t numFields,
2780
+ const TypeLayout * const *fieldTypes,
2781
+ size_t *fieldOffsets) {
2782
+ (void ) _swift_updateClassMetadataImpl (self, layoutFlags, numFields,
2783
+ fieldTypes, fieldOffsets,
2784
+ /* allowDependency*/ false );
2785
+ }
2786
+
2787
+ MetadataDependency
2788
+ swift::swift_updateClassMetadata2 (ClassMetadata *self,
2789
+ ClassLayoutFlags layoutFlags,
2790
+ size_t numFields,
2791
+ const TypeLayout * const *fieldTypes,
2792
+ size_t *fieldOffsets) {
2793
+ return _swift_updateClassMetadataImpl (self, layoutFlags, numFields,
2794
+ fieldTypes, fieldOffsets,
2795
+ /* allowDependency*/ true );
2744
2796
}
2745
2797
2746
2798
#pragma clang diagnostic pop
0 commit comments