diff options
author | Victor Stinner <vstinner@python.org> | 2023-07-24 18:48:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-24 18:48:06 (GMT) |
commit | 307186704d8327d6c67b0650e49b125758a25bbc (patch) | |
tree | bc16b1afa6e77c8d5f9c9b276a4f0f6483c950de | |
parent | d27eb1e406a8789d9eaba6dbfed5c2e5abe294fd (diff) | |
download | cpython-307186704d8327d6c67b0650e49b125758a25bbc.zip cpython-307186704d8327d6c67b0650e49b125758a25bbc.tar.gz cpython-307186704d8327d6c67b0650e49b125758a25bbc.tar.bz2 |
gh-106320: Remove private _PyMem API (#107187)
Move private _PyMem functions to the internal C API (pycore_pymem.h):
* _PyMem_GetCurrentAllocatorName()
* _PyMem_RawStrdup()
* _PyMem_RawWcsdup()
* _PyMem_Strdup()
No longer export these functions.
Move pymem_getallocatorsname() function from _testcapi to _testinternalcapi,
since the API moved to the internal C API.
-rw-r--r-- | Include/cpython/pymem.h | 12 | ||||
-rw-r--r-- | Include/internal/pycore_pymem.h | 14 | ||||
-rw-r--r-- | Lib/test/pythoninfo.py | 4 | ||||
-rw-r--r-- | Lib/test/test_cmd_line.py | 6 | ||||
-rw-r--r-- | Lib/test/test_sys.py | 4 | ||||
-rw-r--r-- | Modules/_testcapi/mem.c | 12 | ||||
-rw-r--r-- | Modules/_testinternalcapi.c | 13 | ||||
-rw-r--r-- | Modules/getpath.c | 8 |
8 files changed, 38 insertions, 35 deletions
diff --git a/Include/cpython/pymem.h b/Include/cpython/pymem.h index d1054d7..b75f1c4 100644 --- a/Include/cpython/pymem.h +++ b/Include/cpython/pymem.h @@ -7,18 +7,6 @@ PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); PyAPI_FUNC(void) PyMem_RawFree(void *ptr); -/* Try to get the allocators name set by _PyMem_SetupAllocators(). */ -PyAPI_FUNC(const char*) _PyMem_GetCurrentAllocatorName(void); - -/* strdup() using PyMem_RawMalloc() */ -PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); - -/* strdup() using PyMem_Malloc() */ -PyAPI_FUNC(char *) _PyMem_Strdup(const char *str); - -/* wcsdup() using PyMem_RawMalloc() */ -PyAPI_FUNC(wchar_t*) _PyMem_RawWcsdup(const wchar_t *str); - typedef enum { /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index c2f0325..0e53e66 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -8,8 +8,20 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pymem.h" // PyMemAllocatorName +// Try to get the allocators name set by _PyMem_SetupAllocators(). +// Return NULL if unknown. +// Export for shared _testinternalcapi extension. +PyAPI_FUNC(const char*) _PyMem_GetCurrentAllocatorName(void); +// strdup() using PyMem_RawMalloc() +extern char* _PyMem_RawStrdup(const char *str); + +// strdup() using PyMem_Malloc(). +// Export for shared _pickle extension. +PyAPI_FUNC(char*) _PyMem_Strdup(const char *str); + +// wcsdup() using PyMem_RawMalloc() +extern wchar_t* _PyMem_RawWcsdup(const wchar_t *str); typedef struct { /* We tag each block with an API ID in order to tag API violations */ diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index b84c144..e4e098d 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -637,11 +637,11 @@ def collect_decimal(info_add): def collect_testcapi(info_add): try: - import _testcapi + import _testinternalcapi except ImportError: return - call_func(info_add, 'pymem.allocator', _testcapi, 'pymem_getallocatorsname') + call_func(info_add, 'pymem.allocator', _testinternalcapi, 'pymem_getallocatorsname') def collect_resource(info_add): diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 9429800..e88b7c8 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -717,11 +717,11 @@ class CmdLineTest(unittest.TestCase): # Memory allocator debug hooks try: - import _testcapi + import _testinternalcapi except ImportError: pass else: - code = "import _testcapi; print(_testcapi.pymem_getallocatorsname())" + code = "import _testinternalcapi; print(_testinternalcapi.pymem_getallocatorsname())" with support.SuppressCrashReport(): out = self.run_xdev("-c", code, check_exitcode=False) if support.with_pymalloc(): @@ -783,7 +783,7 @@ class CmdLineTest(unittest.TestCase): self.assertEqual(out, expected_filters) def check_pythonmalloc(self, env_var, name): - code = 'import _testcapi; print(_testcapi.pymem_getallocatorsname())' + code = 'import _testinternalcapi; print(_testinternalcapi.pymem_getallocatorsname())' env = dict(os.environ) env.pop('PYTHONDEVMODE', None) if env_var is not None: diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 37f75ad..7861fa2 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -960,12 +960,12 @@ class SysModuleTest(unittest.TestCase): "sys.getallocatedblocks unavailable on this build") def test_getallocatedblocks(self): try: - import _testcapi + import _testinternalcapi except ImportError: with_pymalloc = support.with_pymalloc() else: try: - alloc_name = _testcapi.pymem_getallocatorsname() + alloc_name = _testinternalcapi.pymem_getallocatorsname() except RuntimeError as exc: # "cannot get allocators name" (ex: tracemalloc is used) with_pymalloc = True diff --git a/Modules/_testcapi/mem.c b/Modules/_testcapi/mem.c index 0b2b1cd..ef9234d 100644 --- a/Modules/_testcapi/mem.c +++ b/Modules/_testcapi/mem.c @@ -441,17 +441,6 @@ test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored)) } static PyObject * -test_pymem_getallocatorsname(PyObject *self, PyObject *args) -{ - const char *name = _PyMem_GetCurrentAllocatorName(); - if (name == NULL) { - PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name"); - return NULL; - } - return PyUnicode_FromString(name); -} - -static PyObject * test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored)) { return test_setallocators(PYMEM_DOMAIN_RAW); @@ -589,7 +578,6 @@ tracemalloc_untrack(PyObject *self, PyObject *args) static PyMethodDef test_methods[] = { {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS}, {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS}, - {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS}, {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS}, {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS}, {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS, diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index e2be9a1..98902d61 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1519,6 +1519,18 @@ check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) } +static PyObject * +test_pymem_getallocatorsname(PyObject *self, PyObject *args) +{ + const char *name = _PyMem_GetCurrentAllocatorName(); + if (name == NULL) { + PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name"); + return NULL; + } + return PyUnicode_FromString(name); +} + + static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -1581,6 +1593,7 @@ static PyMethodDef module_functions[] = { {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS}, {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS}, + {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Modules/getpath.c b/Modules/getpath.c index abe7c3c..76e3c7e 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1,11 +1,13 @@ /* Return the initial module search path. */ #include "Python.h" +#include "pycore_fileutils.h" // _Py_abspath() +#include "pycore_initconfig.h" // _PyStatus_EXCEPTION() +#include "pycore_pathconfig.h" // _PyPathConfig_ReadGlobal() +#include "pycore_pymem.h" // _PyMem_RawWcsdup() + #include "marshal.h" // PyMarshal_ReadObjectFromString #include "osdefs.h" // DELIM -#include "pycore_initconfig.h" -#include "pycore_fileutils.h" -#include "pycore_pathconfig.h" #include <wchar.h> #ifdef MS_WINDOWS |