@@ -26,17 +26,13 @@ class float "PyObject *" "&PyFloat_Type"
2626
2727#include "clinic/floatobject.c.h"
2828
29- #ifndef PyFloat_MAXFREELIST
30- # define PyFloat_MAXFREELIST 100
31- #endif
32-
33-
34- #if PyFloat_MAXFREELIST > 0
29+ #ifdef WITH_FREELISTS
3530static struct _Py_float_state *
3631get_float_state (void )
3732{
38- PyInterpreterState * interp = _PyInterpreterState_GET ();
39- return & interp -> float_state ;
33+ _PyFreeListState * state = _PyFreeListState_GET ();
34+ assert (state != NULL );
35+ return & state -> float_state ;
4036}
4137#endif
4238
@@ -132,7 +128,7 @@ PyObject *
132128PyFloat_FromDouble (double fval )
133129{
134130 PyFloatObject * op ;
135- #if PyFloat_MAXFREELIST > 0
131+ #ifdef WITH_FREELISTS
136132 struct _Py_float_state * state = get_float_state ();
137133 op = state -> free_list ;
138134 if (op != NULL ) {
@@ -252,13 +248,9 @@ _PyFloat_ExactDealloc(PyObject *obj)
252248{
253249 assert (PyFloat_CheckExact (obj ));
254250 PyFloatObject * op = (PyFloatObject * )obj ;
255- #if PyFloat_MAXFREELIST > 0
251+ #ifdef WITH_FREELISTS
256252 struct _Py_float_state * state = get_float_state ();
257- #ifdef Py_DEBUG
258- // float_dealloc() must not be called after _PyFloat_Fini()
259- assert (state -> numfree != -1 );
260- #endif
261- if (state -> numfree >= PyFloat_MAXFREELIST ) {
253+ if (state -> numfree >= PyFloat_MAXFREELIST || state -> numfree < 0 ) {
262254 PyObject_Free (op );
263255 return ;
264256 }
@@ -275,7 +267,7 @@ static void
275267float_dealloc (PyObject * op )
276268{
277269 assert (PyFloat_Check (op ));
278- #if PyFloat_MAXFREELIST > 0
270+ #ifdef WITH_FREELISTS
279271 if (PyFloat_CheckExact (op )) {
280272 _PyFloat_ExactDealloc (op );
281273 }
@@ -2002,29 +1994,30 @@ _PyFloat_InitTypes(PyInterpreterState *interp)
20021994}
20031995
20041996void
2005- _PyFloat_ClearFreeList (PyInterpreterState * interp )
1997+ _PyFloat_ClearFreeList (_PyFreeListState * freelist_state , int is_finalization )
20061998{
2007- #if PyFloat_MAXFREELIST > 0
2008- struct _Py_float_state * state = & interp -> float_state ;
1999+ #ifdef WITH_FREELISTS
2000+ struct _Py_float_state * state = & freelist_state -> float_state ;
20092001 PyFloatObject * f = state -> free_list ;
20102002 while (f != NULL ) {
20112003 PyFloatObject * next = (PyFloatObject * ) Py_TYPE (f );
20122004 PyObject_Free (f );
20132005 f = next ;
20142006 }
20152007 state -> free_list = NULL ;
2016- state -> numfree = 0 ;
2008+ if (is_finalization ) {
2009+ state -> numfree = -1 ;
2010+ }
2011+ else {
2012+ state -> numfree = 0 ;
2013+ }
20172014#endif
20182015}
20192016
20202017void
2021- _PyFloat_Fini (PyInterpreterState * interp )
2018+ _PyFloat_Fini (_PyFreeListState * state )
20222019{
2023- _PyFloat_ClearFreeList (interp );
2024- #if defined(Py_DEBUG ) && PyFloat_MAXFREELIST > 0
2025- struct _Py_float_state * state = & interp -> float_state ;
2026- state -> numfree = -1 ;
2027- #endif
2020+ _PyFloat_ClearFreeList (state , 1 );
20282021}
20292022
20302023void
@@ -2037,7 +2030,7 @@ _PyFloat_FiniType(PyInterpreterState *interp)
20372030void
20382031_PyFloat_DebugMallocStats (FILE * out )
20392032{
2040- #if PyFloat_MAXFREELIST > 0
2033+ #ifdef WITH_FREELISTS
20412034 struct _Py_float_state * state = get_float_state ();
20422035 _PyDebugAllocatorStats (out ,
20432036 "free PyFloatObject" ,
0 commit comments