Skip to content

Commit 6d4015e

Browse files
authored
Merge pull request swiftlang#36652 from mikeash/getobjcclassmetadata-improvement
[Runtime] Make debug builds accept NULL in swift_getObjCClassMetadata.
2 parents 1ae371b + 8743ebd commit 6d4015e

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,19 +1027,29 @@ swift::swift_getObjCClassMetadata(const ClassMetadata *theClass) {
10271027

10281028
const ClassMetadata *
10291029
swift::swift_getObjCClassFromMetadata(const Metadata *theMetadata) {
1030+
// We're not supposed to accept NULL, but older runtimes somehow did as a
1031+
// side effect of UB in dyn_cast, so we'll keep that going.
1032+
if (!theMetadata)
1033+
return nullptr;
1034+
10301035
// Unwrap ObjC class wrappers.
1031-
if (auto wrapper = dyn_cast_or_null<ObjCClassWrapperMetadata>(theMetadata)) {
1036+
if (auto wrapper = dyn_cast<ObjCClassWrapperMetadata>(theMetadata)) {
10321037
return wrapper->Class;
10331038
}
10341039

10351040
// Otherwise, the input should already be a Swift class object.
10361041
auto theClass = cast<ClassMetadata>(theMetadata);
1037-
assert(!theClass || theClass->isTypeMetadata());
1042+
assert(theClass->isTypeMetadata());
10381043
return theClass;
10391044
}
10401045

10411046
const ClassMetadata *
10421047
swift::swift_getObjCClassFromMetadataConditional(const Metadata *theMetadata) {
1048+
// We're not supposed to accept NULL, but older runtimes somehow did as a
1049+
// side effect of UB in dyn_cast, so we'll keep that going.
1050+
if (!theMetadata)
1051+
return nullptr;
1052+
10431053
// If it's an ordinary class, return it.
10441054
if (auto theClass = dyn_cast<ClassMetadata>(theMetadata)) {
10451055
return theClass;

0 commit comments

Comments
 (0)