|
14 | 14 | // RUN: if [ %target-runtime == "objc" ]; \
|
15 | 15 | // RUN: then \
|
16 | 16 | // RUN: %target-clang %S/Inputs/Mirror/Mirror.mm -c -o %t/Mirror.mm.o -g && \
|
17 |
| -// RUN: %target-build-swift -Xfrontend -disable-access-control %s -I %S/Inputs/Mirror/ -Xlinker %t/Mirror.mm.o -o %t/Mirror; \ |
| 17 | +// RUN: %target-build-swift -Xfrontend -disable-access-control -Xfrontend -enable-experimental-feature -Xfrontend WeakLet %s -I %S/Inputs/Mirror/ -Xlinker %t/Mirror.mm.o -o %t/Mirror; \ |
18 | 18 | // RUN: else \
|
19 |
| -// RUN: %target-build-swift %s -Xfrontend -disable-access-control -o %t/Mirror; \ |
| 19 | +// RUN: %target-build-swift %s -Xfrontend -disable-access-control -Xfrontend -enable-experimental-feature -Xfrontend WeakLet -o %t/Mirror; \ |
20 | 20 | // RUN: fi
|
21 | 21 | // RUN: %target-codesign %t/Mirror
|
22 | 22 | // RUN: %target-run %t/Mirror
|
@@ -123,6 +123,91 @@ mirrors.test("class/NativeSwiftClassHasNativeWeakReferenceNoLeak") {
|
123 | 123 | expectNil(verifier)
|
124 | 124 | }
|
125 | 125 |
|
| 126 | +#if hasFeature(WeakLet) |
| 127 | +class NativeSwiftClassHasWeakLet { |
| 128 | + weak let weakProperty: AnyObject? |
| 129 | + let x: Int |
| 130 | + init(x: Int, weakProperty: AnyObject?) { |
| 131 | + self.x = x |
| 132 | + self.weakProperty = weakProperty |
| 133 | + } |
| 134 | +} |
| 135 | + |
| 136 | +class NativeSwiftClassHasNativeClassBoundExistentialLet { |
| 137 | + weak let weakProperty: NativeClassBoundExistential? |
| 138 | + let x: Int |
| 139 | + init(x: Int, weakProperty: NativeClassBoundExistential?) { |
| 140 | + self.x = x |
| 141 | + self.weakProperty = weakProperty |
| 142 | + } |
| 143 | +} |
| 144 | + |
| 145 | +struct StructHasNativeWeakLetReference { |
| 146 | + weak let weakProperty: AnyObject? |
| 147 | + let x: Int |
| 148 | + init(x: Int, weakProperty: AnyObject?) { |
| 149 | + self.x = x |
| 150 | + self.weakProperty = weakProperty |
| 151 | + } |
| 152 | +} |
| 153 | + |
| 154 | +mirrors.test("class/NativeSwiftClassHasNativeWeakLetReference") { |
| 155 | + let child = NativeSwiftClass(x: 2020) |
| 156 | + let parent = NativeSwiftClassHasWeakLet(x: 1010, weakProperty: child) |
| 157 | + let mirror = Mirror(reflecting: parent) |
| 158 | + let children = Array(mirror.children) |
| 159 | + let extractedChild = children[0].1 as! NativeSwiftClass |
| 160 | + expectNotEqual(parent.x, extractedChild.x) |
| 161 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 162 | + expectEqual(child.x, extractedChild.x) |
| 163 | + print(extractedChild) |
| 164 | +} |
| 165 | + |
| 166 | +mirrors.test("class/NativeSwiftClassHasNativeClassBoundExistentialLet") { |
| 167 | + let child = NativeSwiftClass(x: 2020) as NativeClassBoundExistential |
| 168 | + let parent = NativeSwiftClassHasNativeClassBoundExistentialLet(x: 1010, weakProperty: child) |
| 169 | + let mirror = Mirror(reflecting: parent) |
| 170 | + let children = Array(mirror.children) |
| 171 | + let extractedChild = children[0].1 as! NativeSwiftClass |
| 172 | + expectNotEqual(parent.x, extractedChild.x) |
| 173 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 174 | + expectEqual(child.x, extractedChild.x) |
| 175 | + print(extractedChild) |
| 176 | +} |
| 177 | + |
| 178 | +mirrors.test("struct/StructHasNativeWeakLetReference") { |
| 179 | + let child = NativeSwiftClass(x: 2020) |
| 180 | + var parent = StructHasNativeWeakLetReference(x: 1010, weakProperty: child) |
| 181 | + let mirror = Mirror(reflecting: parent) |
| 182 | + let children = Array(mirror.children) |
| 183 | + let extractedChild = children[0].1 as! NativeSwiftClass |
| 184 | + expectNotEqual(parent.x, extractedChild.x) |
| 185 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 186 | + expectEqual(child.x, extractedChild.x) |
| 187 | + print(extractedChild) |
| 188 | +} |
| 189 | + |
| 190 | +// https://github.com/apple/swift/issues/51384 |
| 191 | +// Using 'Mirror' to access a weak reference results in object being |
| 192 | +// retained indefinitely |
| 193 | +mirrors.test("class/NativeSwiftClassHasNativeWeakLetReferenceNoLeak") { |
| 194 | + weak var verifier: AnyObject? |
| 195 | + do { |
| 196 | + let child = NativeSwiftClass(x: 2020) |
| 197 | + verifier = child |
| 198 | + let parent = NativeSwiftClassHasWeakLet(x: 1010, weakProperty: child) |
| 199 | + let mirror = Mirror(reflecting: parent) |
| 200 | + let children = Array(mirror.children) |
| 201 | + let extractedChild = children[0].1 as! NativeSwiftClass |
| 202 | + expectNotNil(extractedChild) |
| 203 | + expectNotNil(verifier) |
| 204 | + // If child is destroyed, the above cast and checks will fail. |
| 205 | + _fixLifetime(child) |
| 206 | + } |
| 207 | + expectNil(verifier) |
| 208 | +} |
| 209 | +#endif |
| 210 | + |
126 | 211 | #if _runtime(_ObjC)
|
127 | 212 |
|
128 | 213 | import Foundation
|
@@ -292,6 +377,160 @@ mirrors.test("struct/StructHasObjCClassBoundExistential") {
|
292 | 377 | print(extractedChild)
|
293 | 378 | }
|
294 | 379 |
|
| 380 | +#if hasFeature(WeakLet) |
| 381 | + |
| 382 | +class NativeSwiftClassHasObjCClassBoundExistentialLet { |
| 383 | + weak let weakProperty: ObjCClassExistential? |
| 384 | + let x: Int |
| 385 | + init(x: Int, weakProperty: ObjCClassExistential?) { |
| 386 | + self.x = x |
| 387 | + self.weakProperty = weakProperty |
| 388 | + } |
| 389 | +} |
| 390 | + |
| 391 | +class ObjCClassHasWeakLet : NSObject { |
| 392 | + weak let weakProperty: AnyObject? |
| 393 | + let x: Int |
| 394 | + init(x: Int, weakProperty: AnyObject?) { |
| 395 | + self.x = x |
| 396 | + self.weakProperty = weakProperty |
| 397 | + } |
| 398 | +} |
| 399 | + |
| 400 | +class ObjCClassHasNativeClassBoundExistentialLet : NSObject { |
| 401 | + weak let weakProperty: NativeClassBoundExistential? |
| 402 | + let x: Int |
| 403 | + init(x: Int, weakProperty: NativeClassBoundExistential?) { |
| 404 | + self.x = x |
| 405 | + self.weakProperty = weakProperty |
| 406 | + } |
| 407 | +} |
| 408 | + |
| 409 | +class ObjCClassHasObjCClassBoundExistentialLet : NSObject { |
| 410 | + weak let weakProperty: ObjCClassExistential? |
| 411 | + let x: Int |
| 412 | + init(x: Int, weakProperty: ObjCClassExistential?) { |
| 413 | + self.x = x |
| 414 | + self.weakProperty = weakProperty |
| 415 | + } |
| 416 | +} |
| 417 | + |
| 418 | +struct StructHasObjCWeakLetReference { |
| 419 | + weak let weakProperty: ObjCClass? |
| 420 | + let x: Int |
| 421 | + init(x: Int, weakProperty: ObjCClass?) { |
| 422 | + self.x = x |
| 423 | + self.weakProperty = weakProperty |
| 424 | + } |
| 425 | +} |
| 426 | + |
| 427 | +struct StructHasObjCClassBoundExistentialLet { |
| 428 | + weak let weakProperty: ObjCClassExistential? |
| 429 | + let x: Int |
| 430 | + init(x: Int, weakProperty: ObjCClassExistential?) { |
| 431 | + self.x = x |
| 432 | + self.weakProperty = weakProperty |
| 433 | + } |
| 434 | +} |
| 435 | + |
| 436 | +mirrors.test("class/NativeSwiftClassHasObjCWeakLetReference") { |
| 437 | + let child = ObjCClass(x: 2020) |
| 438 | + let parent = NativeSwiftClassHasWeakLet(x: 1010, weakProperty: child) |
| 439 | + let mirror = Mirror(reflecting: parent) |
| 440 | + let children = Array(mirror.children) |
| 441 | + let extractedChild = children[0].1 as! ObjCClass |
| 442 | + expectNotEqual(parent.x, extractedChild.x) |
| 443 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 444 | + expectEqual(child.x, extractedChild.x) |
| 445 | + print(extractedChild) |
| 446 | +} |
| 447 | + |
| 448 | +mirrors.test("class/NativeSwiftClassHasObjCClassBoundExistentialLet") { |
| 449 | + let child = ObjCClass(x: 2020) as ObjCClassExistential |
| 450 | + let parent = NativeSwiftClassHasObjCClassBoundExistentialLet(x: 1010, weakProperty: child) |
| 451 | + let mirror = Mirror(reflecting: parent) |
| 452 | + let children = Array(mirror.children) |
| 453 | + let extractedChild = children[0].1 as! ObjCClass |
| 454 | + expectNotEqual(parent.x, extractedChild.x) |
| 455 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 456 | + expectEqual(child.x, extractedChild.x) |
| 457 | + print(extractedChild) |
| 458 | +} |
| 459 | + |
| 460 | +mirrors.test("class/ObjCClassHasNativeWeakLet") { |
| 461 | + let child = NativeSwiftClass(x: 2020) |
| 462 | + let parent = ObjCClassHasWeakLet(x: 1010, weakProperty: child) |
| 463 | + let mirror = Mirror(reflecting: parent) |
| 464 | + let children = Array(mirror.children) |
| 465 | + let extractedChild = children[0].1 as! NativeSwiftClass |
| 466 | + expectNotEqual(parent.x, extractedChild.x) |
| 467 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 468 | + expectEqual(child.x, extractedChild.x) |
| 469 | + print(extractedChild) |
| 470 | +} |
| 471 | + |
| 472 | +mirrors.test("class/ObjcCClassHasObjCWeakLetReference") { |
| 473 | + let child = ObjCClass(x: 2020) |
| 474 | + let parent = ObjCClassHasWeakLet(x: 1010, weakProperty: child) |
| 475 | + let mirror = Mirror(reflecting: parent) |
| 476 | + let children = Array(mirror.children) |
| 477 | + let extractedChild = children[0].1 as! ObjCClass |
| 478 | + expectNotEqual(parent.x, extractedChild.x) |
| 479 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 480 | + expectEqual(child.x, extractedChild.x) |
| 481 | + print(extractedChild) |
| 482 | +} |
| 483 | + |
| 484 | +mirrors.test("class/ObjCClassHasNativeClassBoundExistentialLet") { |
| 485 | + let child = NativeSwiftClass(x: 2020) as NativeClassBoundExistential |
| 486 | + let parent = ObjCClassHasNativeClassBoundExistentialLet(x: 1010, weakProperty: child) |
| 487 | + let mirror = Mirror(reflecting: parent) |
| 488 | + let children = Array(mirror.children) |
| 489 | + let extractedChild = children[0].1 as! NativeSwiftClass |
| 490 | + expectNotEqual(parent.x, extractedChild.x) |
| 491 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 492 | + expectEqual(child.x, extractedChild.x) |
| 493 | + print(extractedChild) |
| 494 | +} |
| 495 | + |
| 496 | +mirrors.test("class/ObjCClassHasObjCClassBoundExistentialLet") { |
| 497 | + let child = ObjCClass(x: 2020) as ObjCClassExistential |
| 498 | + let parent = ObjCClassHasObjCClassBoundExistentialLet(x: 1010, weakProperty: child) |
| 499 | + let mirror = Mirror(reflecting: parent) |
| 500 | + let children = Array(mirror.children) |
| 501 | + let extractedChild = children[0].1 as! ObjCClass |
| 502 | + expectNotEqual(parent.x, extractedChild.x) |
| 503 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 504 | + expectEqual(child.x, extractedChild.x) |
| 505 | + print(extractedChild) |
| 506 | +} |
| 507 | + |
| 508 | +mirrors.test("struct/StructHasObjCWeakLetReference") { |
| 509 | + let child = ObjCClass(x: 2020) |
| 510 | + var parent = StructHasObjCWeakLetReference(x: 1010, weakProperty: child) |
| 511 | + let mirror = Mirror(reflecting: parent) |
| 512 | + let children = Array(mirror.children) |
| 513 | + let extractedChild = children[0].1 as! ObjCClass |
| 514 | + expectNotEqual(parent.x, extractedChild.x) |
| 515 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 516 | + expectEqual(child.x, extractedChild.x) |
| 517 | + print(extractedChild) |
| 518 | +} |
| 519 | + |
| 520 | +mirrors.test("struct/StructHasObjCClassBoundExistentialLet") { |
| 521 | + let child = ObjCClass(x: 2020) as ObjCClassExistential |
| 522 | + var parent = StructHasObjCClassBoundExistentialLet(x: 1010, weakProperty: child) |
| 523 | + let mirror = Mirror(reflecting: parent) |
| 524 | + let children = Array(mirror.children) |
| 525 | + let extractedChild = children[0].1 as! ObjCClass |
| 526 | + expectNotEqual(parent.x, extractedChild.x) |
| 527 | + expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild)) |
| 528 | + expectEqual(child.x, extractedChild.x) |
| 529 | + print(extractedChild) |
| 530 | +} |
| 531 | + |
| 532 | +#endif |
| 533 | + |
295 | 534 | #endif
|
296 | 535 |
|
297 | 536 | runAllTests()
|
0 commit comments