@@ -416,6 +416,17 @@ public class WritableKeyPath<Root, Value>: KeyPath<Root, Value> {
416
416
@usableFromInline
417
417
internal func _projectMutableAddress( from base: UnsafePointer < Root > )
418
418
-> ( 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
+ }
419
430
var p = UnsafeRawPointer ( base)
420
431
var type : Any . Type = Root . self
421
432
var keepAlive : AnyObject ?
@@ -3544,7 +3555,6 @@ internal struct InstantiateKeyPathBuffer: KeyPathPatternVisitor {
3544
3555
pushDest ( header)
3545
3556
pushDest ( offset)
3546
3557
case . unresolvedFieldOffset( let offsetOfOffset) :
3547
- isPureStruct. append ( false )
3548
3558
// Look up offset in the type metadata. The value in the pattern is
3549
3559
// the offset within the metadata object.
3550
3560
let metadataPtr = unsafeBitCast ( base, to: UnsafeRawPointer . self)
@@ -3556,6 +3566,7 @@ internal struct InstantiateKeyPathBuffer: KeyPathPatternVisitor {
3556
3566
case . struct:
3557
3567
offset = UInt32 ( metadataPtr. load ( fromByteOffset: Int ( offsetOfOffset) ,
3558
3568
as: UInt32 . self) )
3569
+ structOffset += offset
3559
3570
}
3560
3571
3561
3572
let header = RawKeyPathComponent . Header ( storedWithOutOfLineOffset: kind,
0 commit comments