Skip to content

Commit 72f9c3f

Browse files
authored
Merge pull request #63535 from Azoy/reflection-fixes
[Reflection] Some bug fixes and other improvements
2 parents dbeff97 + 4edc241 commit 72f9c3f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+528
-638
lines changed

stdlib/public/Reflection/Package.swift

Lines changed: 0 additions & 77 deletions
This file was deleted.

stdlib/public/Reflection/README.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

stdlib/public/Reflection/Sources/Reflection/Case.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,19 @@ public struct Case {
2929

3030
@inlinable
3131
public init?(from instance: Any) {
32-
guard Type(instance).isEnum else {
32+
let instanceTy = type(of: instance)
33+
34+
guard Type(instanceTy).isEnum else {
3335
return nil
3436
}
3537

3638
var container = unsafeBitCast(instance, to: AnyExistentialContainer.self)
3739

3840
let tag = container.projectValue {
39-
Metadata(type(of: instance)).enum.enumVWT.getEnumTag($0)
41+
Metadata(instanceTy).enum.enumVWT.getEnumTag($0)
4042
}
4143

42-
self.parent = Metadata(type(of: instance)).enum
44+
self.parent = Metadata(instanceTy).enum
4345
self.tag = Int(truncatingIfNeeded: tag)
4446
}
4547
}

stdlib/public/Reflection/Sources/Reflection/Field.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ extension Field {
4242
@inlinable
4343
public var name: String {
4444
guard parent.kind != .tuple else {
45-
//return TupleMetadata(parent.ptr).elements[index].
46-
return "hello"
45+
return parent.tuple.elements[index].label
4746
}
4847

4948
return parent.type.descriptor.fields[index].name

stdlib/public/Reflection/Sources/Reflection/GenericArguments.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ extension GenericArguments: RandomAccessCollection {
5151

5252
let start = argumentPointer.unsafelyUnwrapped
5353
let address = start + position * MemoryLayout<Type>.size
54-
return address.loadUnaligned(as: Type.self)
54+
return address.unprotectedLoad(as: Type.self)
5555
}
5656
}
5757

stdlib/public/Reflection/Sources/Reflection/KeyPath.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ extension Case {
9696
var value = pair.buffer
9797

9898
if isIndirect {
99-
let owner = value.loadUnaligned(as: HeapObject.self)
99+
let owner = value.unprotectedLoad(as: HeapObject.self)
100100
value = swift_projectBox(owner)
101101
}
102102

stdlib/public/Reflection/Sources/_Runtime/ContextDescriptor/ClassDescriptor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ extension ClassDescriptor {
8080
// 'TargetStoredClassMetadataBounds', by the time we access this it will
8181
// have already been initialized way before for us. Thus, it is safe to
8282
// access this value non-atomically.
83-
return storedBounds.load(as: Int.self)
83+
return storedBounds.unprotectedLoad(as: Int.self)
8484
}
8585

8686
@inlinable

stdlib/public/Reflection/Sources/_Runtime/ContextDescriptor/GenericSignature.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ extension GenericSignature.RequirementDescriptor {
119119
@available(SwiftStdlib 5.9, *)
120120
@inlinable
121121
public var layoutKind: GenericSignature.LayoutKind {
122-
address(for: \.requirement).loadUnaligned(
122+
address(for: \.requirement).unprotectedLoad(
123123
as: GenericSignature.LayoutKind.self
124124
)
125125
}
@@ -140,7 +140,7 @@ extension GenericSignature.RequirementDescriptor {
140140
) -> Any.Type? {
141141
_getTypeByMangledNameInContext(
142142
UnsafePointer(parameter.ptr._rawValue),
143-
UInt(parameter.length),
143+
UInt(truncatingIfNeeded: parameter.length),
144144
genericContext: context.ptr,
145145
genericArguments: argPtr
146146
)
@@ -269,7 +269,7 @@ extension GenericSignature.RequirementDescriptor {
269269
func getGenericSignature(at address: UnsafeRawPointer) -> GenericSignature {
270270
var address = address
271271

272-
let header = address.loadUnaligned(as: GenericSignature.Header.self)
272+
let header = address.unprotectedLoad(as: GenericSignature.Header.self)
273273
address += MemoryLayout<GenericSignature.Header>.size
274274

275275
let parameters = BufferView<GenericSignature.ParameterDescriptor>(

stdlib/public/Reflection/Sources/_Runtime/ExistentialContainer.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,14 @@ extension AnyExistentialContainer {
6767
}
6868
}
6969

70-
let alignMask = UInt(metadata.vwt.flags.alignmentMask)
70+
let alignMask = UInt(truncatingIfNeeded:metadata.vwt.flags.alignmentMask)
7171
let heapObjSize = UInt(MemoryLayout<Int>.size * 2)
7272
let byteOffset = (heapObjSize + alignMask) & ~alignMask
7373

7474
return try withUnsafeMutablePointer(to: &self) {
75-
let raw = UnsafeMutableRawPointer($0)
76-
let heap = raw.loadUnaligned(as: UnsafeMutableRawPointer.self)
75+
let heap = $0.raw.unprotectedLoad(as: UnsafeMutableRawPointer.self)
7776

78-
return try body(heap + Int(byteOffset))
77+
return try body(heap + Int(truncatingIfNeeded: byteOffset))
7978
}
8079
}
8180
}

stdlib/public/Reflection/Sources/_Runtime/Metadata/TupleMetadata.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ extension TupleMetadata.Elements.Element {
8585
// string
8686
address -= MemoryLayout<Int>.size
8787

88-
guard let cString = address.loadUnaligned(
88+
guard let cString = address.unprotectedLoad(
8989
as: UnsafePointer<CChar>?.self
9090
) else {
9191
return ""

stdlib/public/Reflection/Sources/_Runtime/Metadata/TypeMetadata.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extension TypeMetadata {
2929
@inlinable
3030
public var descriptor: TypeDescriptor {
3131
var address: UnsafeRawPointer
32-
32+
3333
switch metadata.kind {
3434
case .struct:
3535
address = ptr + MemoryLayout<StructMetadata.Layout>.offset(of: \.descriptor)!
@@ -39,12 +39,12 @@ extension TypeMetadata {
3939
default:
4040
address = ptr + MemoryLayout<ClassMetadata.Layout>.offset(of: \.descriptor)!
4141
}
42-
43-
address = address.loadUnaligned(as: UnsafeRawPointer.self)
44-
42+
43+
address = address.unprotectedLoad(as: UnsafeRawPointer.self)
44+
4545
return TypeDescriptor(address)
4646
}
47-
47+
4848
@inlinable
4949
public var genericArguments: UnsafeRawPointer {
5050
switch metadata.kind {
@@ -68,17 +68,17 @@ extension TypeMetadata {
6868
public var metadata: Metadata {
6969
Metadata(ptr)
7070
}
71-
71+
7272
@inlinable
7373
public var `class`: ClassMetadata {
7474
ClassMetadata(ptr)
7575
}
76-
76+
7777
@inlinable
7878
public var `enum`: EnumMetadata {
7979
EnumMetadata(ptr)
8080
}
81-
81+
8282
@inlinable
8383
public var `struct`: StructMetadata {
8484
StructMetadata(ptr)
@@ -93,10 +93,10 @@ extension TypeMetadata {
9393
if let ss = typeRef.standardSubstitution {
9494
return ss
9595
}
96-
96+
9797
return _resolve(typeRef)
9898
}
99-
99+
100100
@usableFromInline
101101
func _resolve(_ typeRef: MangledTypeReference) -> Any.Type? {
102102
typeCache.getOrInsert(typeRef, from: self)

stdlib/public/Reflection/Sources/_Runtime/Metadata/ValueWitnessTable.swift

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ extension ValueWitnessTable {
128128
_ dest: UnsafeMutableRawPointer,
129129
_ src: UnsafeRawPointer
130130
) -> UnsafeMutableRawPointer {
131-
let address = layout.raw
131+
let address = address(for: \.initializeBufferWithCopyOfBuffer)
132132

133133
return address.signedVWTInitializeBufferWithCopyOfBuffer(
134134
dest,
@@ -139,17 +139,7 @@ extension ValueWitnessTable {
139139

140140
@inlinable
141141
public func destroy(_ src: UnsafeMutableRawPointer) {
142-
// rdar://103834325
143-
// FIXME: There's currently a compiler bug preventing me from doing:
144-
// 'address(of: \.destroy)'
145-
// or even
146-
// 'MemoryLayout<ValueWitnessTable.Layout.Pointee>.offset(of: \.destroy)'
147-
//
148-
// The same goes for everything else in this file
149-
let address = layout.raw
150-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
151-
152-
address.signedVWTDestroy(src, trailing)
142+
address(for: \.destroy).signedVWTDestroy(src, trailing)
153143
}
154144

155145
@inlinable
@@ -158,9 +148,7 @@ extension ValueWitnessTable {
158148
_ dest: UnsafeMutableRawPointer,
159149
_ src: UnsafeRawPointer
160150
) -> UnsafeMutableRawPointer {
161-
let address = layout.raw
162-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
163-
+ MemoryLayout<Destroy>.size
151+
let address = address(for: \.initializeWithCopy)
164152

165153
return address.signedVWTInitializeWithCopy(dest, src, trailing)
166154
}
@@ -171,10 +159,7 @@ extension ValueWitnessTable {
171159
_ dest: UnsafeMutableRawPointer,
172160
_ src: UnsafeRawPointer
173161
) -> UnsafeMutableRawPointer {
174-
let address = layout.raw
175-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
176-
+ MemoryLayout<Destroy>.size
177-
+ MemoryLayout<InitializeWithCopy>.size
162+
let address = address(for: \.assignWithCopy)
178163

179164
return address.signedVWTAssignWithCopy(dest, src, trailing)
180165
}
@@ -185,11 +170,7 @@ extension ValueWitnessTable {
185170
_ dest: UnsafeMutableRawPointer,
186171
_ src: UnsafeMutableRawPointer
187172
) -> UnsafeMutableRawPointer {
188-
let address = layout.raw
189-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
190-
+ MemoryLayout<Destroy>.size
191-
+ MemoryLayout<InitializeWithCopy>.size
192-
+ MemoryLayout<AssignWithCopy>.size
173+
let address = address(for: \.initializeWithTake)
193174

194175
return address.signedVWTInitializeWithTake(dest, src, trailing)
195176
}
@@ -200,12 +181,7 @@ extension ValueWitnessTable {
200181
_ dest: UnsafeMutableRawPointer,
201182
_ src: UnsafeMutableRawPointer
202183
) -> UnsafeMutableRawPointer {
203-
let address = layout.raw
204-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
205-
+ MemoryLayout<Destroy>.size
206-
+ MemoryLayout<InitializeWithCopy>.size
207-
+ MemoryLayout<AssignWithCopy>.size
208-
+ MemoryLayout<InitializeWithTake>.size
184+
let address = address(for: \.assignWithTake)
209185

210186
return address.signedVWTAssignWithTake(dest, src, trailing)
211187
}
@@ -216,13 +192,7 @@ extension ValueWitnessTable {
216192
_ src: UnsafeRawPointer,
217193
_ numberOfEmptyCases: UInt32
218194
) -> UInt32 {
219-
let address = layout.raw
220-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
221-
+ MemoryLayout<Destroy>.size
222-
+ MemoryLayout<InitializeWithCopy>.size
223-
+ MemoryLayout<AssignWithCopy>.size
224-
+ MemoryLayout<InitializeWithTake>.size
225-
+ MemoryLayout<AssignWithTake>.size
195+
let address = address(for: \.getEnumTagSinglePayload)
226196

227197
return address.signedVWTGetEnumTagSinglePayload(
228198
src,
@@ -237,14 +207,7 @@ extension ValueWitnessTable {
237207
_ tag: UInt32,
238208
_ numberOfEmptyCases: UInt32
239209
) -> () {
240-
let address = layout.raw
241-
+ MemoryLayout<InitializeBufferWithCopyOfBuffer>.size
242-
+ MemoryLayout<Destroy>.size
243-
+ MemoryLayout<InitializeWithCopy>.size
244-
+ MemoryLayout<AssignWithCopy>.size
245-
+ MemoryLayout<InitializeWithTake>.size
246-
+ MemoryLayout<AssignWithTake>.size
247-
+ MemoryLayout<GetEnumTagSinglePayload>.size
210+
let address = address(for: \.storeEnumTagSinglePayload)
248211

249212
return address.signedVWTStoreEnumTagSinglePayload(
250213
src,

stdlib/public/Reflection/Sources/_Runtime/Utils/BufferView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ extension BufferView: RandomAccessCollection {
5454

5555
@inlinable
5656
public subscript(position: Int) -> Element {
57-
start.loadUnaligned(
57+
start.unprotectedLoad(
5858
fromByteOffset: position * MemoryLayout<Element>.size,
5959
as: Element.self
6060
)

stdlib/public/Reflection/Sources/_Runtime/Utils/Layouts.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ extension PublicLayout {
2525
@inline(__always)
2626
@inlinable
2727
public var layout: Layout {
28-
ptr.loadUnaligned(as: Layout.self)
28+
ptr.unprotectedLoad(as: Layout.self)
2929
}
3030

3131
@inline(__always)
@@ -74,7 +74,7 @@ protocol PrivateLayout {
7474
@available(SwiftStdlib 5.9, *)
7575
extension PrivateLayout {
7676
var layout: Layout {
77-
ptr.loadUnaligned(as: Layout.self)
77+
ptr.unprotectedLoad(as: Layout.self)
7878
}
7979

8080
var trailing: UnsafeRawPointer {

0 commit comments

Comments
 (0)