Skip to content

Commit c565c7c

Browse files
authored
Merge pull request swiftlang#5291 from Gankro/dsindex
[stdlib] Rewriting native hashed collection indices
2 parents e11ad5d + e4c5e15 commit c565c7c

File tree

8 files changed

+1282
-1214
lines changed

8 files changed

+1282
-1214
lines changed

stdlib/public/core/HashedCollections.swift.gyb

Lines changed: 1208 additions & 1137 deletions
Large diffs are not rendered by default.

test/stdlib/Inputs/DictionaryKeyValueTypesObjC.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public func convertNSDictionaryToDictionary<
2020

2121
func isNativeDictionary<KeyTy : Hashable, ValueTy>(
2222
_ d: Dictionary<KeyTy, ValueTy>) -> Bool {
23-
switch d._variantStorage {
23+
switch d._variantBuffer {
2424
case .native:
2525
return true
2626
case .cocoa:
@@ -35,7 +35,9 @@ func isCocoaDictionary<KeyTy : Hashable, ValueTy>(
3535

3636
func isNativeNSDictionary(_ d: NSDictionary) -> Bool {
3737
let className: NSString = NSStringFromClass(type(of: d)) as NSString
38-
return className.range(of: "_NativeDictionaryStorageOwner").length > 0
38+
return ["_SwiftDeferredNSDictionary", "NativeDictionaryStorage"].contains {
39+
className.range(of: $0).length > 0
40+
}
3941
}
4042

4143
func isCocoaNSDictionary(_ d: NSDictionary) -> Bool {

test/stdlib/TestUserInfo.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,29 @@ import StdlibUnittest
2020
class TestUserInfoSuper : NSObject { }
2121
#endif
2222

23-
struct SubStruct {
23+
struct SubStruct: Equatable {
2424
var i: Int
2525
var str: String
26+
27+
static func ==(lhs: SubStruct, rhs: SubStruct) -> Bool {
28+
return lhs.i == rhs.i &&
29+
lhs.str == rhs.str
30+
}
2631
}
2732

28-
struct SomeStructure {
33+
struct SomeStructure: Hashable {
2934
var i: Int
3035
var str: String
3136
var sub: SubStruct
37+
38+
static func ==(lhs: SomeStructure, rhs: SomeStructure) -> Bool {
39+
return lhs.i == rhs.i &&
40+
lhs.str == rhs.str &&
41+
lhs.sub == rhs.sub
42+
}
43+
44+
// FIXME: we don't care about this, but Any only finds == on Hashables
45+
var hashValue: Int { return i }
3246
}
3347

3448
/*

validation-test/Reflection/reflect_Dictionary.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@ reflect(object: obj)
2626
// CHECK-64: (class_instance size=25 alignment=16 stride=32 num_extra_inhabitants=0
2727
// CHECK-64: (field name=t offset=16
2828
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
29-
// CHECK-64: (field name=_variantStorage offset=0
29+
// CHECK-64: (field name=_variantBuffer offset=0
3030
// CHECK-64: (multi_payload_enum size=9 alignment=8 stride=16 num_extra_inhabitants=0
3131
// CHECK-64: (field name=native offset=0
3232
// CHECK-64: (reference kind=strong refcounting=native))
3333
// CHECK-64: (field name=cocoa offset=0
34-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647
35-
// CHECK-64: (field name=cocoaDictionary offset=0
36-
// CHECK-64: (reference kind=strong refcounting=unknown)))))))))
34+
// CHECK-64: (reference kind=strong refcounting=native)))))))
3735

3836
// CHECK-32: Reflecting an object.
3937
// CHECK-32: Instance pointer in child address space: 0x{{[0-9a-fA-F]+}}
@@ -44,14 +42,12 @@ reflect(object: obj)
4442
// CHECK-32: (class_instance size=17 alignment=16 stride=32 num_extra_inhabitants=0
4543
// CHECK-32: (field name=t offset=12
4644
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
47-
// CHECK-32: (field name=_variantStorage offset=0
45+
// CHECK-32: (field name=_variantBuffer offset=0
4846
// CHECK-32: (multi_payload_enum size=5 alignment=4 stride=8 num_extra_inhabitants=0
4947
// CHECK-32: (field name=native offset=0
5048
// CHECK-32: (reference kind=strong refcounting=native))
5149
// CHECK-32: (field name=cocoa offset=0
52-
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096
53-
// CHECK-32: (field name=cocoaDictionary offset=0
54-
// CHECK-32: (reference kind=strong refcounting=unknown)))))))))
50+
// CHECK-32: (reference kind=strong refcounting=native)))))))
5551

5652
doneReflecting()
5753

validation-test/Reflection/reflect_Set.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@ reflect(object: obj)
2626
// CHECK-64: (class_instance size=25 alignment=16 stride=32 num_extra_inhabitants=0
2727
// CHECK-64: (field name=t offset=16
2828
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
29-
// CHECK-64: (field name=_variantStorage offset=0
29+
// CHECK-64: (field name=_variantBuffer offset=0
3030
// CHECK-64: (multi_payload_enum size=9 alignment=8 stride=16 num_extra_inhabitants=0
3131
// CHECK-64: (field name=native offset=0
3232
// CHECK-64: (reference kind=strong refcounting=native))
3333
// CHECK-64: (field name=cocoa offset=0
34-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647
35-
// CHECK-64: (field name=cocoaSet offset=0
36-
// CHECK-64: (reference kind=strong refcounting=unknown)))))))))
34+
// CHECK-64: (reference kind=strong refcounting=native)))))))
3735

3836
// CHECK-32: Reflecting an object.
3937
// CHECK-32: Instance pointer in child address space: 0x{{[0-9a-fA-F]+}}
@@ -44,14 +42,12 @@ reflect(object: obj)
4442
// CHECK-32: (class_instance size=17 alignment=16 stride=32 num_extra_inhabitants=0
4543
// CHECK-32: (field name=t offset=12
4644
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
47-
// CHECK-32: (field name=_variantStorage offset=0
45+
// CHECK-32: (field name=_variantBuffer offset=0
4846
// CHECK-32: (multi_payload_enum size=5 alignment=4 stride=8 num_extra_inhabitants=0
4947
// CHECK-32: (field name=native offset=0
5048
// CHECK-32: (reference kind=strong refcounting=native))
5149
// CHECK-32: (field name=cocoa offset=0
52-
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=4096
53-
// CHECK-32: (field name=cocoaSet offset=0
54-
// CHECK-32: (reference kind=strong refcounting=unknown)))))))))
50+
// CHECK-32: (reference kind=strong refcounting=native)))))))
5551

5652
doneReflecting()
5753

validation-test/Reflection/reflect_multiple_types.swift

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,12 @@ reflect(object: obj)
142142
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647))))))
143143
// CHECK-64: (field name=t03 offset=48
144144
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
145-
// CHECK-64: (field name=_variantStorage offset=0
145+
// CHECK-64: (field name=_variantBuffer offset=0
146146
// CHECK-64: (multi_payload_enum size=9 alignment=8 stride=16 num_extra_inhabitants=0
147147
// CHECK-64: (field name=native offset=0
148148
// CHECK-64: (reference kind=strong refcounting=native))
149149
// CHECK-64: (field name=cocoa offset=0
150-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647
151-
// CHECK-64: (field name=cocoaDictionary offset=0
152-
// CHECK-64: (reference kind=strong refcounting=unknown))))))))
150+
// CHECK-64: (reference kind=strong refcounting=native))))))
153151
// CHECK-64: (field name=t04 offset=64
154152
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
155153
// CHECK-64: (field name=_value offset=0
@@ -188,14 +186,12 @@ reflect(object: obj)
188186
// CHECK-64: (reference kind=strong refcounting=unknown))
189187
// CHECK-64: (field name=t15 offset=144
190188
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
191-
// CHECK-64: (field name=_variantStorage offset=0
189+
// CHECK-64: (field name=_variantBuffer offset=0
192190
// CHECK-64: (multi_payload_enum size=9 alignment=8 stride=16 num_extra_inhabitants=0
193191
// CHECK-64: (field name=native offset=0
194192
// CHECK-64: (reference kind=strong refcounting=native))
195193
// CHECK-64: (field name=cocoa offset=0
196-
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647
197-
// CHECK-64: (field name=cocoaSet offset=0
198-
// CHECK-64: (reference kind=strong refcounting=unknown))))))))
194+
// CHECK-64: (reference kind=strong refcounting=native))))))
199195
// CHECK-64: (field name=t16 offset=160
200196
// CHECK-64: (struct size=24 alignment=8 stride=24 num_extra_inhabitants=0
201197
// CHECK-64: (field name=_core offset=0
@@ -270,7 +266,7 @@ reflect(object: obj)
270266
// CHECK-32: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647))))))
271267
// CHECK-32: (field name=t03 offset=32
272268
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
273-
// CHECK-32: (field name=_variantStorage offset=0
269+
// CHECK-32: (field name=_variantBuffer offset=0
274270
// CHECK-32: (multi_payload_enum size=5 alignment=4 stride=8 num_extra_inhabitants=0
275271
// CHECK-32: (field name=native offset=0
276272
// CHECK-32: (reference kind=strong refcounting=native))
@@ -316,7 +312,7 @@ reflect(object: obj)
316312
// CHECK-32: (reference kind=strong refcounting=unknown))
317313
// CHECK-32: (field name=t15 offset=92
318314
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
319-
// CHECK-32: (field name=_variantStorage offset=0
315+
// CHECK-32: (field name=_variantBuffer offset=0
320316
// CHECK-32: (multi_payload_enum size=5 alignment=4 stride=8 num_extra_inhabitants=0
321317
// CHECK-32: (field name=native offset=0
322318
// CHECK-32: (reference kind=strong refcounting=native))

validation-test/stdlib/Dictionary.swift

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -719,15 +719,15 @@ DictionaryTestSuite.test("COW.Slow.RemoveValueForKeyDoesNotReallocate") {
719719
DictionaryTestSuite.test("COW.Fast.RemoveAllDoesNotReallocate") {
720720
do {
721721
var d = getCOWFastDictionary()
722-
let originalCapacity = d._variantStorage.asNative.capacity
722+
let originalCapacity = d._variantBuffer.asNative.capacity
723723
assert(d.count == 3)
724724
assert(d[10]! == 1010)
725725

726726
d.removeAll()
727727
// We cannot assert that identity changed, since the new buffer of smaller
728728
// size can be allocated at the same address as the old one.
729729
var identity1 = d._rawIdentifier()
730-
assert(d._variantStorage.asNative.capacity < originalCapacity)
730+
assert(d._variantBuffer.asNative.capacity < originalCapacity)
731731
assert(d.count == 0)
732732
assert(d[10] == nil)
733733

@@ -740,19 +740,19 @@ DictionaryTestSuite.test("COW.Fast.RemoveAllDoesNotReallocate") {
740740
do {
741741
var d = getCOWFastDictionary()
742742
var identity1 = d._rawIdentifier()
743-
let originalCapacity = d._variantStorage.asNative.capacity
743+
let originalCapacity = d._variantBuffer.asNative.capacity
744744
assert(d.count == 3)
745745
assert(d[10]! == 1010)
746746

747747
d.removeAll(keepingCapacity: true)
748748
assert(identity1 == d._rawIdentifier())
749-
assert(d._variantStorage.asNative.capacity == originalCapacity)
749+
assert(d._variantBuffer.asNative.capacity == originalCapacity)
750750
assert(d.count == 0)
751751
assert(d[10] == nil)
752752

753753
d.removeAll(keepingCapacity: true)
754754
assert(identity1 == d._rawIdentifier())
755-
assert(d._variantStorage.asNative.capacity == originalCapacity)
755+
assert(d._variantBuffer.asNative.capacity == originalCapacity)
756756
assert(d.count == 0)
757757
assert(d[10] == nil)
758758
}
@@ -781,7 +781,7 @@ DictionaryTestSuite.test("COW.Fast.RemoveAllDoesNotReallocate") {
781781
do {
782782
var d1 = getCOWFastDictionary()
783783
var identity1 = d1._rawIdentifier()
784-
let originalCapacity = d1._variantStorage.asNative.capacity
784+
let originalCapacity = d1._variantBuffer.asNative.capacity
785785
assert(d1.count == 3)
786786
assert(d1[10] == 1010)
787787

@@ -792,7 +792,7 @@ DictionaryTestSuite.test("COW.Fast.RemoveAllDoesNotReallocate") {
792792
assert(identity2 != identity1)
793793
assert(d1.count == 3)
794794
assert(d1[10]! == 1010)
795-
assert(d2._variantStorage.asNative.capacity == originalCapacity)
795+
assert(d2._variantBuffer.asNative.capacity == originalCapacity)
796796
assert(d2.count == 0)
797797
assert(d2[10] == nil)
798798

@@ -805,15 +805,15 @@ DictionaryTestSuite.test("COW.Fast.RemoveAllDoesNotReallocate") {
805805
DictionaryTestSuite.test("COW.Slow.RemoveAllDoesNotReallocate") {
806806
do {
807807
var d = getCOWSlowDictionary()
808-
let originalCapacity = d._variantStorage.asNative.capacity
808+
let originalCapacity = d._variantBuffer.asNative.capacity
809809
assert(d.count == 3)
810810
assert(d[TestKeyTy(10)]!.value == 1010)
811811

812812
d.removeAll()
813813
// We cannot assert that identity changed, since the new buffer of smaller
814814
// size can be allocated at the same address as the old one.
815815
var identity1 = d._rawIdentifier()
816-
assert(d._variantStorage.asNative.capacity < originalCapacity)
816+
assert(d._variantBuffer.asNative.capacity < originalCapacity)
817817
assert(d.count == 0)
818818
assert(d[TestKeyTy(10)] == nil)
819819

@@ -826,19 +826,19 @@ DictionaryTestSuite.test("COW.Slow.RemoveAllDoesNotReallocate") {
826826
do {
827827
var d = getCOWSlowDictionary()
828828
var identity1 = d._rawIdentifier()
829-
let originalCapacity = d._variantStorage.asNative.capacity
829+
let originalCapacity = d._variantBuffer.asNative.capacity
830830
assert(d.count == 3)
831831
assert(d[TestKeyTy(10)]!.value == 1010)
832832

833833
d.removeAll(keepingCapacity: true)
834834
assert(identity1 == d._rawIdentifier())
835-
assert(d._variantStorage.asNative.capacity == originalCapacity)
835+
assert(d._variantBuffer.asNative.capacity == originalCapacity)
836836
assert(d.count == 0)
837837
assert(d[TestKeyTy(10)] == nil)
838838

839839
d.removeAll(keepingCapacity: true)
840840
assert(identity1 == d._rawIdentifier())
841-
assert(d._variantStorage.asNative.capacity == originalCapacity)
841+
assert(d._variantBuffer.asNative.capacity == originalCapacity)
842842
assert(d.count == 0)
843843
assert(d[TestKeyTy(10)] == nil)
844844
}
@@ -867,7 +867,7 @@ DictionaryTestSuite.test("COW.Slow.RemoveAllDoesNotReallocate") {
867867
do {
868868
var d1 = getCOWSlowDictionary()
869869
var identity1 = d1._rawIdentifier()
870-
let originalCapacity = d1._variantStorage.asNative.capacity
870+
let originalCapacity = d1._variantBuffer.asNative.capacity
871871
assert(d1.count == 3)
872872
assert(d1[TestKeyTy(10)]!.value == 1010)
873873

@@ -878,7 +878,7 @@ DictionaryTestSuite.test("COW.Slow.RemoveAllDoesNotReallocate") {
878878
assert(identity2 != identity1)
879879
assert(d1.count == 3)
880880
assert(d1[TestKeyTy(10)]!.value == 1010)
881-
assert(d2._variantStorage.asNative.capacity == originalCapacity)
881+
assert(d2._variantBuffer.asNative.capacity == originalCapacity)
882882
assert(d2.count == 0)
883883
assert(d2[TestKeyTy(10)] == nil)
884884

@@ -2034,7 +2034,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Verbatim.RemoveAll") {
20342034

20352035
d.removeAll()
20362036
assert(identity1 != d._rawIdentifier())
2037-
assert(d._variantStorage.asNative.capacity < originalCapacity)
2037+
assert(d._variantBuffer.asNative.capacity < originalCapacity)
20382038
assert(d.count == 0)
20392039
assert(d[TestObjCKeyTy(10)] == nil)
20402040
}
@@ -2049,7 +2049,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Verbatim.RemoveAll") {
20492049

20502050
d.removeAll(keepingCapacity: true)
20512051
assert(identity1 != d._rawIdentifier())
2052-
assert(d._variantStorage.asNative.capacity >= originalCapacity)
2052+
assert(d._variantBuffer.asNative.capacity >= originalCapacity)
20532053
assert(d.count == 0)
20542054
assert(d[TestObjCKeyTy(10)] == nil)
20552055
}
@@ -2069,7 +2069,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Verbatim.RemoveAll") {
20692069
assert(identity2 != identity1)
20702070
assert(d1.count == 3)
20712071
assert((d1[TestObjCKeyTy(10)] as! TestObjCValueTy).value == 1010)
2072-
assert(d2._variantStorage.asNative.capacity < originalCapacity)
2072+
assert(d2._variantBuffer.asNative.capacity < originalCapacity)
20732073
assert(d2.count == 0)
20742074
assert(d2[TestObjCKeyTy(10)] == nil)
20752075
}
@@ -2089,7 +2089,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Verbatim.RemoveAll") {
20892089
assert(identity2 != identity1)
20902090
assert(d1.count == 3)
20912091
assert((d1[TestObjCKeyTy(10)] as! TestObjCValueTy).value == 1010)
2092-
assert(d2._variantStorage.asNative.capacity >= originalCapacity)
2092+
assert(d2._variantBuffer.asNative.capacity >= originalCapacity)
20932093
assert(d2.count == 0)
20942094
assert(d2[TestObjCKeyTy(10)] == nil)
20952095
}
@@ -2117,7 +2117,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Nonverbatim.RemoveAll") {
21172117

21182118
d.removeAll()
21192119
assert(identity1 != d._rawIdentifier())
2120-
assert(d._variantStorage.asNative.capacity < originalCapacity)
2120+
assert(d._variantBuffer.asNative.capacity < originalCapacity)
21212121
assert(d.count == 0)
21222122
assert(d[TestBridgedKeyTy(10)] == nil)
21232123
}
@@ -2132,7 +2132,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Nonverbatim.RemoveAll") {
21322132

21332133
d.removeAll(keepingCapacity: true)
21342134
assert(identity1 == d._rawIdentifier())
2135-
assert(d._variantStorage.asNative.capacity >= originalCapacity)
2135+
assert(d._variantBuffer.asNative.capacity >= originalCapacity)
21362136
assert(d.count == 0)
21372137
assert(d[TestBridgedKeyTy(10)] == nil)
21382138
}
@@ -2152,7 +2152,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Nonverbatim.RemoveAll") {
21522152
assert(identity2 != identity1)
21532153
assert(d1.count == 3)
21542154
assert(d1[TestBridgedKeyTy(10)]!.value == 1010)
2155-
assert(d2._variantStorage.asNative.capacity < originalCapacity)
2155+
assert(d2._variantBuffer.asNative.capacity < originalCapacity)
21562156
assert(d2.count == 0)
21572157
assert(d2[TestBridgedKeyTy(10)] == nil)
21582158
}
@@ -2172,7 +2172,7 @@ DictionaryTestSuite.test("BridgedFromObjC.Nonverbatim.RemoveAll") {
21722172
assert(identity2 != identity1)
21732173
assert(d1.count == 3)
21742174
assert(d1[TestBridgedKeyTy(10)]!.value == 1010)
2175-
assert(d2._variantStorage.asNative.capacity >= originalCapacity)
2175+
assert(d2._variantBuffer.asNative.capacity >= originalCapacity)
21762176
assert(d2.count == 0)
21772177
assert(d2[TestBridgedKeyTy(10)] == nil)
21782178
}

0 commit comments

Comments
 (0)