@@ -1818,9 +1818,6 @@ class MetadataReader {
18181818 if (!bounds)
18191819 return std::nullopt ;
18201820
1821- bounds->adjustForSubclass (type->areImmediateMembersNegative (),
1822- type->NumImmediateMembers );
1823-
18241821 return bounds->ImmediateMembersOffset / sizeof (StoredPointer);
18251822 }
18261823
@@ -1845,35 +1842,45 @@ class MetadataReader {
18451842 std::optional<ClassMetadataBounds>
18461843 readMetadataBoundsOfSuperclass (ContextDescriptorRef subclassRef) {
18471844 auto subclass = cast<TargetClassDescriptor<Runtime>>(subclassRef);
1848- if (!subclass->hasResilientSuperclass ())
1849- return ClassMetadataBounds::forSwiftRootClass ();
1845+ std::optional<ClassMetadataBounds> bounds;
18501846
1851- auto rawSuperclass =
1852- resolveRelativeField (subclassRef, subclass->getResilientSuperclass ());
1853- if (!rawSuperclass) {
1854- return ClassMetadataBounds::forSwiftRootClass ();
1855- }
1847+ if (!subclass->hasResilientSuperclass ()) {
1848+ bounds = ClassMetadataBounds::forSwiftRootClass ();
1849+ } else {
1850+ auto rawSuperclass =
1851+ resolveRelativeField (subclassRef, subclass->getResilientSuperclass ());
1852+ if (!rawSuperclass) {
1853+ return std::nullopt ;
1854+ }
18561855
1857- return forTypeReference<ClassMetadataBounds>(
1858- subclass->getResilientSuperclassReferenceKind (), rawSuperclass,
1859- [&](ContextDescriptorRef superclass)
1860- -> std::optional<ClassMetadataBounds> {
1861- if (!isa<TargetClassDescriptor<Runtime>>(superclass))
1862- return std::nullopt ;
1863- return readMetadataBoundsOfSuperclass (superclass);
1864- },
1865- [&](MetadataRef metadata) -> std::optional<ClassMetadataBounds> {
1866- auto cls = dyn_cast<TargetClassMetadata>(metadata);
1867- if (!cls)
1856+ bounds = forTypeReference<ClassMetadataBounds>(
1857+ subclass->getResilientSuperclassReferenceKind (), rawSuperclass,
1858+ [&](ContextDescriptorRef superclass)
1859+ -> std::optional<ClassMetadataBounds> {
1860+ if (!isa<TargetClassDescriptor<Runtime>>(superclass))
1861+ return std::nullopt ;
1862+ return readMetadataBoundsOfSuperclass (superclass);
1863+ },
1864+ [&](MetadataRef metadata) -> std::optional<ClassMetadataBounds> {
1865+ auto cls = dyn_cast<TargetClassMetadata>(metadata);
1866+ if (!cls)
1867+ return std::nullopt ;
1868+
1869+ return cls->getClassBoundsAsSwiftSuperclass ();
1870+ },
1871+ [](StoredPointer objcClassName)
1872+ -> std::optional<ClassMetadataBounds> {
1873+ // We have no ability to look up an ObjC class by name.
1874+ // FIXME: add a query for this; clients may have a way to do it.
18681875 return std::nullopt ;
1869-
1870- return cls-> getClassBoundsAsSwiftSuperclass ();
1871- },
1872- [](StoredPointer objcClassName) -> std::optional<ClassMetadataBounds> {
1873- // We have no ability to look up an ObjC class by name.
1874- // FIXME: add a query for this; clients may have a way to do it.
1875- return std:: nullopt ;
1876- }) ;
1876+ });
1877+ }
1878+ if (!bounds) {
1879+ return std::nullopt ;
1880+ }
1881+ bounds-> adjustForSubclass (subclass-> areImmediateMembersNegative (),
1882+ subclass-> NumImmediateMembers ) ;
1883+ return bounds ;
18771884 }
18781885
18791886 template <class Result , class DescriptorFn , class MetadataFn ,
@@ -1885,11 +1892,12 @@ class MetadataReader {
18851892 const ClassNameFn &classNameFn) {
18861893 switch (refKind) {
18871894 case TypeReferenceKind::IndirectTypeDescriptor: {
1888- StoredPointer descriptorAddress = 0 ;
1889- if (!Reader->readInteger (RemoteAddress (ref), &descriptorAddress))
1895+ StoredSignedPointer descriptorAddress;
1896+ if (!Reader->readInteger (RemoteAddress (ref), &descriptorAddress)) {
18901897 return std::nullopt ;
1898+ }
18911899
1892- ref = descriptorAddress;
1900+ ref = stripSignedPointer ( descriptorAddress) ;
18931901 LLVM_FALLTHROUGH;
18941902 }
18951903
0 commit comments