File tree Expand file tree Collapse file tree 2 files changed +30
-2
lines changed Expand file tree Collapse file tree 2 files changed +30
-2
lines changed Original file line number Diff line number Diff line change @@ -3912,7 +3912,7 @@ public func _createOffsetBasedKeyPath(
3912
3912
// The buffer header is 32 bits, but components must start on a word
3913
3913
// boundary.
3914
3914
let kpBufferSize = MemoryLayout < Int > . size + MemoryLayout < Int32 > . size
3915
- return kpTy. _create ( capacityInBytes: kpBufferSize) {
3915
+ let kp = kpTy. _create ( capacityInBytes: kpBufferSize) {
3916
3916
var builder = KeyPathBuffer . Builder ( $0)
3917
3917
let header = KeyPathBuffer . Header (
3918
3918
size: kpBufferSize - MemoryLayout< Int> . size,
@@ -3923,7 +3923,7 @@ public func _createOffsetBasedKeyPath(
3923
3923
builder. pushHeader ( header)
3924
3924
3925
3925
let componentHeader = RawKeyPathComponent . Header (
3926
- stored: . struct,
3926
+ stored: _MetadataKind ( root ) == . struct ? . struct : . class ,
3927
3927
mutable: false ,
3928
3928
inlineOffset: UInt32 ( offset)
3929
3929
)
@@ -3935,6 +3935,12 @@ public func _createOffsetBasedKeyPath(
3935
3935
3936
3936
component. clone ( into: & builder. buffer, endOfReferencePrefix: false )
3937
3937
}
3938
+
3939
+ if _MetadataKind ( root) == . struct {
3940
+ kp. assignOffsetToStorage ( offset: offset)
3941
+ }
3942
+
3943
+ return kp
3938
3944
}
3939
3945
3940
3946
#if SWIFT_ENABLE_REFLECTION
Original file line number Diff line number Diff line change @@ -1070,6 +1070,16 @@ struct Dog {
1070
1070
var age : Int
1071
1071
}
1072
1072
1073
+ class Cat {
1074
+ var name : String
1075
+ var age : Int
1076
+
1077
+ init ( name: String , age: Int ) {
1078
+ self . name = name
1079
+ self . age = age
1080
+ }
1081
+ }
1082
+
1073
1083
if #available( SwiftStdlib 5 . 9 , * ) {
1074
1084
keyPath. test ( " _createOffsetBasedKeyPath " ) {
1075
1085
let dogAgeKp = _createOffsetBasedKeyPath (
@@ -1083,6 +1093,18 @@ if #available(SwiftStdlib 5.9, *) {
1083
1093
let sparky = Dog ( name: " Sparky " , age: 7 )
1084
1094
1085
1095
expectEqual ( sparky [ keyPath: dogAgeKp!] , 7 )
1096
+
1097
+ let catNameKp = _createOffsetBasedKeyPath (
1098
+ root: Cat . self,
1099
+ value: String . self,
1100
+ offset: 16
1101
+ ) as? KeyPath < Cat , String >
1102
+
1103
+ expectNotNil ( catNameKp)
1104
+
1105
+ let chloe = Cat ( name: " Chloe " , age: 4 )
1106
+
1107
+ expectEqual ( chloe [ keyPath: catNameKp!] , " Chloe " )
1086
1108
}
1087
1109
}
1088
1110
You can’t perform that action at this time.
0 commit comments