@@ -874,6 +874,7 @@ internal enum KeyPathComputedIDKind {
874
874
875
875
internal enum KeyPathComputedIDResolution {
876
876
case resolved
877
+ case resolvedAbsolute
877
878
case indirectPointer
878
879
case functionCall
879
880
}
@@ -1108,6 +1109,9 @@ internal struct RawKeyPathComponent {
1108
1109
internal static var computedIDResolved : UInt32 {
1109
1110
return _SwiftKeyPathComponentHeader_ComputedIDResolved
1110
1111
}
1112
+ internal static var computedIDResolvedAbsolute : UInt32 {
1113
+ return _SwiftKeyPathComponentHeader_ComputedIDResolvedAbsolute
1114
+ }
1111
1115
internal static var computedIDUnresolvedIndirectPointer : UInt32 {
1112
1116
return _SwiftKeyPathComponentHeader_ComputedIDUnresolvedIndirectPointer
1113
1117
}
@@ -1118,6 +1122,8 @@ internal struct RawKeyPathComponent {
1118
1122
switch payload & Header . computedIDResolutionMask {
1119
1123
case Header . computedIDResolved:
1120
1124
return . resolved
1125
+ case Header . computedIDResolvedAbsolute:
1126
+ return . resolvedAbsolute
1121
1127
case Header . computedIDUnresolvedIndirectPointer:
1122
1128
return . indirectPointer
1123
1129
case Header . computedIDUnresolvedFunctionCall:
@@ -3381,35 +3387,39 @@ internal struct InstantiateKeyPathBuffer: KeyPathPatternVisitor {
3381
3387
resolvedID = UnsafeRawPointer ( bitPattern: value)
3382
3388
3383
3389
case . pointer:
3384
- // Resolve the sign-extended relative reference.
3385
- var absoluteID : UnsafeRawPointer ? = _resolveRelativeAddress ( idValueBase, idValue)
3386
-
3387
3390
// If the pointer ID is unresolved, then it needs work to get to
3388
3391
// the final value.
3389
3392
switch idResolution {
3390
3393
case . resolved:
3394
+ resolvedID = _resolveRelativeAddress ( idValueBase, idValue)
3395
+ break
3396
+
3397
+ case . resolvedAbsolute:
3398
+ let value = UInt ( UInt32 ( bitPattern: idValue) )
3399
+ resolvedID = UnsafeRawPointer ( bitPattern: value)
3391
3400
break
3392
3401
3393
3402
case . indirectPointer:
3394
3403
// The pointer in the pattern is an indirect pointer to the real
3395
3404
// identifier pointer.
3396
- absoluteID = absoluteID. unsafelyUnwrapped
3405
+ let absoluteID = _resolveRelativeAddress ( idValueBase, idValue)
3406
+ resolvedID = absoluteID
3397
3407
. load ( as: UnsafeRawPointer ? . self)
3398
3408
3399
3409
case . functionCall:
3400
3410
// The pointer in the pattern is to a function that generates the
3401
3411
// identifier pointer.
3402
3412
typealias Resolver = @convention ( c) ( UnsafeRawPointer ? ) -> UnsafeRawPointer ?
3413
+ let absoluteID = _resolveCompactFunctionPointer ( idValueBase, idValue)
3403
3414
let resolverSigned = _PtrAuth. sign (
3404
- pointer: absoluteID. unsafelyUnwrapped ,
3415
+ pointer: absoluteID,
3405
3416
key: . processIndependentCode,
3406
3417
discriminator: _PtrAuth. discriminator ( for: Resolver . self) )
3407
3418
let resolverFn = unsafeBitCast ( resolverSigned,
3408
3419
to: Resolver . self)
3409
3420
3410
- absoluteID = resolverFn ( patternArgs)
3421
+ resolvedID = resolverFn ( patternArgs)
3411
3422
}
3412
- resolvedID = absoluteID
3413
3423
}
3414
3424
3415
3425
// Bring over the header, getter, and setter.
0 commit comments