22
22
23
23
import Foundation
24
24
25
+ struct AnyClassMetadata {
26
+
27
+ var pointer : UnsafeMutablePointer < AnyClassMetadataLayout >
28
+
29
+ init ( type: Any . Type ) {
30
+ pointer = unsafeBitCast ( type, to: UnsafeMutablePointer< AnyClassMetadataLayout> . self )
31
+ }
32
+
33
+ func asClassMetadata( ) -> ClassMetadata ? {
34
+ guard pointer. pointee. isSwiftClass else {
35
+ return nil
36
+ }
37
+ let ptr = pointer. raw. assumingMemoryBound ( to: ClassMetadataLayout . self)
38
+ return ClassMetadata ( pointer: ptr)
39
+ }
40
+ }
41
+
25
42
struct ClassMetadata : NominalMetadataType {
26
43
27
44
var pointer : UnsafeMutablePointer < ClassMetadataLayout >
@@ -60,15 +77,12 @@ struct ClassMetadata: NominalMetadataType {
60
77
fatalError ( " Cannot get the `genericArgumentOffset` for classes with a resilient superclass " )
61
78
}
62
79
63
- func superClassMetadata( ) -> ClassMetadata ? {
80
+ func superClassMetadata( ) -> AnyClassMetadata ? {
64
81
let superClass = pointer. pointee. superClass
65
- // type comparison directly to NSObject.self does not work.
66
- // just compare the type name instead.
67
- if superClass != swiftObject ( ) && " \( superClass) " != " NSObject " {
68
- return ClassMetadata ( type: superClass)
69
- } else {
82
+ guard superClass != swiftObject ( ) else {
70
83
return nil
71
84
}
85
+ return AnyClassMetadata ( type: superClass)
72
86
}
73
87
74
88
mutating func toTypeInfo( ) -> TypeInfo {
@@ -77,12 +91,12 @@ struct ClassMetadata: NominalMetadataType {
77
91
info. properties = properties ( )
78
92
info. genericTypes = Array ( genericArguments ( ) )
79
93
80
- var superClass = superClassMetadata ( )
94
+ var superClass = superClassMetadata ( ) ? . asClassMetadata ( )
81
95
while var sc = superClass {
82
96
info. inheritance. append ( sc. type)
83
97
let superInfo = sc. toTypeInfo ( )
84
98
info. properties. append ( contentsOf: superInfo. properties)
85
- superClass = sc. superClassMetadata ( )
99
+ superClass = sc. superClassMetadata ( ) ? . asClassMetadata ( )
86
100
}
87
101
88
102
return info
0 commit comments