mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
We fix up the VWT pointer, but not the heap destroyer. This doesn't matter for classes which use ObjC refcounting, which is the common case for dynamic subclasses, because that doesn't use the heap destroyer pointer. But it does matter for classes that use native Swift refcounting, such as classes that don't inherit from NSObject, or actors. rdar://113657917
43 lines
1.4 KiB
Swift
43 lines
1.4 KiB
Swift
// RUN: %target-run-simple-swift | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
import Foundation
|
|
import ObjectiveC
|
|
|
|
func DoSwizzle<T: AnyObject>(_ c: T.Type) -> T.Type {
|
|
let name = String(utf8String: class_getName(c))!
|
|
let subclass: AnyClass = objc_allocateClassPair(c, "\(name)Subclass", 0)!
|
|
objc_registerClassPair(subclass);
|
|
let subclassSubclass: AnyClass = objc_allocateClassPair(subclass, "\(name)SubclassSubclass", 0)!
|
|
objc_registerClassPair(subclassSubclass);
|
|
return subclassSubclass as! T.Type
|
|
}
|
|
|
|
_ = DoSwizzle(NSArray.self)
|
|
print("Swizzled NSArray")
|
|
// CHECK: Swizzled NSArray
|
|
|
|
// Ensure that we can dynamically subclass, instantiate, and destroy Swift
|
|
// classes, both NSObject-inheriting and native Swift.
|
|
class MySwiftClassToBeSwizzled {
|
|
required init() {}
|
|
}
|
|
|
|
let swiftSubclass = DoSwizzle(MySwiftClassToBeSwizzled.self)
|
|
print("Swizzled MySwiftClassToBeSwizzled")
|
|
// CHECK: Swizzled MySwiftClassToBeSwizzled
|
|
print("Instantiated the subclass: \(swiftSubclass.init())")
|
|
// CHECK: Instantiated the subclass:
|
|
|
|
class MyNSObjectSwiftClassToBeSwizzled: NSObject {
|
|
required override init() {}
|
|
}
|
|
|
|
let swiftNSObjectSubclass = DoSwizzle(MyNSObjectSwiftClassToBeSwizzled.self)
|
|
print("Swizzled MyNSObjectSwiftClassToBeSwizzled")
|
|
// CHECK: Swizzled MyNSObjectSwiftClassToBeSwizzled
|
|
print("Instantiated the subclass: \(swiftNSObjectSubclass.init())")
|
|
// CHECK: Instantiated the subclass:
|