@@ -276,25 +276,33 @@ get_dict_freelist(void)
276276 struct _Py_object_freelists * freelists = _Py_object_freelists_GET ();
277277 return & freelists -> dicts ;
278278}
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+ }
279286#endif
280287
281288
282289void
283290_PyDict_ClearFreeList (struct _Py_object_freelists * freelists , int is_finalization )
284291{
285292#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 * freelist = & freelists -> dicts ;
294+ while (freelist -> numfree > 0 ) {
295+ PyDictObject * op = freelist -> items [-- freelist -> numfree ];
289296 assert (PyDict_CheckExact (op ));
290297 PyObject_GC_Del (op );
291298 }
292- while (state -> keys_numfree > 0 ) {
293- PyMem_Free (state -> keys_free_list [-- state -> keys_numfree ]);
299+ struct _Py_dictkeys_freelist * keys_freelist = & freelists -> dictkeys ;
300+ while (keys_freelist -> numfree > 0 ) {
301+ PyMem_Free (keys_freelist -> items [-- keys_freelist -> numfree ]);
294302 }
295303 if (is_finalization ) {
296- state -> numfree = -1 ;
297- state -> keys_numfree = -1 ;
304+ freelist -> numfree = -1 ;
305+ keys_freelist -> numfree = -1 ;
298306 }
299307#endif
300308}
@@ -314,6 +322,9 @@ _PyDict_DebugMallocStats(FILE *out)
314322 struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
315323 _PyDebugAllocatorStats (out , "free PyDictObject" ,
316324 dict_freelist -> numfree , sizeof (PyDictObject ));
325+ struct _Py_dictkeys_freelist * dictkeys_freelist = get_dictkeys_freelist ();
326+ _PyDebugAllocatorStats (out , "free PyDictKeysObject" ,
327+ dictkeys_freelist -> numfree , sizeof (PyDictKeysObject ));
317328#endif
318329}
319330
@@ -663,9 +674,9 @@ new_keys_object(PyInterpreterState *interp, uint8_t log2_size, bool unicode)
663674 }
664675
665676#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 ];
677+ struct _Py_dictkeys_freelist * freelist = get_dictkeys_freelist ();
678+ if (log2_size == PyDict_LOG_MINSIZE && unicode && freelist -> numfree > 0 ) {
679+ dk = freelist -> items [-- freelist -> numfree ];
669680 OBJECT_STAT_INC (from_freelist );
670681 }
671682 else
@@ -698,12 +709,12 @@ static void
698709free_keys_object (PyDictKeysObject * keys )
699710{
700711#ifdef WITH_FREELISTS
701- struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
712+ struct _Py_dictkeys_freelist * freelist = get_dictkeys_freelist ();
702713 if (DK_LOG_SIZE (keys ) == PyDict_LOG_MINSIZE
703- && dict_freelist -> keys_numfree < PyDict_MAXFREELIST
704- && dict_freelist -> keys_numfree >= 0
714+ && freelist -> numfree < PyDict_MAXFREELIST
715+ && freelist -> numfree >= 0
705716 && DK_IS_UNICODE (keys )) {
706- dict_freelist -> keys_free_list [ dict_freelist -> keys_numfree ++ ] = keys ;
717+ freelist -> items [ freelist -> numfree ++ ] = keys ;
707718 OBJECT_STAT_INC (to_freelist );
708719 return ;
709720 }
@@ -743,9 +754,9 @@ new_dict(PyInterpreterState *interp,
743754 PyDictObject * mp ;
744755 assert (keys != NULL );
745756#ifdef WITH_FREELISTS
746- struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
747- if (dict_freelist -> numfree > 0 ) {
748- mp = dict_freelist -> free_list [-- dict_freelist -> numfree ];
757+ struct _Py_dict_freelist * freelist = get_dict_freelist ();
758+ if (freelist -> numfree > 0 ) {
759+ mp = freelist -> items [-- freelist -> numfree ];
749760 assert (mp != NULL );
750761 assert (Py_IS_TYPE (mp , & PyDict_Type ));
751762 OBJECT_STAT_INC (from_freelist );
@@ -2593,10 +2604,10 @@ dict_dealloc(PyObject *self)
25932604 dictkeys_decref (interp , keys );
25942605 }
25952606#ifdef WITH_FREELISTS
2596- struct _Py_dict_freelist * dict_freelist = get_dict_freelist ();
2597- if (dict_freelist -> numfree < PyDict_MAXFREELIST && dict_freelist -> numfree >=0 &&
2607+ struct _Py_dict_freelist * freelist = get_dict_freelist ();
2608+ if (freelist -> numfree < PyDict_MAXFREELIST && freelist -> numfree >=0 &&
25982609 Py_IS_TYPE (mp , & PyDict_Type )) {
2599- dict_freelist -> free_list [ dict_freelist -> numfree ++ ] = mp ;
2610+ freelist -> items [ freelist -> numfree ++ ] = mp ;
26002611 OBJECT_STAT_INC (to_freelist );
26012612 }
26022613 else
0 commit comments