From 260cb0bfecf26cc82982752dfaa4cd0f245e71b3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 24 Jul 2023 20:13:26 +0200 Subject: [PATCH] gh-106320: Remove private _PyMem API 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. --- Include/cpython/pymem.h | 12 ------------ Include/internal/pycore_pymem.h | 14 +++++++++++++- Lib/test/pythoninfo.py | 4 ++-- Lib/test/test_cmd_line.py | 6 +++--- Lib/test/test_sys.py | 4 ++-- Modules/_testcapi/mem.c | 12 ------------ Modules/_testinternalcapi.c | 13 +++++++++++++ Modules/getpath.c | 8 +++++--- 8 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Include/cpython/pymem.h b/Include/cpython/pymem.h index d1054d76520b9a..b75f1c4d2425dd 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 c2f03254bb8760..0e53e6650d1811 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 b84c14400d42f0..e4e098dd84cfb9 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 94298003063593..e88b7c8572d9e8 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -717,11 +717,11 @@ def test_xdev(self): # 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 @@ def test_warnings_filter_precedence(self): 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 37f75ad54387a0..7861fa26c8007e 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -960,12 +960,12 @@ def test_debugmallocstats(self): "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 0b2b1cd31fb0a1..ef9234d7f8955f 100644 --- a/Modules/_testcapi/mem.c +++ b/Modules/_testcapi/mem.c @@ -440,17 +440,6 @@ test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } -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)) { @@ -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 e2be9a130217d6..98902d6134be8d 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 abe7c3c3c30a9a..76e3c7e65249f4 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 #ifdef MS_WINDOWS