@@ -240,17 +240,20 @@ uint64_t _pydict_global_version = 0;
240240#include "clinic/dictobject.c.h"
241241
242242
243+ #if PyDict_MAXFREELIST > 0
243244static struct _Py_dict_state *
244245get_dict_state (void )
245246{
246247 PyInterpreterState * interp = _PyInterpreterState_GET ();
247248 return & interp -> dict_state ;
248249}
250+ #endif
249251
250252
251253void
252254_PyDict_ClearFreeList (PyInterpreterState * interp )
253255{
256+ #if PyDict_MAXFREELIST > 0
254257 struct _Py_dict_state * state = & interp -> dict_state ;
255258 while (state -> numfree ) {
256259 PyDictObject * op = state -> free_list [-- state -> numfree ];
@@ -260,14 +263,15 @@ _PyDict_ClearFreeList(PyInterpreterState *interp)
260263 while (state -> keys_numfree ) {
261264 PyObject_Free (state -> keys_free_list [-- state -> keys_numfree ]);
262265 }
266+ #endif
263267}
264268
265269
266270void
267271_PyDict_Fini (PyInterpreterState * interp )
268272{
269273 _PyDict_ClearFreeList (interp );
270- #ifdef Py_DEBUG
274+ #if defined( Py_DEBUG ) && PyDict_MAXFREELIST > 0
271275 struct _Py_dict_state * state = & interp -> dict_state ;
272276 state -> numfree = -1 ;
273277 state -> keys_numfree = -1 ;
@@ -279,9 +283,11 @@ _PyDict_Fini(PyInterpreterState *interp)
279283void
280284_PyDict_DebugMallocStats (FILE * out )
281285{
286+ #if PyDict_MAXFREELIST > 0
282287 struct _Py_dict_state * state = get_dict_state ();
283288 _PyDebugAllocatorStats (out , "free PyDictObject" ,
284289 state -> numfree , sizeof (PyDictObject ));
290+ #endif
285291}
286292
287293#define DK_MASK (dk ) (DK_SIZE(dk)-1)
@@ -570,6 +576,7 @@ new_keys_object(uint8_t log2_size)
570576 es = sizeof (Py_ssize_t );
571577 }
572578
579+ #if PyDict_MAXFREELIST > 0
573580 struct _Py_dict_state * state = get_dict_state ();
574581#ifdef Py_DEBUG
575582 // new_keys_object() must not be called after _PyDict_Fini()
@@ -579,6 +586,7 @@ new_keys_object(uint8_t log2_size)
579586 dk = state -> keys_free_list [-- state -> keys_numfree ];
580587 }
581588 else
589+ #endif
582590 {
583591 dk = PyObject_Malloc (sizeof (PyDictKeysObject )
584592 + (es <<log2_size )
@@ -611,6 +619,7 @@ free_keys_object(PyDictKeysObject *keys)
611619 Py_XDECREF (entries [i ].me_key );
612620 Py_XDECREF (entries [i ].me_value );
613621 }
622+ #if PyDict_MAXFREELIST > 0
614623 struct _Py_dict_state * state = get_dict_state ();
615624#ifdef Py_DEBUG
616625 // free_keys_object() must not be called after _PyDict_Fini()
@@ -620,6 +629,7 @@ free_keys_object(PyDictKeysObject *keys)
620629 state -> keys_free_list [state -> keys_numfree ++ ] = keys ;
621630 return ;
622631 }
632+ #endif
623633 PyObject_Free (keys );
624634}
625635
@@ -638,6 +648,7 @@ new_dict(PyDictKeysObject *keys, PyDictValues *values, Py_ssize_t used, int free
638648{
639649 PyDictObject * mp ;
640650 assert (keys != NULL );
651+ #if PyDict_MAXFREELIST > 0
641652 struct _Py_dict_state * state = get_dict_state ();
642653#ifdef Py_DEBUG
643654 // new_dict() must not be called after _PyDict_Fini()
@@ -649,7 +660,9 @@ new_dict(PyDictKeysObject *keys, PyDictValues *values, Py_ssize_t used, int free
649660 assert (Py_IS_TYPE (mp , & PyDict_Type ));
650661 _Py_NewReference ((PyObject * )mp );
651662 }
652- else {
663+ else
664+ #endif
665+ {
653666 mp = PyObject_GC_New (PyDictObject , & PyDict_Type );
654667 if (mp == NULL ) {
655668 dictkeys_decref (keys );
@@ -1259,6 +1272,7 @@ dictresize(PyDictObject *mp, uint8_t log2_newsize)
12591272#ifdef Py_REF_DEBUG
12601273 _Py_RefTotal -- ;
12611274#endif
1275+ #if PyDict_MAXFREELIST > 0
12621276 struct _Py_dict_state * state = get_dict_state ();
12631277#ifdef Py_DEBUG
12641278 // dictresize() must not be called after _PyDict_Fini()
@@ -1269,7 +1283,9 @@ dictresize(PyDictObject *mp, uint8_t log2_newsize)
12691283 {
12701284 state -> keys_free_list [state -> keys_numfree ++ ] = oldkeys ;
12711285 }
1272- else {
1286+ else
1287+ #endif
1288+ {
12731289 PyObject_Free (oldkeys );
12741290 }
12751291 }
@@ -1987,6 +2003,7 @@ dict_dealloc(PyDictObject *mp)
19872003 assert (keys -> dk_refcnt == 1 );
19882004 dictkeys_decref (keys );
19892005 }
2006+ #if PyDict_MAXFREELIST > 0
19902007 struct _Py_dict_state * state = get_dict_state ();
19912008#ifdef Py_DEBUG
19922009 // new_dict() must not be called after _PyDict_Fini()
@@ -1995,7 +2012,9 @@ dict_dealloc(PyDictObject *mp)
19952012 if (state -> numfree < PyDict_MAXFREELIST && Py_IS_TYPE (mp , & PyDict_Type )) {
19962013 state -> free_list [state -> numfree ++ ] = mp ;
19972014 }
1998- else {
2015+ else
2016+ #endif
2017+ {
19992018 Py_TYPE (mp )-> tp_free ((PyObject * )mp );
20002019 }
20012020 Py_TRASHCAN_END
0 commit comments