From 924be31ee682b9c76ebf38573ac47ff334602adc Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Sun, 21 Feb 2021 20:34:59 +0000 Subject: [PATCH 1/2] Stop assuming pointer type for generic arguments --- .../Reflection/Layouts/FieldDescriptor.swift | 4 ++-- .../Reflection/Metadata/StructMetadata.swift | 15 +-------------- .../TokamakCore/Reflection/Models/TypeInfo.swift | 2 -- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/Sources/TokamakCore/Reflection/Layouts/FieldDescriptor.swift b/Sources/TokamakCore/Reflection/Layouts/FieldDescriptor.swift index 74c9feff9..d6551fcf7 100644 --- a/Sources/TokamakCore/Reflection/Layouts/FieldDescriptor.swift +++ b/Sources/TokamakCore/Reflection/Layouts/FieldDescriptor.swift @@ -54,14 +54,14 @@ extension UnsafePointer where Pointee == FieldRecord { func type( genericContext: UnsafeRawPointer?, - genericArguments: UnsafeRawPointer? + genericArguments: UnsafeRawPointer ) -> Any.Type { let typeName = advance(offset: \._mangledTypeName) return _getTypeByMangledNameInContext( typeName, getSymbolicMangledNameLength(typeName), genericContext, - genericArguments?.assumingMemoryBound(to: UnsafeRawPointer?.self) + genericArguments )! } } diff --git a/Sources/TokamakCore/Reflection/Metadata/StructMetadata.swift b/Sources/TokamakCore/Reflection/Metadata/StructMetadata.swift index 6e4966c36..3125dc812 100644 --- a/Sources/TokamakCore/Reflection/Metadata/StructMetadata.swift +++ b/Sources/TokamakCore/Reflection/Metadata/StructMetadata.swift @@ -77,22 +77,9 @@ struct StructMetadata { } } - func genericArguments() -> UnsafeBufferPointer { - guard isGeneric else { return .init(start: nil, count: 0) } - - let count = pointer.pointee - .typeDescriptor - .pointee - .genericContextHeader - .base - .numberOfParams - return genericArgumentVector().buffer(n: Int(count)) - } - - func genericArgumentVector() -> UnsafePointer { + func genericArgumentVector() -> UnsafeRawPointer { pointer .raw.advanced(by: genericArgumentOffset * MemoryLayout.size) - .assumingMemoryBound(to: Any.Type.self) } var type: Any.Type { diff --git a/Sources/TokamakCore/Reflection/Models/TypeInfo.swift b/Sources/TokamakCore/Reflection/Models/TypeInfo.swift index c7db99be1..325b17f9d 100644 --- a/Sources/TokamakCore/Reflection/Models/TypeInfo.swift +++ b/Sources/TokamakCore/Reflection/Models/TypeInfo.swift @@ -29,7 +29,6 @@ public struct TypeInfo { public let size: Int public let alignment: Int public let stride: Int - public let genericTypes: [Any.Type] init(metadata: StructMetadata) { kind = metadata.kind @@ -40,7 +39,6 @@ public struct TypeInfo { stride = metadata.stride properties = metadata.properties() mangledName = metadata.mangledName() - genericTypes = Array(metadata.genericArguments()) } public func property(named: String) -> PropertyInfo? { From 72a00b418781e02f717c15c48f1c0bb5bd54a2f5 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Sun, 21 Feb 2021 21:18:16 +0000 Subject: [PATCH 2/2] Remove tests for removed APIs --- Tests/TokamakTests/MetadataTests.swift | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Tests/TokamakTests/MetadataTests.swift b/Tests/TokamakTests/MetadataTests.swift index 29e86b8d3..b7f91724d 100644 --- a/Tests/TokamakTests/MetadataTests.swift +++ b/Tests/TokamakTests/MetadataTests.swift @@ -27,13 +27,7 @@ final class MetadataTests: XCTestCase { func testGenericStruct() { struct A { let b: B } let md = StructMetadata(type: A.self) - let args = md.genericArguments() let props = md.properties() - XCTAssert(args.count == 7) - XCTAssert(args[0] == Int.self) - XCTAssert(args[1] == String.self) - XCTAssert(args[2] == Bool.self) - XCTAssert(args[3] == Int.self) XCTAssert(props.count == 1) XCTAssert(props[0].type == Int.self) } @@ -46,7 +40,6 @@ final class MetadataTests: XCTestCase { let md = StructMetadata(type: A.self) let info = md.toTypeInfo() - XCTAssert(info.genericTypes.count == 0) XCTAssert(info.kind == .struct) XCTAssert(info.type == A.self) XCTAssert(info.properties.count == 5) @@ -67,7 +60,6 @@ final class MetadataTests: XCTestCase { let md = StructMetadata(type: NestedA.self) let info = md.toTypeInfo() - XCTAssert(info.genericTypes.count == 0) XCTAssert(info.kind == .struct) XCTAssert(info.type == NestedA.self) XCTAssert(info.properties.count == 5)