diff --git a/Sources/Runtime/Metadata/FuntionMetadata.swift b/Sources/Runtime/Metadata/FuntionMetadata.swift index 4f6d03c..22e4988 100644 --- a/Sources/Runtime/Metadata/FuntionMetadata.swift +++ b/Sources/Runtime/Metadata/FuntionMetadata.swift @@ -36,10 +36,10 @@ struct FunctionMetadata: MetadataType { private func argumentInfo() -> (Int, [Any.Type], Any.Type) { let n = numberArguments() - var argTypes = pointer.pointee.argumentVector.vector(n: n + 1) + let argTypeBuffer = pointer.pointee.argumentVector.vector(n: n + 1) - let resultType = argTypes[0] - argTypes.removeFirst() + let resultType = argTypeBuffer[0] + let argTypes = Array(argTypeBuffer.dropFirst()) return (n, argTypes, resultType) } diff --git a/Sources/Runtime/Metadata/TupleMetadata.swift b/Sources/Runtime/Metadata/TupleMetadata.swift index 428fc59..85e7eb1 100644 --- a/Sources/Runtime/Metadata/TupleMetadata.swift +++ b/Sources/Runtime/Metadata/TupleMetadata.swift @@ -36,10 +36,8 @@ struct TupleMetadata: MetadataType, TypeInfoConvertible { return labels } - func elements() -> [TupleElementLayout] { - let n = numberOfElements() - guard n > 0 else { return [] } - return pointer.pointee.elementVector.vector(n: n) + func elements() -> UnsafeBufferPointer { + return pointer.pointee.elementVector.vector(n: numberOfElements()) } func properies() -> [PropertyInfo] { diff --git a/Sources/Runtime/Pointers/RelativeVectorPointer.swift b/Sources/Runtime/Pointers/RelativeVectorPointer.swift index f84bf4c..4078cf1 100644 --- a/Sources/Runtime/Pointers/RelativeVectorPointer.swift +++ b/Sources/Runtime/Pointers/RelativeVectorPointer.swift @@ -24,10 +24,10 @@ import Foundation struct RelativeVectorPointer { var offset: Offset - mutating func vector(metadata: UnsafePointer, n: Int) -> [Pointee] { + mutating func vector(metadata: UnsafePointer, n: Int) -> UnsafeBufferPointer { return metadata.advanced(by: numericCast(offset)) .raw.assumingMemoryBound(to: Pointee.self) - .vector(n: n) + .buffer(n: n) } } diff --git a/Sources/Runtime/Pointers/Vector.swift b/Sources/Runtime/Pointers/Vector.swift index e9491a7..b69d3d6 100644 --- a/Sources/Runtime/Pointers/Vector.swift +++ b/Sources/Runtime/Pointers/Vector.swift @@ -26,10 +26,10 @@ struct Vector { var element: Element - mutating func vector(n: Int) -> [Element] { + mutating func vector(n: Int) -> UnsafeBufferPointer { return withUnsafePointer(to: &self) { $0.withMemoryRebound(to: Element.self, capacity: 1) { start in - return start.vector(n: n) + return start.buffer(n: n) } } } diff --git a/Sources/Runtime/Utilities/Pointer+Extensions.swift b/Sources/Runtime/Utilities/Pointer+Extensions.swift index 6b86b6b..41525c8 100644 --- a/Sources/Runtime/Utilities/Pointer+Extensions.swift +++ b/Sources/Runtime/Utilities/Pointer+Extensions.swift @@ -32,12 +32,8 @@ extension UnsafePointer { return UnsafeMutablePointer(mutating: self) } - func vector(n: Int) -> [Pointee] { - var result = [Pointee]() - for i in 0.. UnsafeBufferPointer { + return UnsafeBufferPointer(start: self, count: n) } } @@ -57,12 +53,8 @@ extension UnsafeMutablePointer { return UnsafeMutableRawPointer(self) } - func vector(n: Int) -> [Pointee] { - var result = [Pointee]() - for i in 0.. UnsafeMutableBufferPointer { + return UnsafeMutableBufferPointer(start: self, count: n) } func advanced(by n: Int, wordSize: Int) -> UnsafeMutableRawPointer {