@@ -3893,6 +3893,51 @@ 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+ isClass: Bool = false
3902+ ) -> AnyKeyPath {
3903+ func openRoot< Root> ( _: Root . Type ) -> AnyKeyPath . Type {
3904+ func openValue< Value> ( _: Value . Type ) -> AnyKeyPath . Type {
3905+ KeyPath < Root , Value > . self
3906+ }
3907+
3908+ return _openExistential ( value, do: openValue ( _: ) )
3909+ }
3910+
3911+ let kpTy = _openExistential ( root, do: openRoot ( _: ) )
3912+
3913+ // The buffer header is 32 bits, but components must start on a word
3914+ // boundary.
3915+ let kpBufferSize = MemoryLayout < Int > . size + MemoryLayout < Int32 > . size
3916+ return kpTy. _create ( capacityInBytes: kpBufferSize) {
3917+ var builder = KeyPathBuffer . Builder ( $0)
3918+ let header = KeyPathBuffer . Header (
3919+ size: kpBufferSize - MemoryLayout< Int> . size,
3920+ trivial: true ,
3921+ hasReferencePrefix: false
3922+ )
3923+
3924+ builder. pushHeader ( header)
3925+
3926+ let componentHeader = RawKeyPathComponent . Header (
3927+ stored: isClass ? . class : . struct,
3928+ mutable: false ,
3929+ inlineOffset: UInt32 ( offset)
3930+ )
3931+
3932+ let component = RawKeyPathComponent (
3933+ header: componentHeader,
3934+ body: UnsafeRawBufferPointer ( start: nil , count: 0 )
3935+ )
3936+
3937+ component. clone ( into: & builder. buffer, endOfReferencePrefix: false )
3938+ }
3939+ }
3940+
38963941#if SWIFT_ENABLE_REFLECTION
38973942
38983943@_silgen_name ( " swift_keyPath_copySymbolName " )
0 commit comments