@@ -187,45 +187,49 @@ extension _NativeDictionary { // Low-level lookup operations
187187}
188188
189189extension _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