summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-07-24 18:48:06 (GMT)
committerGitHub <noreply@github.com>2023-07-24 18:48:06 (GMT)
commit307186704d8327d6c67b0650e49b125758a25bbc (patch)
treebc16b1afa6e77c8d5f9c9b276a4f0f6483c950de
parentd27eb1e406a8789d9eaba6dbfed5c2e5abe294fd (diff)
downloadcpython-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.h12
-rw-r--r--Include/internal/pycore_pymem.h14
-rw-r--r--Lib/test/pythoninfo.py4
-rw-r--r--Lib/test/test_cmd_line.py6
-rw-r--r--Lib/test/test_sys.py4
-rw-r--r--Modules/_testcapi/mem.c12
-rw-r--r--Modules/_testinternalcapi.c13
-rw-r--r--Modules/getpath.c8
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