Skip to content

Commit c167476

Browse files
authored
Merge pull request #43 from wickwirew/nested-struct-crash
check the flags to check whether the type is generic or not
2 parents 49433c6 + 304fa5d commit c167476

File tree

4 files changed

+43
-4
lines changed

4 files changed

+43
-4
lines changed

Sources/Runtime/Layouts/StructTypeDescriptor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct StructTypeDescriptor: TypeDescriptor {
2828
var flags: ContextDescriptorFlags
2929
var parent: Int32
3030
var mangledName: RelativePointer<Int32, CChar>
31-
var unknown3: Int32
31+
var accessFunctionPtr: RelativePointer<Int32, UnsafeRawPointer>
3232
var fieldDescriptor: RelativePointer<Int32, FieldDescriptor>
3333
var numberOfFields: Int32
3434
var offsetToTheFieldOffsetVector: RelativeVectorPointer<Int32, Int32>

Sources/Runtime/Layouts/TypeDescriptor.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ protocol TypeDescriptor {
2626
/// e.g. Struct are an Int32 and classes are an Int
2727
associatedtype FieldOffsetVectorOffsetType: IntegerConvertible
2828

29+
var flags: ContextDescriptorFlags { get set }
2930
var mangledName: RelativePointer<Int32, CChar> { get set }
3031
var fieldDescriptor: RelativePointer<Int32, FieldDescriptor> { get set }
3132
var numberOfFields: Int32 { get set }

Sources/Runtime/Metadata/NominalMetadataType.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ extension NominalMetadataType {
3535
return 2
3636
}
3737

38+
var isGeneric: Bool {
39+
return (pointer.pointee.typeDescriptor.pointee.flags & 0x80) != 0
40+
}
41+
3842
mutating func mangledName() -> String {
3943
return String(cString: pointer.pointee.typeDescriptor.pointee.mangledName.advanced())
4044
}
@@ -78,11 +82,18 @@ extension NominalMetadataType {
7882
}
7983

8084
func genericArguments() -> [Any.Type] {
81-
let n = pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams
82-
guard n > 0 else { return [] }
85+
guard isGeneric else { return [] }
86+
87+
let genericHeader = pointer.pointee
88+
.typeDescriptor
89+
.pointee
90+
.genericContextHeader
91+
92+
guard genericHeader.base.numberOfParams > 0 else { return [] }
8393

8494
let vector = genericArgumentVector()
85-
return (0..<Int(pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams)).map { i in
95+
96+
return (0..<Int(genericHeader.base.numberOfParams)).map { i in
8697
return vector.pointee.element(at: i).pointee
8798
}
8899
}

Tests/RuntimeTests/MetadataTests.swift

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class MetadataTests: XCTestCase {
7979

8080
var md = StructMetadata(type: A.self)
8181
let info = md.toTypeInfo()
82+
XCTAssert(info.genericTypes.count == 0)
8283
XCTAssert(info.kind == .struct)
8384
XCTAssert(info.type == A.self)
8485
XCTAssert(info.properties.count == 5)
@@ -89,6 +90,32 @@ class MetadataTests: XCTestCase {
8990
XCTAssert(info.properties[4].isVar)
9091
}
9192

93+
// https://github.com/wickwirew/Runtime/issues/42
94+
func testNestedStruct() {
95+
96+
let nest: () -> Void = {
97+
98+
struct NestedA {
99+
let a, b, c, d: Int
100+
var e: Int
101+
}
102+
103+
var md = StructMetadata(type: NestedA.self)
104+
let info = md.toTypeInfo()
105+
XCTAssert(info.genericTypes.count == 0)
106+
XCTAssert(info.kind == .struct)
107+
XCTAssert(info.type == NestedA.self)
108+
XCTAssert(info.properties.count == 5)
109+
XCTAssert(info.size == MemoryLayout<NestedA>.size)
110+
XCTAssert(info.alignment == MemoryLayout<NestedA>.alignment)
111+
XCTAssert(info.stride == MemoryLayout<NestedA>.stride)
112+
XCTAssert(!info.properties[0].isVar)
113+
XCTAssert(info.properties[4].isVar)
114+
}
115+
116+
nest()
117+
}
118+
92119
func testProtocol() {
93120
var md = ProtocolMetadata(type: MyProtocol.self)
94121
let info = md.toTypeInfo()

0 commit comments

Comments
 (0)