Skip to content

Commit 4555611

Browse files
authored
Merge pull request #29381 from eeckstein/dict-change
2 parents ab99ae2 + 78728d8 commit 4555611

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

stdlib/public/core/NativeDictionary.swift

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -187,45 +187,49 @@ extension _NativeDictionary { // Low-level lookup operations
187187
}
188188

189189
extension _NativeDictionary { // ensureUnique
190-
@inlinable
191-
internal mutating func resize(capacity: Int) {
190+
@_alwaysEmitIntoClient
191+
@inline(never)
192+
internal mutating func _copyOrMoveAndResize(
193+
capacity: Int,
194+
moveElements: Bool
195+
) {
192196
let capacity = Swift.max(capacity, self.capacity)
193197
let newStorage = _DictionaryStorage<Key, Value>.resize(
194198
original: _storage,
195199
capacity: capacity,
196-
move: true)
200+
move: moveElements)
197201
let result = _NativeDictionary(newStorage)
198202
if count > 0 {
199203
for bucket in hashTable {
200-
let key = (_keys + bucket.offset).move()
201-
let value = (_values + bucket.offset).move()
204+
let key: Key
205+
let value: Value
206+
if moveElements {
207+
key = (_keys + bucket.offset).move()
208+
value = (_values + bucket.offset).move()
209+
} else {
210+
key = self.uncheckedKey(at: bucket)
211+
value = self.uncheckedValue(at: bucket)
212+
}
202213
result._unsafeInsertNew(key: key, value: value)
203214
}
204-
// Clear out old storage, ensuring that its deinit won't overrelease the
205-
// elements we've just moved out.
206-
_storage._hashTable.clear()
207-
_storage._count = 0
215+
if moveElements {
216+
// Clear out old storage, ensuring that its deinit won't overrelease the
217+
// elements we've just moved out.
218+
_storage._hashTable.clear()
219+
_storage._count = 0
220+
}
208221
}
209222
_storage = result._storage
210223
}
211224

212225
@inlinable
213-
@_semantics("optimize.sil.specialize.generic.size.never")
226+
internal mutating func resize(capacity: Int) {
227+
_copyOrMoveAndResize(capacity: capacity, moveElements: true)
228+
}
229+
230+
@inlinable
214231
internal mutating func copyAndResize(capacity: Int) {
215-
let capacity = Swift.max(capacity, self.capacity)
216-
let newStorage = _DictionaryStorage<Key, Value>.resize(
217-
original: _storage,
218-
capacity: capacity,
219-
move: false)
220-
let result = _NativeDictionary(newStorage)
221-
if count > 0 {
222-
for bucket in hashTable {
223-
result._unsafeInsertNew(
224-
key: self.uncheckedKey(at: bucket),
225-
value: self.uncheckedValue(at: bucket))
226-
}
227-
}
228-
_storage = result._storage
232+
_copyOrMoveAndResize(capacity: capacity, moveElements: false)
229233
}
230234

231235
@inlinable

0 commit comments

Comments
 (0)