summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Objects/floatobject.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2026-02-03 21:59:07 +0300
committershadchin <[email protected]>2026-02-03 22:28:51 +0300
commitbce46f28de392862d5c6c3b185d844ee7c623be3 (patch)
tree424878b5b90144f98970ce4a2745990c77330ad2 /contrib/tools/python3/Objects/floatobject.c
parent0e0ee9fa48ce9411b4038aa769493d22ff6c10a2 (diff)
Import Python 3.13.11
commit_hash:bbb53cefb159aa3e7afaa475fd19d5a03b66945f
Diffstat (limited to 'contrib/tools/python3/Objects/floatobject.c')
-rw-r--r--contrib/tools/python3/Objects/floatobject.c92
1 files changed, 38 insertions, 54 deletions
diff --git a/contrib/tools/python3/Objects/floatobject.c b/contrib/tools/python3/Objects/floatobject.c
index 92d40e8acad..14a98f542fa 100644
--- a/contrib/tools/python3/Objects/floatobject.c
+++ b/contrib/tools/python3/Objects/floatobject.c
@@ -4,18 +4,19 @@
for any kind of float exception without losing portability. */
#include "Python.h"
+#include "pycore_abstract.h" // _PyNumber_Index()
#include "pycore_dtoa.h" // _Py_dg_dtoa()
#include "pycore_floatobject.h" // _PyFloat_FormatAdvancedWriter()
#include "pycore_initconfig.h" // _PyStatus_OK()
-#include "pycore_interp.h" // _PyInterpreterState.float_state
+#include "pycore_interp.h" // _Py_float_freelist
#include "pycore_long.h" // _PyLong_GetOne()
-#include "pycore_object.h" // _PyObject_Init()
+#include "pycore_modsupport.h" // _PyArg_NoKwnames()
+#include "pycore_object.h" // _PyObject_Init(), _PyDebugAllocatorStats()
#include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin()
-#include <ctype.h>
-#include <float.h>
+#include <float.h> // DBL_MAX
#include <stdlib.h> // strtol()
/*[clinic input]
@@ -25,17 +26,13 @@ class float "PyObject *" "&PyFloat_Type"
#include "clinic/floatobject.c.h"
-#ifndef PyFloat_MAXFREELIST
-# define PyFloat_MAXFREELIST 100
-#endif
-
-
-#if PyFloat_MAXFREELIST > 0
-static struct _Py_float_state *
-get_float_state(void)
+#ifdef WITH_FREELISTS
+static struct _Py_float_freelist *
+get_float_freelist(void)
{
- PyInterpreterState *interp = _PyInterpreterState_GET();
- return &interp->float_state;
+ struct _Py_object_freelists *freelists = _Py_object_freelists_GET();
+ assert(freelists != NULL);
+ return &freelists->floats;
}
#endif
@@ -136,16 +133,12 @@ PyObject *
PyFloat_FromDouble(double fval)
{
PyFloatObject *op;
-#if PyFloat_MAXFREELIST > 0
- struct _Py_float_state *state = get_float_state();
- op = state->free_list;
+#ifdef WITH_FREELISTS
+ struct _Py_float_freelist *float_freelist = get_float_freelist();
+ op = float_freelist->items;
if (op != NULL) {
-#ifdef Py_DEBUG
- // PyFloat_FromDouble() must not be called after _PyFloat_Fini()
- assert(state->numfree != -1);
-#endif
- state->free_list = (PyFloatObject *) Py_TYPE(op);
- state->numfree--;
+ float_freelist->items = (PyFloatObject *) Py_TYPE(op);
+ float_freelist->numfree--;
OBJECT_STAT_INC(from_freelist);
}
else
@@ -256,19 +249,15 @@ _PyFloat_ExactDealloc(PyObject *obj)
{
assert(PyFloat_CheckExact(obj));
PyFloatObject *op = (PyFloatObject *)obj;
-#if PyFloat_MAXFREELIST > 0
- struct _Py_float_state *state = get_float_state();
-#ifdef Py_DEBUG
- // float_dealloc() must not be called after _PyFloat_Fini()
- assert(state->numfree != -1);
-#endif
- if (state->numfree >= PyFloat_MAXFREELIST) {
+#ifdef WITH_FREELISTS
+ struct _Py_float_freelist *float_freelist = get_float_freelist();
+ if (float_freelist->numfree >= PyFloat_MAXFREELIST || float_freelist->numfree < 0) {
PyObject_Free(op);
return;
}
- state->numfree++;
- Py_SET_TYPE(op, (PyTypeObject *)state->free_list);
- state->free_list = op;
+ float_freelist->numfree++;
+ Py_SET_TYPE(op, (PyTypeObject *)float_freelist->items);
+ float_freelist->items = op;
OBJECT_STAT_INC(to_freelist);
#else
PyObject_Free(op);
@@ -279,7 +268,7 @@ static void
float_dealloc(PyObject *op)
{
assert(PyFloat_Check(op));
-#if PyFloat_MAXFREELIST > 0
+#ifdef WITH_FREELISTS
if (PyFloat_CheckExact(op)) {
_PyFloat_ExactDealloc(op);
}
@@ -650,7 +639,7 @@ float_rem(PyObject *v, PyObject *w)
CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "float modulo");
+ "float modulo by zero");
return NULL;
}
mod = fmod(vx, wx);
@@ -2006,28 +1995,23 @@ _PyFloat_InitTypes(PyInterpreterState *interp)
}
void
-_PyFloat_ClearFreeList(PyInterpreterState *interp)
+_PyFloat_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization)
{
-#if PyFloat_MAXFREELIST > 0
- struct _Py_float_state *state = &interp->float_state;
- PyFloatObject *f = state->free_list;
+#ifdef WITH_FREELISTS
+ struct _Py_float_freelist *state = &freelists->floats;
+ PyFloatObject *f = state->items;
while (f != NULL) {
PyFloatObject *next = (PyFloatObject*) Py_TYPE(f);
PyObject_Free(f);
f = next;
}
- state->free_list = NULL;
- state->numfree = 0;
-#endif
-}
-
-void
-_PyFloat_Fini(PyInterpreterState *interp)
-{
- _PyFloat_ClearFreeList(interp);
-#if defined(Py_DEBUG) && PyFloat_MAXFREELIST > 0
- struct _Py_float_state *state = &interp->float_state;
- state->numfree = -1;
+ state->items = NULL;
+ if (is_finalization) {
+ state->numfree = -1;
+ }
+ else {
+ state->numfree = 0;
+ }
#endif
}
@@ -2041,11 +2025,11 @@ _PyFloat_FiniType(PyInterpreterState *interp)
void
_PyFloat_DebugMallocStats(FILE *out)
{
-#if PyFloat_MAXFREELIST > 0
- struct _Py_float_state *state = get_float_state();
+#ifdef WITH_FREELISTS
+ struct _Py_float_freelist *float_freelist = get_float_freelist();
_PyDebugAllocatorStats(out,
"free PyFloatObject",
- state->numfree, sizeof(PyFloatObject));
+ float_freelist->numfree, sizeof(PyFloatObject));
#endif
}