Feature or enhancement
The free-threaded build requires that Python objects -- and only Python objects -- be allocated through the Python object allocation APIs (like PyObject_Malloc() or PyType_GenericNew()) 1.
There are a few places internally 2 that use PyObject_Malloc() for non Python objects. We should switch those call sites to use PyMem_Malloc()/Free() instead.
Note that there is not a significant difference between using PyObject_Malloc() and PyMem_Malloc() in the default build. Both calls use obmalloc under the hood, so switching from one to the other should not matter for the default build.
Here are some examples, but this list may not be exhaustive:
|
ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep)); |
|
self->extra = PyObject_Malloc(sizeof(ElementObjectExtra)); |
|
children = PyObject_Realloc(self->extra->children, |
|
size * sizeof(PyObject*)); |
https://github.com/python/cpython/blob/main/Modules/mathmodule.c#L2573
|
static XML_Memory_Handling_Suite ExpatMemoryHandler = { |
|
PyObject_Malloc, PyObject_Realloc, PyObject_Free}; |
|
new->ob_bytes = PyObject_Malloc(alloc); |
|
char *result = (char *)PyObject_Malloc((input_length + 1) * sizeof(char)); |
Linked PRs
Feature or enhancement
The free-threaded build requires that Python objects -- and only Python objects -- be allocated through the Python object allocation APIs (like
PyObject_Malloc()orPyType_GenericNew()) 1.There are a few places internally 2 that use
PyObject_Malloc()for non Python objects. We should switch those call sites to usePyMem_Malloc()/Free()instead.Note that there is not a significant difference between using
PyObject_Malloc()andPyMem_Malloc()in the default build. Both calls use obmalloc under the hood, so switching from one to the other should not matter for the default build.Here are some examples, but this list may not be exhaustive:
cpython/Modules/_sre/sre_lib.h
Line 1125 in 841eacd
cpython/Modules/_elementtree.c
Line 270 in 841eacd
cpython/Modules/_elementtree.c
Lines 498 to 499 in 841eacd
https://github.com/python/cpython/blob/main/Modules/mathmodule.c#L2573
cpython/Modules/pyexpat.c
Lines 23 to 24 in 841eacd
cpython/Objects/bytearrayobject.c
Line 135 in 841eacd
cpython/Parser/lexer/lexer.c
Line 132 in 841eacd
Linked PRs
Footnotes
See https://peps.python.org/pep-0703/#backwards-compatibility:~:text=Non%2DPython%20objects%20must%20not%20be%20allocated%20through%20those%20APIs ↩
@DinoV fixed the use in
dictobject.cin https://github.com/python/cpython/pull/114543 ↩