Skip to content

Commit c928203

Browse files
committed
[Runtime] Handle nil parameter to -[SwiftObject isEqual:]
The parameter is nullable, and isEqual: should always return nil in that case. We need to check for nil before doing anything else. rdar://136825667
1 parent 2947510 commit c928203

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

stdlib/public/runtime/SwiftObject.mm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,9 @@ - (BOOL)isEqual:(id)other {
431431
if (self == other) {
432432
return YES;
433433
}
434+
if (other == nil) {
435+
return NO;
436+
}
434437
if (runtime::bincompat::useLegacySwiftObjCHashing()) {
435438
// Legacy behavior: Don't proxy to Swift Hashable or Equatable
436439
return NO; // We know the ids are different

test/stdlib/SwiftObjectNSObject.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func CheckSwiftObjectNSObjectEquals(_: AnyObject, _: AnyObject) -> Bool
113113
@_silgen_name("TestSwiftObjectNSObjectEquals")
114114
func TestSwiftObjectNSObjectEquals(_: AnyObject, _: AnyObject)
115115
@_silgen_name("TestSwiftObjectNSObjectNotEquals")
116-
func TestSwiftObjectNSObjectNotEquals(_: AnyObject, _: AnyObject)
116+
func TestSwiftObjectNSObjectNotEquals(_: AnyObject, _: AnyObject?)
117117
@_silgen_name("TestSwiftObjectNSObjectHashValue")
118118
func TestSwiftObjectNSObjectHashValue(_: AnyObject, _: Int)
119119
@_silgen_name("TestSwiftObjectNSObjectDefaultHashValue")
@@ -264,6 +264,10 @@ if #available(OSX 10.12, iOS 10.0, *) {
264264
TestHashable(H(i:2))
265265
TestHashable(H(i:18))
266266

267+
// Verify that we correctly handle a nil argument to isEqual:
268+
TestSwiftObjectNSObjectNotEquals(C(), nil)
269+
TestSwiftObjectNSObjectNotEquals(E(i: 1), nil)
270+
267271
TestSwiftObjectNSObjectAssertNoErrors()
268272
} else {
269273
// Horrible hack to satisfy FileCheck

0 commit comments

Comments
 (0)