@@ -3893,6 +3893,50 @@ internal func _instantiateKeyPathBuffer(
38933893 return offset
38943894}
38953895
3896+ @available ( SwiftStdlib 5 . 9 , * )
3897+ public func _createOffsetBasedKeyPath(
3898+ root: Any . Type ,
3899+ value: Any . Type ,
3900+ offset: Int
3901+ ) -> AnyKeyPath {
3902+ func openRoot< Root> ( _: Root . Type ) -> AnyKeyPath . Type {
3903+ func openValue< Value> ( _: Value . Type ) -> AnyKeyPath . Type {
3904+ KeyPath < Root , Value > . self
3905+ }
3906+
3907+ return _openExistential ( value, do: openValue ( _: ) )
3908+ }
3909+
3910+ let kpTy = _openExistential ( root, do: openRoot ( _: ) )
3911+
3912+ // The buffer header is 32 bits, but components must start on a word
3913+ // boundary.
3914+ let kpBufferSize = MemoryLayout < Int > . size + MemoryLayout < Int32 > . size
3915+ return kpTy. _create ( capacityInBytes: kpBufferSize) {
3916+ var builder = KeyPathBuffer . Builder ( $0)
3917+ let header = KeyPathBuffer . Header (
3918+ size: kpBufferSize - MemoryLayout< Int> . size,
3919+ trivial: true ,
3920+ hasReferencePrefix: false
3921+ )
3922+
3923+ builder. pushHeader ( header)
3924+
3925+ let componentHeader = RawKeyPathComponent . Header (
3926+ stored: . struct,
3927+ mutable: false ,
3928+ inlineOffset: UInt32 ( offset)
3929+ )
3930+
3931+ let component = RawKeyPathComponent (
3932+ header: componentHeader,
3933+ body: UnsafeRawBufferPointer ( start: nil , count: 0 )
3934+ )
3935+
3936+ component. clone ( into: & builder. buffer, endOfReferencePrefix: false )
3937+ }
3938+ }
3939+
38963940#if SWIFT_ENABLE_REFLECTION
38973941
38983942@_silgen_name ( " swift_keyPath_copySymbolName " )
0 commit comments