@@ -1814,7 +1814,7 @@ class MetadataReader {
1814
1814
if (!type->hasResilientSuperclass ())
1815
1815
return type->getNonResilientGenericArgumentOffset ();
1816
1816
1817
- auto bounds = readMetadataBoundsOfSuperclass (descriptor);
1817
+ auto bounds = computeMetadataBoundsFromSuperclass (descriptor);
1818
1818
if (!bounds)
1819
1819
return std::nullopt;
1820
1820
@@ -1838,9 +1838,32 @@ class MetadataReader {
1838
1838
1839
1839
using ClassMetadataBounds = TargetClassMetadataBounds<Runtime>;
1840
1840
1841
- // This follows computeMetadataBoundsForSuperclass .
1841
+ // This follows getMetadataBounds in ABI/Metadata.h .
1842
1842
std::optional<ClassMetadataBounds>
1843
- readMetadataBoundsOfSuperclass (ContextDescriptorRef subclassRef) {
1843
+ getClassMetadataBounds (ContextDescriptorRef classRef) {
1844
+ auto classDescriptor = cast<TargetClassDescriptor<Runtime>>(classRef);
1845
+
1846
+ if (!classDescriptor->hasResilientSuperclass ()) {
1847
+ auto nonResilientImmediateMembersOffset =
1848
+ classDescriptor->areImmediateMembersNegative ()
1849
+ ? -int32_t (classDescriptor->MetadataNegativeSizeInWords )
1850
+ : int32_t (classDescriptor->MetadataPositiveSizeInWords -
1851
+ classDescriptor->NumImmediateMembers );
1852
+ typename Runtime::StoredPointerDifference immediateMembersOffset =
1853
+ nonResilientImmediateMembersOffset * sizeof (StoredPointer);
1854
+
1855
+ ClassMetadataBounds bounds{immediateMembersOffset,
1856
+ classDescriptor->MetadataNegativeSizeInWords ,
1857
+ classDescriptor->MetadataPositiveSizeInWords };
1858
+ return bounds;
1859
+ }
1860
+
1861
+ return computeMetadataBoundsFromSuperclass (classRef);
1862
+ }
1863
+
1864
+ // This follows computeMetadataBoundsFromSuperclass in Metadata.cpp.
1865
+ std::optional<ClassMetadataBounds>
1866
+ computeMetadataBoundsFromSuperclass (ContextDescriptorRef subclassRef) {
1844
1867
auto subclass = cast<TargetClassDescriptor<Runtime>>(subclassRef);
1845
1868
std::optional<ClassMetadataBounds> bounds;
1846
1869
@@ -1859,7 +1882,7 @@ class MetadataReader {
1859
1882
-> std::optional<ClassMetadataBounds> {
1860
1883
if (!isa<TargetClassDescriptor<Runtime>>(superclass))
1861
1884
return std::nullopt;
1862
- return readMetadataBoundsOfSuperclass (superclass);
1885
+ return getClassMetadataBounds (superclass);
1863
1886
},
1864
1887
[&](MetadataRef metadata) -> std::optional<ClassMetadataBounds> {
1865
1888
auto cls = dyn_cast<TargetClassMetadata>(metadata);
0 commit comments