From 76bb82a533a84b2fd2d14ff228a9a47632849f6b Mon Sep 17 00:00:00 2001 From: David Smith Date: Fri, 17 May 2024 16:28:08 -0700 Subject: [PATCH] rdar://127199021, fix compatibility with apps that accidentally do [[[aSwiftArray class] new] mutableCopy] to work (cherry picked from commit 011034023ef80530cfbb901749d0f28484428760) --- stdlib/public/stubs/SwiftNativeNSXXXBase.mm.gyb | 13 +++++++++++++ test/stdlib/ArrayBridge.swift.gyb | 5 +++++ test/stdlib/Inputs/ArrayBridge/ArrayBridge.h | 1 + test/stdlib/Inputs/ArrayBridge/ArrayBridge.m | 16 ++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/stdlib/public/stubs/SwiftNativeNSXXXBase.mm.gyb b/stdlib/public/stubs/SwiftNativeNSXXXBase.mm.gyb index 89e389f8ba8bc..d08792ff80228 100644 --- a/stdlib/public/stubs/SwiftNativeNSXXXBase.mm.gyb +++ b/stdlib/public/stubs/SwiftNativeNSXXXBase.mm.gyb @@ -103,6 +103,19 @@ swift_stdlib_connectNSBaseClasses() { return true; } +@interface __SwiftNativeNSArrayBase (Compatibility) ++ (id) new; +@end + +@implementation __SwiftNativeNSArrayBase (Compatibility) + ++ (id) new { + // Some apps accidentally do [[[aSwiftArray class] new] mutableCopy] + return [objc_lookUpClass("NSArray") new]; +} + +@end + #endif // ${'Local Variables'}: diff --git a/test/stdlib/ArrayBridge.swift.gyb b/test/stdlib/ArrayBridge.swift.gyb index 4d7009dea4220..004650818eab0 100644 --- a/test/stdlib/ArrayBridge.swift.gyb +++ b/test/stdlib/ArrayBridge.swift.gyb @@ -422,6 +422,11 @@ tests.test("testThunks") { testBridgeableValue(Thunks()) } +tests.test("testHKTFilter") { + let base = ["hello", "world"] + let result = testHKTFilter(base) as! NSArray as! [String] + expectEqual(result, ["hello"]) +} tests.test("testRoundTrip") { class Test : NSObject { diff --git a/test/stdlib/Inputs/ArrayBridge/ArrayBridge.h b/test/stdlib/Inputs/ArrayBridge/ArrayBridge.h index f026d8185bfef..44bee7687ff38 100644 --- a/test/stdlib/Inputs/ArrayBridge/ArrayBridge.h +++ b/test/stdlib/Inputs/ArrayBridge/ArrayBridge.h @@ -16,6 +16,7 @@ NSArray* idAsArray(id a); void testSubclass(id thunks); void testBridgeableValue(id thunks); +id testHKTFilter(id array); @interface RDar27905230 : NSObject + (NSDictionary *> *)mutableDictionaryOfMutableLists; diff --git a/test/stdlib/Inputs/ArrayBridge/ArrayBridge.m b/test/stdlib/Inputs/ArrayBridge/ArrayBridge.m index 957cf5e3f372b..22913c38761ee 100644 --- a/test/stdlib/Inputs/ArrayBridge/ArrayBridge.m +++ b/test/stdlib/Inputs/ArrayBridge/ArrayBridge.m @@ -67,6 +67,22 @@ void testBridgeableValue(id thunks) { [thunks acceptBridgeableValueArray: toSwiftArr]; } +static id filter(id container, BOOL (^predicate)(id)) { + id result = [[[container class] new] mutableCopy]; + for (id object in container) { + if (predicate(object)) { + [result addObject:object]; + } + } + return result; +} + +id testHKTFilter(id array) { + return filter(array, ^(id obj) { + return [obj isEqual:@"hello"]; + }); +} + @implementation RDar27905230 + (NSDictionary *> *)mutableDictionaryOfMutableLists {