Skip to content

Commit 09bdaa3

Browse files
author
Harlan Haskins
committed
[test] Test looking up resilient NSObject subclasses
Add tests to make sure we can look up resilient NSObject subclasses in the ObjC runtime.
1 parent fbce6e7 commit 09bdaa3

File tree

2 files changed

+114
-5
lines changed

2 files changed

+114
-5
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
import resilient_struct
3+
import Foundation
4+
5+
6+
// Resilient base class
7+
8+
open class ResilientNSObjectOutsideParent: NSObject {
9+
open var property: String = "ResilientNSObjectOutsideParent.property"
10+
public final var finalProperty: String = "ResilientNSObjectOutsideParent.finalProperty"
11+
12+
open class var classProperty: String {
13+
return "ResilientNSObjectOutsideParent.classProperty"
14+
}
15+
16+
override public init() {
17+
print("ResilientNSObjectOutsideParent.init()")
18+
}
19+
20+
open func method() {
21+
print("ResilientNSObjectOutsideParent.method()")
22+
}
23+
24+
open class func classMethod() {
25+
print("ResilientNSObjectOutsideParent.classMethod()")
26+
}
27+
28+
open func getValue() -> Int {
29+
return 0
30+
}
31+
}
32+
33+
// Resilient generic base class
34+
35+
open class ResilientGenericNSObjectOutsideParent<A>: NSObject {
36+
open var property: A
37+
public init(property: A) {
38+
self.property = property
39+
print("ResilientGenericNSObjectOutsideParent.init()")
40+
}
41+
42+
open func method() {
43+
print("ResilientGenericNSObjectOutsideParent.method()")
44+
}
45+
46+
open class func classMethod() {
47+
print("ResilientGenericNSObjectOutsideParent.classMethod()")
48+
}
49+
}
50+
51+
// Resilient subclass of generic class
52+
53+
open class ResilientConcreteNSObjectOutsideChild : ResilientGenericNSObjectOutsideParent<String> {
54+
public override init(property: String) {
55+
print("ResilientConcreteNSObjectOutsideChild.init(property: String)")
56+
super.init(property: property)
57+
}
58+
59+
open override func method() {
60+
print("ResilientConcreteNSObjectOutsideChild.method()")
61+
super.method()
62+
}
63+
64+
open override class func classMethod() {
65+
print("ResilientConcreteNSObjectOutsideChild.classMethod()")
66+
super.classMethod()
67+
}
68+
}

test/Interpreter/SDK/objc_getClass.swift

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
// RUN: %target-build-swift-dylib(%t/%target-library-name(resilient_class)) -Xfrontend -enable-resilience %S/../../Inputs/resilient_class.swift -emit-module -emit-module-path %t/resilient_class.swiftmodule -module-name resilient_class -I%t -L%t -lresilient_struct
77
// RUN: %target-codesign %t/%target-library-name(resilient_class)
88

9-
// RUN: %target-build-swift %s -L %t -I %t -lresilient_struct -lresilient_class -o %t/main %target-rpath(%t)
9+
// RUN: %target-build-swift-dylib(%t/%target-library-name(resilient_objc_class)) -Xfrontend -enable-resilience %S/../../Inputs/resilient_objc_class.swift -emit-module -emit-module-path %t/resilient_objc_class.swiftmodule -module-name resilient_objc_class -I%t -L%t -lresilient_struct
10+
// RUN: %target-codesign %t/%target-library-name(resilient_objc_class)
11+
12+
// RUN: %target-build-swift %s -L %t -I %t -lresilient_struct -lresilient_class -lresilient_objc_class -o %t/main %target-rpath(%t)
1013
// RUN: %target-codesign %t/main
1114

12-
// RUN: %target-run %t/main %t/%target-library-name(resilient_struct) %t/libresilient_class%{target-shared-library-suffix}
15+
// RUN: %target-run %t/main %t/%target-library-name(resilient_struct) %t/libresilient_class%{target-shared-library-suffix} %t/libresilient_objc_class%{target-shared-library-suffix}
1316

1417

1518
// REQUIRES: executable_test
@@ -22,6 +25,7 @@ import ObjectiveC
2225
import Foundation
2326
import resilient_struct
2427
import resilient_class
28+
import resilient_objc_class
2529

2630
// Old OS versions do not have this hook.
2731
let getClassHookMissing = {
@@ -110,6 +114,19 @@ class ResilientFieldSubclassObjC : ResilientFieldSuperclassObjC {
110114
var subvalue = ResilientInt(i: 4)
111115
}
112116

117+
class ResilientSubclassOfNSObject : ResilientNSObjectOutsideParent {
118+
var subvalue = ResilientInt(i: 5)
119+
}
120+
121+
class ResilientSubclassOfGenericNSObject : ResilientGenericNSObjectOutsideParent<Int> {
122+
var subvalue = ResilientInt(i: 6)
123+
init() { super.init(property: 0) }
124+
}
125+
126+
class ResilientSubclassOfConcreteNSObject : ResilientConcreteNSObjectOutsideChild {
127+
var subvalue = ResilientInt(i: 7)
128+
init() { super.init(property: "") }
129+
}
113130

114131
func requireClass(named name: String, demangledName: String) {
115132
for _ in 1...2 {
@@ -124,14 +141,18 @@ func requireClass(named name: String) {
124141
return requireClass(named: name, demangledName: name)
125142
}
126143

127-
testSuite.test("Basic") {
144+
testSuite.test("Basic")
145+
.requireOwnProcess()
146+
.code {
128147
requireClass(named: "main.SwiftSubclass")
129148
requireClass(named: "main.SwiftSuperclass")
130149
requireClass(named: "main.ObjCSubclass")
131150
requireClass(named: "main.ObjCSuperclass")
132151
}
133152

134-
testSuite.test("BasicMangled") {
153+
testSuite.test("BasicMangled")
154+
.requireOwnProcess()
155+
.code {
135156
requireClass(named: "_TtC4main20MangledSwiftSubclass",
136157
demangledName: "main.MangledSwiftSubclass")
137158
requireClass(named: "_TtC4main22MangledSwiftSuperclass",
@@ -145,6 +166,7 @@ testSuite.test("BasicMangled") {
145166
testSuite.test("Generic")
146167
.skip(.custom({ getClassHookMissing },
147168
reason: "objc_getClass hook not present"))
169+
.requireOwnProcess()
148170
.code {
149171
requireClass(named: "main.ConstrainedSwiftSubclass")
150172
requireClass(named: "main.ConstrainedSwiftSuperclass")
@@ -155,6 +177,7 @@ testSuite.test("Generic")
155177
testSuite.test("GenericMangled")
156178
.skip(.custom({ getClassHookMissing },
157179
reason: "objc_getClass hook not present"))
180+
.requireOwnProcess()
158181
.code {
159182
requireClass(named: "_TtC4main24ConstrainedSwiftSubclass",
160183
demangledName: "main.ConstrainedSwiftSubclass")
@@ -169,6 +192,7 @@ testSuite.test("GenericMangled")
169192
testSuite.test("ResilientSubclass")
170193
.skip(.custom({ getClassHookMissing },
171194
reason: "objc_getClass hook not present"))
195+
.requireOwnProcess()
172196
.code {
173197
requireClass(named: "main.ResilientSubclass")
174198
requireClass(named: "main.ResilientSuperclass")
@@ -181,6 +205,7 @@ testSuite.test("ResilientSubclass")
181205
testSuite.test("ResilientField")
182206
.skip(.custom({ getClassHookMissing },
183207
reason: "objc_getClass hook not present"))
208+
.requireOwnProcess()
184209
.code {
185210
requireClass(named: "main.ResilientFieldSubclassSwift")
186211
requireClass(named: "main.ResilientFieldSuperclassSwift")
@@ -195,6 +220,23 @@ testSuite.test("ResilientField")
195220
expectEqual(ResilientFieldSubclassObjC().subvalue.i, 4)
196221
}
197222

223+
testSuite.test("ResilientNSObject")
224+
.skip(.custom({ getClassHookMissing },
225+
reason: "objc_getClass hook not present"))
226+
.requireOwnProcess()
227+
.code {
228+
requireClass(named: "_TtC4main27ResilientSubclassOfNSObject",
229+
demangledName: "main.ResilientSubclassOfNSObject")
230+
requireClass(named: "_TtC4main34ResilientSubclassOfGenericNSObject",
231+
demangledName: "main.ResilientSubclassOfGenericNSObject")
232+
requireClass(named: "_TtC4main35ResilientSubclassOfConcreteNSObject",
233+
demangledName: "main.ResilientSubclassOfConcreteNSObject")
234+
235+
expectEqual(ResilientSubclassOfNSObject().subvalue.i, 5)
236+
expectEqual(ResilientSubclassOfGenericNSObject().subvalue.i, 6)
237+
expectEqual(ResilientSubclassOfConcreteNSObject().subvalue.i, 7)
238+
}
239+
198240
testSuite.test("NotPresent") {
199241
// This class does not exist.
200242
expectNil(NSClassFromString("main.ThisClassDoesNotExist"));
@@ -207,4 +249,3 @@ testSuite.test("NotPresent") {
207249
}
208250

209251
runAllTests()
210-

0 commit comments

Comments
 (0)