@@ -26,17 +26,13 @@ class float "PyObject *" "&PyFloat_Type"
26
26
27
27
#include "clinic/floatobject.c.h"
28
28
29
- #ifndef PyFloat_MAXFREELIST
30
- # define PyFloat_MAXFREELIST 100
31
- #endif
32
-
33
-
34
- #if PyFloat_MAXFREELIST > 0
29
+ #ifdef WITH_FREELISTS
35
30
static struct _Py_float_state *
36
31
get_float_state (void )
37
32
{
38
- PyInterpreterState * interp = _PyInterpreterState_GET ();
39
- return & interp -> float_state ;
33
+ _PyFreeListState * state = _PyFreeListState_GET ();
34
+ assert (state != NULL );
35
+ return & state -> float_state ;
40
36
}
41
37
#endif
42
38
@@ -132,7 +128,7 @@ PyObject *
132
128
PyFloat_FromDouble (double fval )
133
129
{
134
130
PyFloatObject * op ;
135
- #if PyFloat_MAXFREELIST > 0
131
+ #ifdef WITH_FREELISTS
136
132
struct _Py_float_state * state = get_float_state ();
137
133
op = state -> free_list ;
138
134
if (op != NULL ) {
@@ -252,13 +248,9 @@ _PyFloat_ExactDealloc(PyObject *obj)
252
248
{
253
249
assert (PyFloat_CheckExact (obj ));
254
250
PyFloatObject * op = (PyFloatObject * )obj ;
255
- #if PyFloat_MAXFREELIST > 0
251
+ #ifdef WITH_FREELISTS
256
252
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 ) {
262
254
PyObject_Free (op );
263
255
return ;
264
256
}
@@ -275,7 +267,7 @@ static void
275
267
float_dealloc (PyObject * op )
276
268
{
277
269
assert (PyFloat_Check (op ));
278
- #if PyFloat_MAXFREELIST > 0
270
+ #ifdef WITH_FREELISTS
279
271
if (PyFloat_CheckExact (op )) {
280
272
_PyFloat_ExactDealloc (op );
281
273
}
@@ -2002,29 +1994,30 @@ _PyFloat_InitTypes(PyInterpreterState *interp)
2002
1994
}
2003
1995
2004
1996
void
2005
- _PyFloat_ClearFreeList (PyInterpreterState * interp )
1997
+ _PyFloat_ClearFreeList (_PyFreeListState * freelist_state , int is_finalization )
2006
1998
{
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 ;
2009
2001
PyFloatObject * f = state -> free_list ;
2010
2002
while (f != NULL ) {
2011
2003
PyFloatObject * next = (PyFloatObject * ) Py_TYPE (f );
2012
2004
PyObject_Free (f );
2013
2005
f = next ;
2014
2006
}
2015
2007
state -> free_list = NULL ;
2016
- state -> numfree = 0 ;
2008
+ if (is_finalization ) {
2009
+ state -> numfree = -1 ;
2010
+ }
2011
+ else {
2012
+ state -> numfree = 0 ;
2013
+ }
2017
2014
#endif
2018
2015
}
2019
2016
2020
2017
void
2021
- _PyFloat_Fini (PyInterpreterState * interp )
2018
+ _PyFloat_Fini (_PyFreeListState * state )
2022
2019
{
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 );
2028
2021
}
2029
2022
2030
2023
void
@@ -2037,7 +2030,7 @@ _PyFloat_FiniType(PyInterpreterState *interp)
2037
2030
void
2038
2031
_PyFloat_DebugMallocStats (FILE * out )
2039
2032
{
2040
- #if PyFloat_MAXFREELIST > 0
2033
+ #ifdef WITH_FREELISTS
2041
2034
struct _Py_float_state * state = get_float_state ();
2042
2035
_PyDebugAllocatorStats (out ,
2043
2036
"free PyFloatObject" ,
0 commit comments