Skip to content

Commit d2912dc

Browse files
Fixed .unresolvedFieldOffset should count as an optimized offset. Restored optimization for KeyPath writes.
1 parent 2d5086c commit d2912dc

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

stdlib/public/core/KeyPath.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,17 @@ public class WritableKeyPath<Root, Value>: KeyPath<Root, Value> {
416416
@usableFromInline
417417
internal func _projectMutableAddress(from base: UnsafePointer<Root>)
418418
-> (pointer: UnsafeMutablePointer<Value>, owner: AnyObject?) {
419+
420+
// One performance improvement is to skip right to Value
421+
// if this keypath traverses through structs only.
422+
423+
// Don't declare "p" above this if-statement; it may slow things down.
424+
if let offset = getOffsetFromStorage()
425+
{
426+
let p = UnsafeRawPointer(base).advanced(by: offset)
427+
return (pointer: UnsafeMutablePointer(
428+
mutating: p.assumingMemoryBound(to: Value.self)), owner: nil)
429+
}
419430
var p = UnsafeRawPointer(base)
420431
var type: Any.Type = Root.self
421432
var keepAlive: AnyObject?
@@ -3544,7 +3555,6 @@ internal struct InstantiateKeyPathBuffer: KeyPathPatternVisitor {
35443555
pushDest(header)
35453556
pushDest(offset)
35463557
case .unresolvedFieldOffset(let offsetOfOffset):
3547-
isPureStruct.append(false)
35483558
// Look up offset in the type metadata. The value in the pattern is
35493559
// the offset within the metadata object.
35503560
let metadataPtr = unsafeBitCast(base, to: UnsafeRawPointer.self)
@@ -3556,6 +3566,7 @@ internal struct InstantiateKeyPathBuffer: KeyPathPatternVisitor {
35563566
case .struct:
35573567
offset = UInt32(metadataPtr.load(fromByteOffset: Int(offsetOfOffset),
35583568
as: UInt32.self))
3569+
structOffset += offset
35593570
}
35603571

35613572
let header = RawKeyPathComponent.Header(storedWithOutOfLineOffset: kind,

0 commit comments

Comments
 (0)