@@ -276,25 +276,35 @@ get_dict_freelist(void)
276
276
struct _Py_object_freelists * freelists = _Py_object_freelists_GET ();
277
277
return & freelists -> dicts ;
278
278
}
279
+
280
+ static struct _Py_dictkeys_freelist *
281
+ get_dictkeys_freelist (void )
282
+ {
283
+ struct _Py_object_freelists * freelists = _Py_object_freelists_GET ();
284
+ return & freelists -> dictkeys ;
285
+ }
279
286
#endif
280
287
281
288
282
289
void
283
290
_PyDict_ClearFreeList (struct _Py_object_freelists * freelists , int is_finalization )
284
291
{
285
292
#ifdef WITH_FREELISTS
286
- struct _Py_dict_freelist * state = & freelists -> dicts ;
287
- while (state -> numfree > 0 ) {
288
- PyDictObject * op = state -> free_list [-- state -> numfree ];
293
+ struct _Py_dict_freelist * dict_freelist = & freelists -> dicts ;
294
+ while (dict_freelist -> numfree > 0 ) {
295
+ PyDictObject * op = dict_freelist -> free_list [-- dict_freelist -> numfree ];
289
296
assert (PyDict_CheckExact (op ));
290
297
PyObject_GC_Del (op );
291
298
}
292
- while (state -> keys_numfree > 0 ) {
293
- PyMem_Free (state -> keys_free_list [-- state -> keys_numfree ]);
299
+ struct _Py_dictkeys_freelist * dictkeys_freelist = & freelists -> dictkeys ;
300
+ while (dictkeys_freelist -> keys_numfree > 0 ) {
301
+ PyMem_Free (dictkeys_freelist -> keys_free_list [-- dictkeys_freelist -> keys_numfree ]);
294
302
}
295
303
if (is_finalization ) {
296
- state -> numfree = -1 ;
297
- state -> keys_numfree = -1 ;
304
+ dict_freelist -> numfree = -1 ;
305
+ dict_freelist -> keys_numfree = -1 ;
306
+ dictkeys_freelist -> numfree = -1 ;
307
+ dictkeys_freelist -> keys_numfree = -1 ;
298
308
}
299
309
#endif
300
310
}
@@ -314,6 +324,9 @@ _PyDict_DebugMallocStats(FILE *out)
314
324
struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
315
325
_PyDebugAllocatorStats (out , "free PyDictObject" ,
316
326
dict_freelist -> numfree , sizeof (PyDictObject ));
327
+ struct _Py_dictkeys_freelist * dictkeys_freelist = get_dictkeys_freelist ();
328
+ _PyDebugAllocatorStats (out , "free PyDictKeysObject" ,
329
+ dictkeys_freelist -> numfree , sizeof (PyDictKeysObject ));
317
330
#endif
318
331
}
319
332
@@ -663,9 +676,9 @@ new_keys_object(PyInterpreterState *interp, uint8_t log2_size, bool unicode)
663
676
}
664
677
665
678
#ifdef WITH_FREELISTS
666
- struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
667
- if (log2_size == PyDict_LOG_MINSIZE && unicode && dict_freelist -> keys_numfree > 0 ) {
668
- dk = dict_freelist -> keys_free_list [-- dict_freelist -> keys_numfree ];
679
+ struct _Py_dictkeys_freelist * dictkey_freelist = get_dictkeys_freelist ();
680
+ if (log2_size == PyDict_LOG_MINSIZE && unicode && dictkey_freelist -> keys_numfree > 0 ) {
681
+ dk = dictkey_freelist -> keys_free_list [-- dictkey_freelist -> keys_numfree ];
669
682
OBJECT_STAT_INC (from_freelist );
670
683
}
671
684
else
@@ -698,12 +711,12 @@ static void
698
711
free_keys_object (PyDictKeysObject * keys )
699
712
{
700
713
#ifdef WITH_FREELISTS
701
- struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
714
+ struct _Py_dictkeys_freelist * dictkey_freelist = get_dictkeys_freelist ();
702
715
if (DK_LOG_SIZE (keys ) == PyDict_LOG_MINSIZE
703
- && dict_freelist -> keys_numfree < PyDict_MAXFREELIST
704
- && dict_freelist -> keys_numfree >= 0
716
+ && dictkey_freelist -> keys_numfree < PyDict_MAXFREELIST
717
+ && dictkey_freelist -> keys_numfree >= 0
705
718
&& DK_IS_UNICODE (keys )) {
706
- dict_freelist -> keys_free_list [dict_freelist -> keys_numfree ++ ] = keys ;
719
+ dictkey_freelist -> keys_free_list [dictkey_freelist -> keys_numfree ++ ] = keys ;
707
720
OBJECT_STAT_INC (to_freelist );
708
721
return ;
709
722
}
0 commit comments