Skip to content

Commit

Permalink
Merge pull request #61 from ddddxxx/generic-arguments-ptr
Browse files Browse the repository at this point in the history
use UnsafeBufferPointer for generic arguments
  • Loading branch information
wickwirew authored Dec 4, 2019
2 parents f953f5d + 0c07f32 commit 3e99509
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 17 deletions.
2 changes: 1 addition & 1 deletion Sources/Runtime/Metadata/ClassMetadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ struct ClassMetadata: NominalMetadataType {
var info = TypeInfo(metadata: self)
info.mangledName = mangledName()
info.properties = properties()
info.genericTypes = genericArguments()
info.genericTypes = Array(genericArguments())

var superClass = superClassMetadata()
while var sc = superClass {
Expand Down
2 changes: 1 addition & 1 deletion Sources/Runtime/Metadata/EnumMetadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ struct EnumMetadata: NominalMetadataType {
var info = TypeInfo(metadata: self)
info.mangledName = mangledName()
info.cases = cases()
info.genericTypes = genericArguments()
info.genericTypes = Array(genericArguments())
return info
}
}
23 changes: 9 additions & 14 deletions Sources/Runtime/Metadata/NominalMetadataType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ extension NominalMetadataType {
name: record.pointee.fieldName(),
type: record.pointee.type(
genericContext: pointer.pointee.typeDescriptor,
genericArguments: genericVector.pointee.element(at: 0)
genericArguments: genericVector
),
isVar: record.pointee.isVar,
offset: offsets[i],
Expand All @@ -81,26 +81,21 @@ extension NominalMetadataType {
}
}

func genericArguments() -> [Any.Type] {
guard isGeneric else { return [] }
func genericArguments() -> UnsafeMutableBufferPointer<Any.Type> {
guard isGeneric else { return .init(start: nil, count: 0) }

let genericHeader = pointer.pointee
let count = pointer.pointee
.typeDescriptor
.pointee
.genericContextHeader

guard genericHeader.base.numberOfParams > 0 else { return [] }

let vector = genericArgumentVector()

return (0..<Int(genericHeader.base.numberOfParams)).map { i in
return vector.pointee.element(at: i).pointee
}
.base
.numberOfParams
return genericArgumentVector().buffer(n: Int(count))
}

func genericArgumentVector() -> UnsafeMutablePointer<Vector<Any.Type>> {
func genericArgumentVector() -> UnsafeMutablePointer<Any.Type> {
return pointer
.advanced(by: genericArgumentOffset, wordSize: MemoryLayout<UnsafeRawPointer>.size)
.assumingMemoryBound(to: Vector<Any.Type>.self)
.assumingMemoryBound(to: Any.Type.self)
}
}
2 changes: 1 addition & 1 deletion Sources/Runtime/Metadata/StructMetadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct StructMetadata: NominalMetadataType {
var info = TypeInfo(metadata: self)
info.properties = properties()
info.mangledName = mangledName()
info.genericTypes = genericArguments()
info.genericTypes = Array(genericArguments())
return info
}
}

0 comments on commit 3e99509

Please sign in to comment.