55
66#include "Python.h"
77#include "pycore_dtoa.h"
8+ #include "pycore_interp.h" // _PyInterpreterState.float_state
9+ #include "pycore_pystate.h" // _PyInterpreterState_GET()
810
911#include <ctype.h>
1012#include <float.h>
@@ -16,16 +18,9 @@ class float "PyObject *" "&PyFloat_Type"
1618
1719#include "clinic/floatobject.c.h"
1820
19- /* Special free list
20- free_list is a singly-linked list of available PyFloatObjects, linked
21- via abuse of their ob_type members.
22- */
23-
2421#ifndef PyFloat_MAXFREELIST
25- #define PyFloat_MAXFREELIST 100
22+ # define PyFloat_MAXFREELIST 100
2623#endif
27- static int numfree = 0 ;
28- static PyFloatObject * free_list = NULL ;
2924
3025double
3126PyFloat_GetMax (void )
@@ -117,16 +112,19 @@ PyFloat_GetInfo(void)
117112PyObject *
118113PyFloat_FromDouble (double fval )
119114{
120- PyFloatObject * op = free_list ;
115+ PyInterpreterState * interp = _PyInterpreterState_GET ();
116+ struct _Py_float_state * state = & interp -> float_state ;
117+ PyFloatObject * op = state -> free_list ;
121118 if (op != NULL ) {
122- free_list = (PyFloatObject * ) Py_TYPE (op );
123- numfree -- ;
124- } else {
125- op = (PyFloatObject * ) PyObject_MALLOC (sizeof (PyFloatObject ));
126- if (!op )
119+ state -> free_list = (PyFloatObject * ) Py_TYPE (op );
120+ state -> numfree -- ;
121+ }
122+ else {
123+ op = PyObject_Malloc (sizeof (PyFloatObject ));
124+ if (!op ) {
127125 return PyErr_NoMemory ();
126+ }
128127 }
129- /* Inline PyObject_New */
130128 (void )PyObject_INIT (op , & PyFloat_Type );
131129 op -> ob_fval = fval ;
132130 return (PyObject * ) op ;
@@ -219,13 +217,15 @@ static void
219217float_dealloc (PyFloatObject * op )
220218{
221219 if (PyFloat_CheckExact (op )) {
222- if (numfree >= PyFloat_MAXFREELIST ) {
220+ PyInterpreterState * interp = _PyInterpreterState_GET ();
221+ struct _Py_float_state * state = & interp -> float_state ;
222+ if (state -> numfree >= PyFloat_MAXFREELIST ) {
223223 PyObject_FREE (op );
224224 return ;
225225 }
226- numfree ++ ;
227- Py_SET_TYPE (op , (PyTypeObject * )free_list );
228- free_list = op ;
226+ state -> numfree ++ ;
227+ Py_SET_TYPE (op , (PyTypeObject * )state -> free_list );
228+ state -> free_list = op ;
229229 }
230230 else
231231 Py_TYPE (op )-> tp_free ((PyObject * )op );
@@ -1981,30 +1981,33 @@ _PyFloat_Init(void)
19811981}
19821982
19831983void
1984- _PyFloat_ClearFreeList (void )
1984+ _PyFloat_ClearFreeList (PyThreadState * tstate )
19851985{
1986- PyFloatObject * f = free_list , * next ;
1986+ struct _Py_float_state * state = & tstate -> interp -> float_state ;
1987+ PyFloatObject * f = state -> free_list , * next ;
19871988 for (; f ; f = next ) {
19881989 next = (PyFloatObject * ) Py_TYPE (f );
19891990 PyObject_FREE (f );
19901991 }
1991- free_list = NULL ;
1992- numfree = 0 ;
1992+ state -> free_list = NULL ;
1993+ state -> numfree = 0 ;
19931994}
19941995
19951996void
1996- _PyFloat_Fini (void )
1997+ _PyFloat_Fini (PyThreadState * tstate )
19971998{
1998- _PyFloat_ClearFreeList ();
1999+ _PyFloat_ClearFreeList (tstate );
19992000}
20002001
20012002/* Print summary info about the state of the optimized allocator */
20022003void
20032004_PyFloat_DebugMallocStats (FILE * out )
20042005{
2006+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2007+ struct _Py_float_state * state = & interp -> float_state ;
20052008 _PyDebugAllocatorStats (out ,
20062009 "free PyFloatObject" ,
2007- numfree , sizeof (PyFloatObject ));
2010+ state -> numfree , sizeof (PyFloatObject ));
20082011}
20092012
20102013
0 commit comments