@@ -758,6 +758,9 @@ internal struct RawKeyPathComponent {
758
758
internal static var endOfReferencePrefixFlag : UInt32 {
759
759
return _SwiftKeyPathComponentHeader_EndOfReferencePrefixFlag
760
760
}
761
+ internal static var storedOffsetPayloadMask : UInt32 {
762
+ return _SwiftKeyPathComponentHeader_StoredOffsetPayloadMask
763
+ }
761
764
internal static var outOfLineOffsetPayload : UInt32 {
762
765
return _SwiftKeyPathComponentHeader_OutOfLineOffsetPayload
763
766
}
@@ -852,6 +855,20 @@ internal struct RawKeyPathComponent {
852
855
_value = _value & ~ Header. payloadMask | newValue
853
856
}
854
857
}
858
+ internal var storedOffsetPayload : UInt32 {
859
+ get {
860
+ _sanityCheck ( kind == . struct || kind == . class,
861
+ " not a stored component " )
862
+ return _value & Header . storedOffsetPayloadMask
863
+ }
864
+ set {
865
+ _sanityCheck ( kind == . struct || kind == . class,
866
+ " not a stored component " )
867
+ _sanityCheck ( newValue & Header . storedOffsetPayloadMask == newValue,
868
+ " payload too big " )
869
+ _value = _value & ~ Header. storedOffsetPayloadMask | newValue
870
+ }
871
+ }
855
872
internal var endOfReferencePrefix : Bool {
856
873
get {
857
874
return _value & Header . endOfReferencePrefixFlag != 0
@@ -913,12 +930,12 @@ internal struct RawKeyPathComponent {
913
930
internal func _componentBodySize( forPropertyDescriptor: Bool ) -> Int {
914
931
switch kind {
915
932
case . struct, . class:
916
- if payload == Header . unresolvedFieldOffsetPayload
917
- || payload == Header . outOfLineOffsetPayload {
933
+ if storedOffsetPayload == Header . unresolvedFieldOffsetPayload
934
+ || storedOffsetPayload == Header . outOfLineOffsetPayload {
918
935
// A 32-bit offset is stored in the body.
919
936
return MemoryLayout< UInt32> . size
920
937
}
921
- if payload == Header . unresolvedIndirectOffsetPayload {
938
+ if storedOffsetPayload == Header . unresolvedIndirectOffsetPayload {
922
939
// A pointer-aligned, pointer-sized pointer is stored in the body.
923
940
return Header . pointerAlignmentSkew + MemoryLayout< Int> . size
924
941
}
@@ -959,7 +976,9 @@ internal struct RawKeyPathComponent {
959
976
let ptrSize = MemoryLayout< Int> . size
960
977
switch header. kind {
961
978
case . struct, . class:
962
- if header. payload == Header . payloadMask { return 4 } // overflowed
979
+ if header. storedOffsetPayload == Header . outOfLineOffsetPayload {
980
+ return 4 // overflowed
981
+ }
963
982
return 0
964
983
case . external:
965
984
// align to pointer + pointer to external descriptor
@@ -993,13 +1012,13 @@ internal struct RawKeyPathComponent {
993
1012
" no offset for this kind " )
994
1013
// An offset too large to fit inline is represented by a signal and stored
995
1014
// in the body.
996
- if header. payload == Header . outOfLineOffsetPayload {
1015
+ if header. storedOffsetPayload == Header . outOfLineOffsetPayload {
997
1016
// Offset overflowed into body
998
1017
_sanityCheck ( body. count >= MemoryLayout< UInt32> . size,
999
1018
" component not big enough " )
1000
1019
return Int ( body. load ( as: UInt32 . self) )
1001
1020
}
1002
- return Int ( header. payload )
1021
+ return Int ( header. storedOffsetPayload )
1003
1022
}
1004
1023
1005
1024
internal var _computedIDValue : Int {
@@ -1165,7 +1184,7 @@ internal struct RawKeyPathComponent {
1165
1184
switch header. kind {
1166
1185
case . struct,
1167
1186
. class:
1168
- if header. payload == Header . outOfLineOffsetPayload {
1187
+ if header. storedOffsetPayload == Header . outOfLineOffsetPayload {
1169
1188
let overflowOffset = body. load ( as: UInt32 . self)
1170
1189
buffer. storeBytes ( of: overflowOffset, toByteOffset: 4 ,
1171
1190
as: UInt32 . self)
@@ -2292,11 +2311,11 @@ internal func _getKeyPathClassAndInstanceSizeFromPattern(
2292
2311
// reassigned.
2293
2312
2294
2313
// Check the final instantiated size of the offset.
2295
- if header. payload == RawKeyPathComponent . Header. unresolvedFieldOffsetPayload
2296
- || header. payload == RawKeyPathComponent . Header. outOfLineOffsetPayload {
2314
+ if header. storedOffsetPayload == RawKeyPathComponent . Header. unresolvedFieldOffsetPayload
2315
+ || header. storedOffsetPayload == RawKeyPathComponent . Header. outOfLineOffsetPayload {
2297
2316
_ = buffer. pop ( UInt32 . self)
2298
2317
}
2299
- if header. payload == RawKeyPathComponent . Header. unresolvedIndirectOffsetPayload {
2318
+ if header. storedOffsetPayload == RawKeyPathComponent . Header. unresolvedIndirectOffsetPayload {
2300
2319
_ = buffer. pop ( Int . self)
2301
2320
// On 64-bit systems the pointer to the ivar offset variable is
2302
2321
// pointer-sized and -aligned, but the resulting offset ought to be
@@ -2363,7 +2382,7 @@ internal func _getKeyPathClassAndInstanceSizeFromPattern(
2363
2382
// The final component will be a stored component with just an offset.
2364
2383
// If the offset requires resolution, then it'll be stored out of
2365
2384
// line after the header.
2366
- if descriptorHeader. payload
2385
+ if descriptorHeader. storedOffsetPayload
2367
2386
> RawKeyPathComponent . Header. maximumOffsetPayload {
2368
2387
newComponentSize = MemoryLayout < RawKeyPathComponent . Header > . size
2369
2388
+ MemoryLayout < UInt32 > . size
@@ -2617,7 +2636,7 @@ internal func _instantiateKeyPathBuffer(
2617
2636
2618
2637
func tryToResolveOffset( header: RawKeyPathComponent . Header ,
2619
2638
getOutOfLineOffset: ( ) -> UInt32 ) {
2620
- if header. payload == RawKeyPathComponent . Header. unresolvedFieldOffsetPayload {
2639
+ if header. storedOffsetPayload == RawKeyPathComponent . Header. unresolvedFieldOffsetPayload {
2621
2640
// Look up offset in type metadata. The value in the pattern is the
2622
2641
// offset within the metadata object.
2623
2642
let metadataPtr = unsafeBitCast ( base, to: UnsafeRawPointer . self)
@@ -2634,28 +2653,28 @@ internal func _instantiateKeyPathBuffer(
2634
2653
2635
2654
// Rewrite the header for a resolved offset.
2636
2655
var newHeader = header
2637
- newHeader. payload = RawKeyPathComponent . Header. outOfLineOffsetPayload
2656
+ newHeader. storedOffsetPayload = RawKeyPathComponent . Header. outOfLineOffsetPayload
2638
2657
pushDest ( newHeader)
2639
2658
pushDest ( offset)
2640
2659
return
2641
2660
}
2642
2661
2643
- if header. payload == RawKeyPathComponent . Header. unresolvedIndirectOffsetPayload {
2662
+ if header. storedOffsetPayload == RawKeyPathComponent . Header. unresolvedIndirectOffsetPayload {
2644
2663
// Look up offset in the indirectly-referenced variable we have a
2645
2664
// pointer.
2646
2665
let offsetVar = patternBuffer. pop ( UnsafeRawPointer . self)
2647
2666
let offsetValue = UInt32 ( offsetVar. load ( as: UInt . self) )
2648
2667
// Rewrite the header for a resolved offset.
2649
2668
var newHeader = header
2650
- newHeader. payload = RawKeyPathComponent . Header. outOfLineOffsetPayload
2669
+ newHeader. storedOffsetPayload = RawKeyPathComponent . Header. outOfLineOffsetPayload
2651
2670
pushDest ( newHeader)
2652
2671
pushDest ( offsetValue)
2653
2672
return
2654
2673
}
2655
2674
2656
2675
// Otherwise, just transfer the pre-resolved component.
2657
2676
pushDest ( header)
2658
- if header. payload == RawKeyPathComponent . Header. outOfLineOffsetPayload {
2677
+ if header. storedOffsetPayload == RawKeyPathComponent . Header. outOfLineOffsetPayload {
2659
2678
let offset = getOutOfLineOffset ( ) //patternBuffer.pop(UInt32.self)
2660
2679
pushDest ( offset)
2661
2680
}
0 commit comments