mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Non-generic classes with resilient ancestry do not have statically-emitted metadata, so we can now emit an Objective-C resilient class stub instead. Also, when emitting an Objective-C category, reference the class stub if the class has resilient ancestry; previously this case would hit an assert. Note that class stubs always start with a zero word, with the address point pointing immediately after. This works around a linker issue, where the linker tries to coalesce categories and gets confused upon encountering a class stub.
73 lines
1.7 KiB
Swift
73 lines
1.7 KiB
Swift
|
|
import resilient_struct
|
|
import Foundation
|
|
|
|
|
|
// Resilient base class
|
|
|
|
open class ResilientNSObjectOutsideParent: NSObject {
|
|
open var property: String = "ResilientNSObjectOutsideParent.property"
|
|
public final var finalProperty: String = "ResilientNSObjectOutsideParent.finalProperty"
|
|
|
|
open class var classProperty: String {
|
|
return "ResilientNSObjectOutsideParent.classProperty"
|
|
}
|
|
|
|
override public init() {
|
|
print("ResilientNSObjectOutsideParent.init()")
|
|
}
|
|
|
|
open func method() {
|
|
print("ResilientNSObjectOutsideParent.method()")
|
|
}
|
|
|
|
open class func classMethod() {
|
|
print("ResilientNSObjectOutsideParent.classMethod()")
|
|
}
|
|
|
|
open func getValue() -> Int {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// Resilient generic base class
|
|
|
|
open class ResilientGenericNSObjectOutsideParent<A>: NSObject {
|
|
open var property: A
|
|
public init(property: A) {
|
|
self.property = property
|
|
print("ResilientGenericNSObjectOutsideParent.init()")
|
|
}
|
|
|
|
open func method() {
|
|
print("ResilientGenericNSObjectOutsideParent.method()")
|
|
}
|
|
|
|
open class func classMethod() {
|
|
print("ResilientGenericNSObjectOutsideParent.classMethod()")
|
|
}
|
|
}
|
|
|
|
// Resilient subclass of generic class
|
|
|
|
open class ResilientConcreteNSObjectOutsideChild : ResilientGenericNSObjectOutsideParent<String> {
|
|
public override init(property: String) {
|
|
print("ResilientConcreteNSObjectOutsideChild.init(property: String)")
|
|
super.init(property: property)
|
|
}
|
|
|
|
open override func method() {
|
|
print("ResilientConcreteNSObjectOutsideChild.method()")
|
|
super.method()
|
|
}
|
|
|
|
open override class func classMethod() {
|
|
print("ResilientConcreteNSObjectOutsideChild.classMethod()")
|
|
super.classMethod()
|
|
}
|
|
}
|
|
|
|
// Fixed-layout base class
|
|
|
|
@_fixed_layout
|
|
open class FixedLayoutNSObjectOutsideParent: NSObject {} |