Skip to content

Commit

Permalink
removed hard coded generic vector from layouts
Browse files Browse the repository at this point in the history
  • Loading branch information
wickwirew committed Apr 6, 2019
1 parent c598c0c commit 464e60a
Show file tree
Hide file tree
Showing 10 changed files with 102 additions and 76 deletions.
4 changes: 4 additions & 0 deletions Runtime.xcodeproj/project.pbxproj
Expand Up @@ -37,6 +37,7 @@
DEB67B5A2259132800CE3E27 /* Case.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB67B592259132800CE3E27 /* Case.swift */; };
DEB67B5C225924FE00CE3E27 /* Union.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB67B5B225924FE00CE3E27 /* Union.swift */; };
DEB67B5E22593EF800CE3E27 /* TargetTypeGenericContextDescriptorHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB67B5D22593EF800CE3E27 /* TargetTypeGenericContextDescriptorHeader.swift */; };
DEB67B602259448F00CE3E27 /* NominalMetadataType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB67B5F2259448F00CE3E27 /* NominalMetadataType.swift */; };
OBJ_100 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* Metadata.swift */; };
OBJ_101 /* MetadataType.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* MetadataType.swift */; };
OBJ_102 /* ProtocolMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* ProtocolMetadata.swift */; };
Expand Down Expand Up @@ -112,6 +113,7 @@
DEB67B592259132800CE3E27 /* Case.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Case.swift; sourceTree = "<group>"; };
DEB67B5B225924FE00CE3E27 /* Union.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Union.swift; sourceTree = "<group>"; };
DEB67B5D22593EF800CE3E27 /* TargetTypeGenericContextDescriptorHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TargetTypeGenericContextDescriptorHeader.swift; sourceTree = "<group>"; };
DEB67B5F2259448F00CE3E27 /* NominalMetadataType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NominalMetadataType.swift; sourceTree = "<group>"; };
OBJ_10 /* DefaultValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultValue.swift; sourceTree = "<group>"; };
OBJ_11 /* Factory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Factory.swift; sourceTree = "<group>"; };
OBJ_13 /* ClassHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClassHeader.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -223,6 +225,7 @@
OBJ_33 /* ProtocolMetadata.swift */,
OBJ_34 /* StructMetadata.swift */,
OBJ_35 /* TupleMetadata.swift */,
DEB67B5F2259448F00CE3E27 /* NominalMetadataType.swift */,
);
path = Metadata;
sourceTree = "<group>";
Expand Down Expand Up @@ -508,6 +511,7 @@
OBJ_97 /* ClassMetadata.swift in Sources */,
OBJ_98 /* EnumMetadata.swift in Sources */,
OBJ_99 /* FuntionMetadata.swift in Sources */,
DEB67B602259448F00CE3E27 /* NominalMetadataType.swift in Sources */,
OBJ_100 /* Metadata.swift in Sources */,
OBJ_101 /* MetadataType.swift in Sources */,
OBJ_102 /* ProtocolMetadata.swift in Sources */,
Expand Down
6 changes: 0 additions & 6 deletions Sources/Runtime/Layouts/ClassMetadataLayout.swift
Expand Up @@ -37,10 +37,4 @@ struct ClassMetadataLayout: NominalMetadataLayoutType {
var classAddressPoint: UInt32
var typeDescriptor: UnsafeMutablePointer<ClassTypeDescriptor>
var iVarDestroyer: UnsafeRawPointer

// FIXME: this is a temporary fix to get the `genericArgumentVector` in sort of the right spot.
// this should really be calculated.
var a, b, c, d, e: Int

var genericArgumentVector: Vector<Any.Type>
}
1 change: 0 additions & 1 deletion Sources/Runtime/Layouts/EnumMetadataLayout.swift
Expand Up @@ -25,5 +25,4 @@ import Foundation
struct EnumMetadataLayout: NominalMetadataLayoutType {
var _kind: Int
var typeDescriptor: UnsafeMutablePointer<EnumTypeDescriptor>
var genericArgumentVector: Vector<Any.Type>
}
1 change: 0 additions & 1 deletion Sources/Runtime/Layouts/MetadataLayoutType.swift
Expand Up @@ -29,5 +29,4 @@ protocol MetadataLayoutType {
protocol NominalMetadataLayoutType: MetadataLayoutType {
associatedtype Descriptor: TypeDescriptor
var typeDescriptor: UnsafeMutablePointer<Descriptor> { get set }
var genericArgumentVector: Vector<Any.Type> { get set }
}
1 change: 0 additions & 1 deletion Sources/Runtime/Layouts/StructMetadataLayout.swift
Expand Up @@ -25,5 +25,4 @@ import Foundation
struct StructMetadataLayout: NominalMetadataLayoutType {
var _kind: Int
var typeDescriptor: UnsafeMutablePointer<StructTypeDescriptor>
var genericArgumentVector: Vector<Any.Type>
}
16 changes: 1 addition & 15 deletions Sources/Runtime/Metadata/ClassMetadata.swift
Expand Up @@ -22,7 +22,7 @@

import Foundation

struct ClassMetadata: MetadataType {
struct ClassMetadata: NominalMetadataType {

var pointer: UnsafeMutablePointer<ClassMetadataLayout>

Expand Down Expand Up @@ -58,20 +58,6 @@ struct ClassMetadata: MetadataType {
fatalError("Cannot get the `genericArgumentOffset` for classes with a resilient superclass")
}

func genericArguments() -> [Any.Type] {
let vector = pointer
.advanced(by: genericArgumentOffset, wordSize: MemoryLayout<UnsafeRawPointer>.size)
.assumingMemoryBound(to: Vector<Any.Type>.self)

let n = pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams

guard n > 0 else { return [] }

return (0..<Int(pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams)).map { i in
return vector.pointee.element(at: i).pointee
}
}

func superClassMetadata() -> ClassMetadata? {
let superClass = pointer.pointee.superClass
// type comparison directly to NSObject.self does not work.
Expand Down
2 changes: 1 addition & 1 deletion Sources/Runtime/Metadata/EnumMetadata.swift
Expand Up @@ -22,7 +22,7 @@

import Foundation

struct EnumMetadata: MetadataType {
struct EnumMetadata: NominalMetadataType {

var pointer: UnsafeMutablePointer<EnumMetadataLayout>

Expand Down
50 changes: 0 additions & 50 deletions Sources/Runtime/Metadata/MetadataType.swift
Expand Up @@ -81,53 +81,3 @@ extension MetadataType {
return TypeInfo(metadata: self)
}
}

extension MetadataType where Layout: NominalMetadataLayoutType {

mutating func mangledName() -> String {
return String(cString: pointer.pointee.typeDescriptor.pointee.mangledName.advanced())
}

mutating func numberOfFields() -> Int {
return pointer.pointee.typeDescriptor.pointee.numberOfFields.getInt()
}

mutating func fieldOffsets() -> [Int] {
return pointer.pointee.typeDescriptor.pointee
.offsetToTheFieldOffsetVector
.vector(metadata: pointer.raw.assumingMemoryBound(to: Int.self), n: numberOfFields())
.map { $0.getInt() }
}

mutating func properties() -> [PropertyInfo] {
let offsets = fieldOffsets()
let fieldDescriptor = pointer.pointee.typeDescriptor.pointee
.fieldDescriptor
.advanced()

return (0..<numberOfFields()).map { i in
let record = fieldDescriptor
.pointee
.fields
.element(at: i)

return PropertyInfo(
name: record.pointee.fieldName(),
type: record.pointee.type(
genericContext: pointer.pointee.typeDescriptor,
genericArguments: pointer.pointee.genericArgumentVector.element(at: 0)
),
isVar: record.pointee.isVar,
offset: offsets[i],
ownerType: type
)
}
}

mutating func genericArguments() -> [Any.Type] {
let n = pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams
return pointer.pointee
.genericArgumentVector
.vector(n: n)
}
}
95 changes: 95 additions & 0 deletions Sources/Runtime/Metadata/NominalMetadataType.swift
@@ -0,0 +1,95 @@
// MIT License
//
// Copyright (c) 2017 Wesley Wickwire
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

protocol NominalMetadataType: MetadataType where Layout: NominalMetadataLayoutType {

/// The offset of the generic type vector in pointer sized words from the
/// start of the metadata record.
var genericArgumentOffset: Int { get }
}

extension NominalMetadataType {

var genericArgumentOffset: Int {
// default to 2. This would put it right after the type descriptor which is valid
// for all types except for classes
return 2
}

mutating func mangledName() -> String {
return String(cString: pointer.pointee.typeDescriptor.pointee.mangledName.advanced())
}

mutating func numberOfFields() -> Int {
return pointer.pointee.typeDescriptor.pointee.numberOfFields.getInt()
}

mutating func fieldOffsets() -> [Int] {
return pointer.pointee.typeDescriptor.pointee
.offsetToTheFieldOffsetVector
.vector(metadata: pointer.raw.assumingMemoryBound(to: Int.self), n: numberOfFields())
.map { $0.getInt() }
}

mutating func properties() -> [PropertyInfo] {
let offsets = fieldOffsets()
let fieldDescriptor = pointer.pointee.typeDescriptor.pointee
.fieldDescriptor
.advanced()

let genericVector = genericArgumentVector()

return (0..<numberOfFields()).map { i in
let record = fieldDescriptor
.pointee
.fields
.element(at: i)

return PropertyInfo(
name: record.pointee.fieldName(),
type: record.pointee.type(
genericContext: pointer.pointee.typeDescriptor,
genericArguments: genericVector.pointee.element(at: 0)
),
isVar: record.pointee.isVar,
offset: offsets[i],
ownerType: type
)
}
}

func genericArguments() -> [Any.Type] {
let n = pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams
guard n > 0 else { return [] }

let vector = genericArgumentVector()
return (0..<Int(pointer.pointee.typeDescriptor.pointee.genericContextHeader.base.numberOfParams)).map { i in
return vector.pointee.element(at: i).pointee
}
}

func genericArgumentVector() -> UnsafeMutablePointer<Vector<Any.Type>> {
return pointer
.advanced(by: genericArgumentOffset, wordSize: MemoryLayout<UnsafeRawPointer>.size)
.assumingMemoryBound(to: Vector<Any.Type>.self)
}
}
2 changes: 1 addition & 1 deletion Sources/Runtime/Metadata/StructMetadata.swift
Expand Up @@ -22,7 +22,7 @@

import Foundation

struct StructMetadata: MetadataType {
struct StructMetadata: NominalMetadataType {

var pointer: UnsafeMutablePointer<StructMetadataLayout>

Expand Down

0 comments on commit 464e60a

Please sign in to comment.