@@ -874,6 +874,7 @@ internal enum KeyPathComputedIDKind {
874874
875875internal enum KeyPathComputedIDResolution {
876876 case resolved
877+ case resolvedAbsolute
877878 case indirectPointer
878879 case functionCall
879880}
@@ -1108,6 +1109,9 @@ internal struct RawKeyPathComponent {
11081109 internal static var computedIDResolved : UInt32 {
11091110 return _SwiftKeyPathComponentHeader_ComputedIDResolved
11101111 }
1112+ internal static var computedIDResolvedAbsolute : UInt32 {
1113+ return _SwiftKeyPathComponentHeader_ComputedIDResolvedAbsolute
1114+ }
11111115 internal static var computedIDUnresolvedIndirectPointer : UInt32 {
11121116 return _SwiftKeyPathComponentHeader_ComputedIDUnresolvedIndirectPointer
11131117 }
@@ -1118,6 +1122,8 @@ internal struct RawKeyPathComponent {
11181122 switch payload & Header . computedIDResolutionMask {
11191123 case Header . computedIDResolved:
11201124 return . resolved
1125+ case Header . computedIDResolvedAbsolute:
1126+ return . resolvedAbsolute
11211127 case Header . computedIDUnresolvedIndirectPointer:
11221128 return . indirectPointer
11231129 case Header . computedIDUnresolvedFunctionCall:
@@ -3381,35 +3387,39 @@ internal struct InstantiateKeyPathBuffer: KeyPathPatternVisitor {
33813387 resolvedID = UnsafeRawPointer ( bitPattern: value)
33823388
33833389 case . pointer:
3384- // Resolve the sign-extended relative reference.
3385- var absoluteID : UnsafeRawPointer ? = _resolveRelativeAddress ( idValueBase, idValue)
3386-
33873390 // If the pointer ID is unresolved, then it needs work to get to
33883391 // the final value.
33893392 switch idResolution {
33903393 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)
33913400 break
33923401
33933402 case . indirectPointer:
33943403 // The pointer in the pattern is an indirect pointer to the real
33953404 // identifier pointer.
3396- absoluteID = absoluteID. unsafelyUnwrapped
3405+ let absoluteID = _resolveRelativeAddress ( idValueBase, idValue)
3406+ resolvedID = absoluteID
33973407 . load ( as: UnsafeRawPointer ? . self)
33983408
33993409 case . functionCall:
34003410 // The pointer in the pattern is to a function that generates the
34013411 // identifier pointer.
34023412 typealias Resolver = @convention ( c) ( UnsafeRawPointer ? ) -> UnsafeRawPointer ?
3413+ let absoluteID = _resolveCompactFunctionPointer ( idValueBase, idValue)
34033414 let resolverSigned = _PtrAuth. sign (
3404- pointer: absoluteID. unsafelyUnwrapped ,
3415+ pointer: absoluteID,
34053416 key: . processIndependentCode,
34063417 discriminator: _PtrAuth. discriminator ( for: Resolver . self) )
34073418 let resolverFn = unsafeBitCast ( resolverSigned,
34083419 to: Resolver . self)
34093420
3410- absoluteID = resolverFn ( patternArgs)
3421+ resolvedID = resolverFn ( patternArgs)
34113422 }
3412- resolvedID = absoluteID
34133423 }
34143424
34153425 // Bring over the header, getter, and setter.
0 commit comments