Skip to content

Commit 297853a

Browse files
committed
Revert "[stdlib] Kill O(N) bridging [SomeClass] to ObjC"
This reverts commit 63f2ec2. Broke the build.
1 parent f8e0b00 commit 297853a

File tree

2 files changed

+98
-67
lines changed

2 files changed

+98
-67
lines changed

stdlib/public/core/ContiguousArrayBuffer.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -433,10 +433,8 @@ struct _ContiguousArrayBuffer<Element> : _ArrayBufferProtocol {
433433
_isBridgedToObjectiveC(Element.self),
434434
"Array element type is not bridged to Objective-C")
435435
if count == 0 {
436-
return _emptyArrayStorage
437-
}
438-
if _isBridgedVerbatimToObjectiveC(Element.self) {
439-
return _storage
436+
return _SwiftDeferredNSArray(
437+
_nativeStorage: _emptyArrayStorage)
440438
}
441439
return _SwiftDeferredNSArray(_nativeStorage: _storage)
442440
}

test/1_stdlib/ArrayBridge.swift

Lines changed: 96 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323

2424
import Foundation
2525
import ArrayBridgeObjC
26-
import StdlibUnittest
27-
let tests = TestSuite("ArrayBridge")
26+
27+
// CHECK: testing...
28+
print("testing...")
2829

2930
var trackedCount = 0
3031
var nextTrackedSerialNumber = 0
@@ -66,14 +67,14 @@ class Tracked : NSObject, Fooable {
6667
return self.dynamicType.init(self.value + 1)
6768
}
6869

69-
override func isEqual(_ other: AnyObject?) -> Bool {
70-
return (other as? Tracked)?.value == self.value
71-
}
72-
7370
var value: Int
7471
var serialNumber: Int
7572
}
7673

74+
func == (x: Tracked, y: Tracked) -> Bool {
75+
return x.value == y.value
76+
}
77+
7778
typealias Base = Tracked
7879
class Derived : Base, Barable {
7980
func bar() { }
@@ -200,16 +201,14 @@ class Thunks : NSObject {
200201
// Base is "bridged verbatim"
201202
//===----------------------------------------------------------------------===//
202203

203-
tests.test("testBridgedVerbatim") {
204-
nextTrackedSerialNumber = 0
204+
func testBridgedVerbatim() {
205205
let bases: [Base] = [Base(100), Base(200), Base(300)]
206206

207207
//===--- Implicit conversion to/from NSArray ------------------------------===//
208208

209+
// CHECK-NEXT: Base#1(100)
209210
let basesConvertedToNSArray = bases as NSArray
210-
expectEqual(
211-
"Base#1(100)",
212-
String(basesConvertedToNSArray.object(at: 0) as! Base))
211+
print(basesConvertedToNSArray.object(at: 0) as! Base)
213212

214213
// Create an ordinary NSArray, not a native one
215214
let nsArrayOfBase: NSArray = NSArray(object: Base(42))
@@ -218,79 +217,107 @@ tests.test("testBridgedVerbatim") {
218217
let nsArrayOfBaseConvertedToAnyObjectArray = nsArrayOfBase as [AnyObject]
219218

220219
// Capture the representation of the first element
221-
let base42: ObjectIdentifier
222-
do {
223-
let b = nsArrayOfBase.object(at: 0) as! Base
224-
expectEqual(42, b.value)
225-
base42 = ObjectIdentifier(b)
226-
}
220+
// CHECK-NEXT: [[base42:Base.*42]]
221+
print(nsArrayOfBase.object(at: 0) as! Base)
227222

228223
// ...with the same elements
229-
expectEqual(
230-
base42,
231-
ObjectIdentifier(nsArrayOfBaseConvertedToAnyObjectArray[0] as! Base))
224+
// CHECK-NEXT: [[base42]]
225+
print(nsArrayOfBaseConvertedToAnyObjectArray[0] as! Base)
232226

233227
// Verify that NSArray class methods are inherited by a Swift bridging class.
234-
let className = String(reflecting: basesConvertedToNSArray.dynamicType)
235-
expectTrue(className.hasPrefix("Swift._ContiguousArrayStorage"))
236-
expectTrue(basesConvertedToNSArray.dynamicType.supportsSecureCoding)
228+
// CHECK-NEXT: Swift.{{.*}}Array
229+
debugPrint(basesConvertedToNSArray.dynamicType)
230+
// CHECK-NEXT: true
231+
print(basesConvertedToNSArray.dynamicType.supportsSecureCoding)
237232

238233
//===--- Up- and Down-casts -----------------------------------------------===//
239234
var derived: [Derived] = [Derived(11), Derived(22)]
240-
let derived0 = derived
235+
// CHECK-NEXT: [[derived0:\[Derived#[0-9]+\(11\), Derived#[0-9]+\(22\)\]{1}]]
236+
print(derived)
241237

242238
// upcast is implicit
243239
let derivedAsBases: [Base] = derived
244-
expectEqual(derived.count, derivedAsBases.count)
245-
for (x, y) in zip(derived, derivedAsBases) {
246-
expectTrue(x === y)
247-
}
240+
241+
// CHECK-NEXT: [[derived0]]
242+
print(derivedAsBases)
248243

249244
// Arrays are logically distinct after upcast
250245
derived[0] = Derived(33)
246+
247+
// CHECK-NEXT: {{\[Derived#[0-9]+\(33\), Derived#[0-9]+\(22\)]}}
248+
print(derived)
249+
// CHECK-NEXT: [[derived0]]
250+
print(derivedAsBases)
251251

252-
expectEqual([Derived(33), Derived(22)], derived)
253-
expectEqual([Derived(11), Derived(22)], derivedAsBases)
254-
255-
expectEqual(derived0, derivedAsBases as! [Derived])
252+
// CHECK-NEXT: [[derived0]]
253+
if let roundTripDerived = derivedAsBases as? [Derived] {
254+
print(roundTripDerived)
255+
}
256+
else {
257+
print("roundTripDerived upcast failed")
258+
}
256259

260+
// CHECK-NEXT: [[derived2:\[Derived#[0-9]+\(44\), Derived#[0-9]+\(55\)\]{1}]]
257261
let derivedInBaseBuffer: [Base] = [Derived(44), Derived(55)]
258-
let derived2 = derivedInBaseBuffer
262+
print(derivedInBaseBuffer)
259263

260-
// Explicit downcast-ability is based on element type, not buffer type
261-
expectNotEmpty(derivedInBaseBuffer as? [Derived])
264+
// CHECK-NEXT: Explicit downcast-ability is based on element type, not buffer type
265+
if let downcastBaseBuffer = derivedInBaseBuffer as? [Derived] {
266+
print("Explicit downcast-ability is based on element type, not buffer type")
267+
}
268+
else {
269+
print("Unexpected downcast failure")
270+
}
262271

263272
// We can up-cast to array of AnyObject
273+
// CHECK-NEXT: [[derived2]]
264274
let derivedAsAnyObjectArray: [AnyObject] = derivedInBaseBuffer
265-
expectEqual(derived2, derivedAsAnyObjectArray.map { $0 as! Base })
275+
print(derivedAsAnyObjectArray)
266276

267-
let downcastBackToBase = derivedAsAnyObjectArray as? [Base]
268-
expectNotEmpty(downcastBackToBase)
277+
// CHECK-NEXT: downcastBackToBase = [[derived2]]
278+
if let downcastBackToBase = derivedAsAnyObjectArray as? [Base] {
279+
print("downcastBackToBase = \(downcastBackToBase)")
280+
}
281+
else {
282+
print("downcastBackToBase failed")
283+
}
269284

270-
if let downcastBackToDerived = expectNotEmpty(derivedAsAnyObjectArray as? [Derived]) {
271-
expectEqual(derived2, downcastBackToDerived)
285+
// CHECK-NEXT: downcastBackToDerived = [[derived2]]
286+
if let downcastBackToDerived = derivedAsAnyObjectArray as? [Derived] {
287+
print("downcastBackToDerived = \(downcastBackToDerived)")
288+
}
289+
else {
290+
print("downcastBackToDerived failed")
272291
}
273292

274-
if let downcastToProtocols = expectNotEmpty(derivedAsAnyObjectArray as? [Fooable]) {
275-
expectEqual(derived2, downcastToProtocols.map { $0 as! Derived })
293+
// CHECK-NEXT: downcastToProtocols = [[derived2]]
294+
if let downcastToProtocols = derivedAsAnyObjectArray as? [Fooable] {
295+
print("downcastToProtocols = \(downcastToProtocols)")
296+
} else {
297+
print("downcastToProtocols failed")
276298
}
277299

278-
if let downcastToProtocols = expectNotEmpty(derivedAsAnyObjectArray as? [Barable]) {
279-
expectEqual(derived2, downcastToProtocols.map { $0 as! Derived })
300+
// CHECK-NEXT: downcastToProtocols = [[derived2]]
301+
if let downcastToProtocols = derivedAsAnyObjectArray as? [Barable] {
302+
print("downcastToProtocols = \(downcastToProtocols)")
303+
} else {
304+
print("downcastToProtocols failed")
280305
}
281306

282-
if let downcastToProtocols = expectNotEmpty(derivedAsAnyObjectArray as? [protocol<Barable, Fooable>]) {
283-
expectEqual(derived2, downcastToProtocols.map { $0 as! Derived })
307+
// CHECK-NEXT: downcastToProtocols = [[derived2]]
308+
if let downcastToProtocols = derivedAsAnyObjectArray as? [protocol<Barable, Fooable>] {
309+
print("downcastToProtocols = \(downcastToProtocols)")
310+
} else {
311+
print("downcastToProtocols failed")
284312
}
285313

286-
expectEmpty(derivedAsAnyObjectArray as? [protocol<Barable, Bazable>])
287-
}
314+
// CHECK-NEXT: downcastToProtocols failed
315+
if let downcastToProtocols = derivedAsAnyObjectArray as? [protocol<Barable, Bazable>] {
316+
print("downcastToProtocols = \(downcastToProtocols)")
317+
} else {
318+
print("downcastToProtocols failed")
319+
}
288320

289-
func doTestBridgedObjC() {
290-
// CHECK: doTestBridgedObjC
291-
print("doTestBridgedObjC")
292-
293-
testBridgedObjC(Thunks())
294321
// CHECK-NEXT: produceBridgedObjCArray([BridgedObjC[[A:#[0-9]+]](0), BridgedObjC[[B:#[0-9]+]](1), BridgedObjC[[C:#[0-9]+]](2), BridgedObjC[[D:#[0-9]+]](3), BridgedObjC[[E:#[0-9]+]](4)])
295322
testBridgedObjC(Thunks())
296323
// CHECK-NEXT: 5 elements in the array
@@ -302,7 +329,7 @@ func doTestBridgedObjC() {
302329

303330
// CHECK-NEXT: acceptBridgedObjCArray([BridgedObjC[[A:#[0-9]+]](10), BridgedObjC[[B:#[0-9]+]](11), BridgedObjC[[C:#[0-9]+]](12), BridgedObjC[[D:#[0-9]+]](13), BridgedObjC[[E:#[0-9]+]](14)])
304331
}
305-
doTestBridgedObjC()
332+
testBridgedVerbatim()
306333

307334
//===--- Explicitly Bridged -----------------------------------------------===//
308335
// BridgedSwift conforms to _ObjectiveCBridgeable
@@ -427,7 +454,7 @@ func testExplicitlyBridged() {
427454

428455
// Downcast of Cocoa array to an array of strings (which should fail)
429456
// CHECK-NEXT: Could not downcast [AnyObject] to [String]
430-
if let _ = wrappedCocoaBridgedSwifts as? [String] {
457+
if let downcasted = wrappedCocoaBridgedSwifts as? [String] {
431458
print("Shouldn't be able to downcast to an array of strings")
432459
} else {
433460
print("Could not downcast [AnyObject] to [String]")
@@ -446,7 +473,7 @@ func testExplicitlyBridged() {
446473

447474
// Downcast from a nil implicitly unwrapped optional array of AnyObjects.
448475
wrappedCocoaBridgedSwiftsIUO = nil
449-
if let _ = wrappedCocoaBridgedSwiftsIUO as? [BridgedSwift] {
476+
if let downcasted = wrappedCocoaBridgedSwiftsIUO as? [BridgedSwift] {
450477
print("Cannot downcast from a nil array!")
451478
} else {
452479
// CHECK-NEXT: Correctly rejected downcast of nil array
@@ -466,7 +493,7 @@ func testExplicitlyBridged() {
466493

467494
// Downcast from a nil optional array of AnyObjects.
468495
wrappedCocoaBridgedSwiftsOpt = nil
469-
if let _ = wrappedCocoaBridgedSwiftsOpt as? [BridgedSwift] {
496+
if let downcasted = wrappedCocoaBridgedSwiftsOpt as? [BridgedSwift] {
470497
print("Cannot downcast from a nil array!")
471498
} else {
472499
// CHECK-NEXT: Correctly rejected downcast of nil array
@@ -490,9 +517,12 @@ func testRoundTrip() {
490517
class Test : NSObject {
491518
@objc dynamic func call(_ array: NSArray) -> NSArray {
492519

520+
// CHECK-NEXT: ---Passed array---
521+
print("---Passed array---")
493522
let result = array as! [BridgedSwift]
494-
expectEqual(0, bridgeFromOperationCount)
495-
expectEqual(0, bridgeToOperationCount)
523+
// CHECK-NEXT: bridge operations (from, to) = (0, 0)
524+
BridgedSwift.printStats()
525+
496526

497527
// Clear out the stats before returning array
498528
BridgedSwift.resetStats()
@@ -507,10 +537,12 @@ func testRoundTrip() {
507537
BridgedSwift(40), BridgedSwift(50) ]
508538

509539
BridgedSwift.resetStats()
510-
_ = test.call(array as NSArray)
540+
test.call(array as NSArray)
511541

512-
expectEqual(0, bridgeFromOperationCount)
513-
expectEqual(0, bridgeToOperationCount)
542+
// CHECK-NEXT: ---Returned Array---
543+
print("---Returned Array---")
544+
// CHECK-NEXT: bridge operations (from, to) = (0, 0)
545+
BridgedSwift.printStats()
514546
}
515547
testRoundTrip()
516548
//===--- Non-bridging -----------------------------------------------------===//
@@ -534,4 +566,5 @@ func testMutableArray() {
534566
}
535567
testMutableArray()
536568

537-
runAllTests()
569+
// CHECK-NEXT: done.
570+
print("done.")

0 commit comments

Comments
 (0)