Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stop assuming pointer type for generic arguments #383

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/TokamakCore/Reflection/Layouts/FieldDescriptor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
)!
}
}
Expand Down
15 changes: 1 addition & 14 deletions Sources/TokamakCore/Reflection/Metadata/StructMetadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -77,22 +77,9 @@ struct StructMetadata {
}
}

func genericArguments() -> UnsafeBufferPointer<Any.Type> {
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<Any.Type> {
func genericArgumentVector() -> UnsafeRawPointer {
pointer
.raw.advanced(by: genericArgumentOffset * MemoryLayout<UnsafeRawPointer>.size)
.assumingMemoryBound(to: Any.Type.self)
}

var type: Any.Type {
Expand Down
2 changes: 0 additions & 2 deletions Sources/TokamakCore/Reflection/Models/TypeInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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? {
Expand Down
8 changes: 0 additions & 8 deletions Tests/TokamakTests/MetadataTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,7 @@ final class MetadataTests: XCTestCase {
func testGenericStruct() {
struct A<B, C, D, E, F, G, H> { let b: B }
let md = StructMetadata(type: A<Int, String, Bool, Int, Int, Int, Int>.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)
}
Expand All @@ -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)
Expand All @@ -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)
Expand Down