mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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.
This commit is contained in:
parent
d27eb1e406
commit
307186704d
8 changed files with 38 additions and 35 deletions
|
@ -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_RawRealloc(void *ptr, size_t new_size);
|
||||||
PyAPI_FUNC(void) PyMem_RawFree(void *ptr);
|
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 {
|
typedef enum {
|
||||||
/* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */
|
/* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */
|
||||||
|
|
|
@ -8,8 +8,20 @@ extern "C" {
|
||||||
# error "this header requires Py_BUILD_CORE define"
|
# error "this header requires Py_BUILD_CORE define"
|
||||||
#endif
|
#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 {
|
typedef struct {
|
||||||
/* We tag each block with an API ID in order to tag API violations */
|
/* We tag each block with an API ID in order to tag API violations */
|
||||||
|
|
|
@ -637,11 +637,11 @@ def collect_decimal(info_add):
|
||||||
|
|
||||||
def collect_testcapi(info_add):
|
def collect_testcapi(info_add):
|
||||||
try:
|
try:
|
||||||
import _testcapi
|
import _testinternalcapi
|
||||||
except ImportError:
|
except ImportError:
|
||||||
return
|
return
|
||||||
|
|
||||||
call_func(info_add, 'pymem.allocator', _testcapi, 'pymem_getallocatorsname')
|
call_func(info_add, 'pymem.allocator', _testinternalcapi, 'pymem_getallocatorsname')
|
||||||
|
|
||||||
|
|
||||||
def collect_resource(info_add):
|
def collect_resource(info_add):
|
||||||
|
|
|
@ -717,11 +717,11 @@ class CmdLineTest(unittest.TestCase):
|
||||||
|
|
||||||
# Memory allocator debug hooks
|
# Memory allocator debug hooks
|
||||||
try:
|
try:
|
||||||
import _testcapi
|
import _testinternalcapi
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
code = "import _testcapi; print(_testcapi.pymem_getallocatorsname())"
|
code = "import _testinternalcapi; print(_testinternalcapi.pymem_getallocatorsname())"
|
||||||
with support.SuppressCrashReport():
|
with support.SuppressCrashReport():
|
||||||
out = self.run_xdev("-c", code, check_exitcode=False)
|
out = self.run_xdev("-c", code, check_exitcode=False)
|
||||||
if support.with_pymalloc():
|
if support.with_pymalloc():
|
||||||
|
@ -783,7 +783,7 @@ class CmdLineTest(unittest.TestCase):
|
||||||
self.assertEqual(out, expected_filters)
|
self.assertEqual(out, expected_filters)
|
||||||
|
|
||||||
def check_pythonmalloc(self, env_var, name):
|
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 = dict(os.environ)
|
||||||
env.pop('PYTHONDEVMODE', None)
|
env.pop('PYTHONDEVMODE', None)
|
||||||
if env_var is not None:
|
if env_var is not None:
|
||||||
|
|
|
@ -960,12 +960,12 @@ class SysModuleTest(unittest.TestCase):
|
||||||
"sys.getallocatedblocks unavailable on this build")
|
"sys.getallocatedblocks unavailable on this build")
|
||||||
def test_getallocatedblocks(self):
|
def test_getallocatedblocks(self):
|
||||||
try:
|
try:
|
||||||
import _testcapi
|
import _testinternalcapi
|
||||||
except ImportError:
|
except ImportError:
|
||||||
with_pymalloc = support.with_pymalloc()
|
with_pymalloc = support.with_pymalloc()
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
alloc_name = _testcapi.pymem_getallocatorsname()
|
alloc_name = _testinternalcapi.pymem_getallocatorsname()
|
||||||
except RuntimeError as exc:
|
except RuntimeError as exc:
|
||||||
# "cannot get allocators name" (ex: tracemalloc is used)
|
# "cannot get allocators name" (ex: tracemalloc is used)
|
||||||
with_pymalloc = True
|
with_pymalloc = True
|
||||||
|
|
|
@ -440,17 +440,6 @@ test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
Py_RETURN_NONE;
|
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 *
|
static PyObject *
|
||||||
test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
|
test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
{
|
{
|
||||||
|
@ -589,7 +578,6 @@ tracemalloc_untrack(PyObject *self, PyObject *args)
|
||||||
static PyMethodDef test_methods[] = {
|
static PyMethodDef test_methods[] = {
|
||||||
{"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
|
{"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
|
||||||
{"pymem_buffer_overflow", pymem_buffer_overflow, 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},
|
{"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
|
||||||
{"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
|
{"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
|
||||||
{"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
|
{"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
|
||||||
|
|
|
@ -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[] = {
|
static PyMethodDef module_functions[] = {
|
||||||
{"get_configs", get_configs, METH_NOARGS},
|
{"get_configs", get_configs, METH_NOARGS},
|
||||||
{"get_recursion_depth", get_recursion_depth, 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_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
|
||||||
{"check_pyobject_uninitialized_is_freed",
|
{"check_pyobject_uninitialized_is_freed",
|
||||||
check_pyobject_uninitialized_is_freed, METH_NOARGS},
|
check_pyobject_uninitialized_is_freed, METH_NOARGS},
|
||||||
|
{"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
/* Return the initial module search path. */
|
/* Return the initial module search path. */
|
||||||
|
|
||||||
#include "Python.h"
|
#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 "marshal.h" // PyMarshal_ReadObjectFromString
|
||||||
#include "osdefs.h" // DELIM
|
#include "osdefs.h" // DELIM
|
||||||
#include "pycore_initconfig.h"
|
|
||||||
#include "pycore_fileutils.h"
|
|
||||||
#include "pycore_pathconfig.h"
|
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue