mirror of https://github.com/python/cpython
gh-114569: Use PyMem_* APIs for most non-PyObject uses (#114574)
Fix usage in Modules, Objects, and Parser subdirectories.
This commit is contained in:
parent
d0f7f5c41d
commit
dcd28b5c35
|
@ -267,7 +267,7 @@ typedef struct {
|
||||||
LOCAL(int)
|
LOCAL(int)
|
||||||
create_extra(ElementObject* self, PyObject* attrib)
|
create_extra(ElementObject* self, PyObject* attrib)
|
||||||
{
|
{
|
||||||
self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));
|
self->extra = PyMem_Malloc(sizeof(ElementObjectExtra));
|
||||||
if (!self->extra) {
|
if (!self->extra) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -295,10 +295,11 @@ dealloc_extra(ElementObjectExtra *extra)
|
||||||
for (i = 0; i < extra->length; i++)
|
for (i = 0; i < extra->length; i++)
|
||||||
Py_DECREF(extra->children[i]);
|
Py_DECREF(extra->children[i]);
|
||||||
|
|
||||||
if (extra->children != extra->_children)
|
if (extra->children != extra->_children) {
|
||||||
PyObject_Free(extra->children);
|
PyMem_Free(extra->children);
|
||||||
|
}
|
||||||
|
|
||||||
PyObject_Free(extra);
|
PyMem_Free(extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
|
@ -495,14 +496,16 @@ element_resize(ElementObject* self, Py_ssize_t extra)
|
||||||
* "children", which needs at least 4 bytes. Although it's a
|
* "children", which needs at least 4 bytes. Although it's a
|
||||||
* false alarm always assume at least one child to be safe.
|
* false alarm always assume at least one child to be safe.
|
||||||
*/
|
*/
|
||||||
children = PyObject_Realloc(self->extra->children,
|
children = PyMem_Realloc(self->extra->children,
|
||||||
size * sizeof(PyObject*));
|
size * sizeof(PyObject*));
|
||||||
if (!children)
|
if (!children) {
|
||||||
goto nomemory;
|
goto nomemory;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
children = PyObject_Malloc(size * sizeof(PyObject*));
|
children = PyMem_Malloc(size * sizeof(PyObject*));
|
||||||
if (!children)
|
if (!children) {
|
||||||
goto nomemory;
|
goto nomemory;
|
||||||
|
}
|
||||||
/* copy existing children from static area to malloc buffer */
|
/* copy existing children from static area to malloc buffer */
|
||||||
memcpy(children, self->extra->children,
|
memcpy(children, self->extra->children,
|
||||||
self->extra->length * sizeof(PyObject*));
|
self->extra->length * sizeof(PyObject*));
|
||||||
|
@ -3044,7 +3047,7 @@ _elementtree_TreeBuilder_start_impl(TreeBuilderObject *self, PyObject *tag,
|
||||||
#define EXPAT(st, func) ((st)->expat_capi->func)
|
#define EXPAT(st, func) ((st)->expat_capi->func)
|
||||||
|
|
||||||
static XML_Memory_Handling_Suite ExpatMemoryHandler = {
|
static XML_Memory_Handling_Suite ExpatMemoryHandler = {
|
||||||
PyObject_Malloc, PyObject_Realloc, PyObject_Free};
|
PyMem_Malloc, PyMem_Realloc, PyMem_Free};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
|
|
|
@ -1122,7 +1122,7 @@ dispatch:
|
||||||
/* install new repeat context */
|
/* install new repeat context */
|
||||||
/* TODO(https://github.com/python/cpython/issues/67877): Fix this
|
/* TODO(https://github.com/python/cpython/issues/67877): Fix this
|
||||||
* potential memory leak. */
|
* potential memory leak. */
|
||||||
ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep));
|
ctx->u.rep = (SRE_REPEAT*) PyMem_Malloc(sizeof(*ctx->u.rep));
|
||||||
if (!ctx->u.rep) {
|
if (!ctx->u.rep) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
RETURN_FAILURE;
|
RETURN_FAILURE;
|
||||||
|
@ -1136,7 +1136,7 @@ dispatch:
|
||||||
state->ptr = ptr;
|
state->ptr = ptr;
|
||||||
DO_JUMP(JUMP_REPEAT, jump_repeat, pattern+pattern[0]);
|
DO_JUMP(JUMP_REPEAT, jump_repeat, pattern+pattern[0]);
|
||||||
state->repeat = ctx->u.rep->prev;
|
state->repeat = ctx->u.rep->prev;
|
||||||
PyObject_Free(ctx->u.rep);
|
PyMem_Free(ctx->u.rep);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
RETURN_ON_ERROR(ret);
|
RETURN_ON_ERROR(ret);
|
||||||
|
|
|
@ -2570,7 +2570,7 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
}
|
}
|
||||||
if (n > NUM_STACK_ELEMS) {
|
if (n > NUM_STACK_ELEMS) {
|
||||||
diffs = (double *) PyObject_Malloc(n * sizeof(double));
|
diffs = (double *) PyMem_Malloc(n * sizeof(double));
|
||||||
if (diffs == NULL) {
|
if (diffs == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
|
@ -2590,7 +2590,7 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
|
||||||
}
|
}
|
||||||
result = vector_norm(n, diffs, max, found_nan);
|
result = vector_norm(n, diffs, max, found_nan);
|
||||||
if (diffs != diffs_on_stack) {
|
if (diffs != diffs_on_stack) {
|
||||||
PyObject_Free(diffs);
|
PyMem_Free(diffs);
|
||||||
}
|
}
|
||||||
if (p_allocated) {
|
if (p_allocated) {
|
||||||
Py_DECREF(p);
|
Py_DECREF(p);
|
||||||
|
@ -2602,7 +2602,7 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
|
||||||
|
|
||||||
error_exit:
|
error_exit:
|
||||||
if (diffs != diffs_on_stack) {
|
if (diffs != diffs_on_stack) {
|
||||||
PyObject_Free(diffs);
|
PyMem_Free(diffs);
|
||||||
}
|
}
|
||||||
if (p_allocated) {
|
if (p_allocated) {
|
||||||
Py_DECREF(p);
|
Py_DECREF(p);
|
||||||
|
@ -2626,7 +2626,7 @@ math_hypot(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
|
||||||
double *coordinates = coord_on_stack;
|
double *coordinates = coord_on_stack;
|
||||||
|
|
||||||
if (nargs > NUM_STACK_ELEMS) {
|
if (nargs > NUM_STACK_ELEMS) {
|
||||||
coordinates = (double *) PyObject_Malloc(nargs * sizeof(double));
|
coordinates = (double *) PyMem_Malloc(nargs * sizeof(double));
|
||||||
if (coordinates == NULL) {
|
if (coordinates == NULL) {
|
||||||
return PyErr_NoMemory();
|
return PyErr_NoMemory();
|
||||||
}
|
}
|
||||||
|
@ -2643,13 +2643,13 @@ math_hypot(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
|
||||||
}
|
}
|
||||||
result = vector_norm(nargs, coordinates, max, found_nan);
|
result = vector_norm(nargs, coordinates, max, found_nan);
|
||||||
if (coordinates != coord_on_stack) {
|
if (coordinates != coord_on_stack) {
|
||||||
PyObject_Free(coordinates);
|
PyMem_Free(coordinates);
|
||||||
}
|
}
|
||||||
return PyFloat_FromDouble(result);
|
return PyFloat_FromDouble(result);
|
||||||
|
|
||||||
error_exit:
|
error_exit:
|
||||||
if (coordinates != coord_on_stack) {
|
if (coordinates != coord_on_stack) {
|
||||||
PyObject_Free(coordinates);
|
PyMem_Free(coordinates);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ module pyexpat
|
||||||
#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION)
|
#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION)
|
||||||
|
|
||||||
static XML_Memory_Handling_Suite ExpatMemoryHandler = {
|
static XML_Memory_Handling_Suite ExpatMemoryHandler = {
|
||||||
PyObject_Malloc, PyObject_Realloc, PyObject_Free};
|
PyMem_Malloc, PyMem_Realloc, PyMem_Free};
|
||||||
|
|
||||||
enum HandlerTypes {
|
enum HandlerTypes {
|
||||||
StartElement,
|
StartElement,
|
||||||
|
|
|
@ -132,7 +132,7 @@ PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
alloc = size + 1;
|
alloc = size + 1;
|
||||||
new->ob_bytes = PyObject_Malloc(alloc);
|
new->ob_bytes = PyMem_Malloc(alloc);
|
||||||
if (new->ob_bytes == NULL) {
|
if (new->ob_bytes == NULL) {
|
||||||
Py_DECREF(new);
|
Py_DECREF(new);
|
||||||
return PyErr_NoMemory();
|
return PyErr_NoMemory();
|
||||||
|
@ -221,17 +221,17 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logical_offset > 0) {
|
if (logical_offset > 0) {
|
||||||
sval = PyObject_Malloc(alloc);
|
sval = PyMem_Malloc(alloc);
|
||||||
if (sval == NULL) {
|
if (sval == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(sval, PyByteArray_AS_STRING(self),
|
memcpy(sval, PyByteArray_AS_STRING(self),
|
||||||
Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
|
Py_MIN((size_t)requested_size, (size_t)Py_SIZE(self)));
|
||||||
PyObject_Free(obj->ob_bytes);
|
PyMem_Free(obj->ob_bytes);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sval = PyObject_Realloc(obj->ob_bytes, alloc);
|
sval = PyMem_Realloc(obj->ob_bytes, alloc);
|
||||||
if (sval == NULL) {
|
if (sval == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -951,7 +951,7 @@ bytearray_repr(PyByteArrayObject *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
newsize += 6 + length * 4;
|
newsize += 6 + length * 4;
|
||||||
buffer = PyObject_Malloc(newsize);
|
buffer = PyMem_Malloc(newsize);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1008,7 +1008,7 @@ bytearray_repr(PyByteArrayObject *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
v = PyUnicode_FromStringAndSize(buffer, p - buffer);
|
v = PyUnicode_FromStringAndSize(buffer, p - buffer);
|
||||||
PyObject_Free(buffer);
|
PyMem_Free(buffer);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1088,7 +1088,7 @@ bytearray_dealloc(PyByteArrayObject *self)
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
}
|
}
|
||||||
if (self->ob_bytes != 0) {
|
if (self->ob_bytes != 0) {
|
||||||
PyObject_Free(self->ob_bytes);
|
PyMem_Free(self->ob_bytes);
|
||||||
}
|
}
|
||||||
Py_TYPE(self)->tp_free((PyObject *)self);
|
Py_TYPE(self)->tp_free((PyObject *)self);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3493,7 +3493,7 @@ type_new_set_doc(PyTypeObject *type)
|
||||||
|
|
||||||
// Silently truncate the docstring if it contains a null byte
|
// Silently truncate the docstring if it contains a null byte
|
||||||
Py_ssize_t size = strlen(doc_str) + 1;
|
Py_ssize_t size = strlen(doc_str) + 1;
|
||||||
char *tp_doc = (char *)PyObject_Malloc(size);
|
char *tp_doc = (char *)PyMem_Malloc(size);
|
||||||
if (tp_doc == NULL) {
|
if (tp_doc == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -4166,12 +4166,12 @@ _PyType_FromMetaclass_impl(
|
||||||
goto finally;
|
goto finally;
|
||||||
}
|
}
|
||||||
if (slot->pfunc == NULL) {
|
if (slot->pfunc == NULL) {
|
||||||
PyObject_Free(tp_doc);
|
PyMem_Free(tp_doc);
|
||||||
tp_doc = NULL;
|
tp_doc = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
size_t len = strlen(slot->pfunc)+1;
|
size_t len = strlen(slot->pfunc)+1;
|
||||||
tp_doc = PyObject_Malloc(len);
|
tp_doc = PyMem_Malloc(len);
|
||||||
if (tp_doc == NULL) {
|
if (tp_doc == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
goto finally;
|
goto finally;
|
||||||
|
@ -4501,7 +4501,7 @@ _PyType_FromMetaclass_impl(
|
||||||
Py_CLEAR(res);
|
Py_CLEAR(res);
|
||||||
}
|
}
|
||||||
Py_XDECREF(bases);
|
Py_XDECREF(bases);
|
||||||
PyObject_Free(tp_doc);
|
PyMem_Free(tp_doc);
|
||||||
Py_XDECREF(ht_name);
|
Py_XDECREF(ht_name);
|
||||||
PyMem_Free(_ht_tpname);
|
PyMem_Free(_ht_tpname);
|
||||||
return (PyObject*)res;
|
return (PyObject*)res;
|
||||||
|
@ -5099,7 +5099,7 @@ type_dealloc(PyObject *self)
|
||||||
/* A type's tp_doc is heap allocated, unlike the tp_doc slots
|
/* A type's tp_doc is heap allocated, unlike the tp_doc slots
|
||||||
* of most other objects. It's okay to cast it to char *.
|
* of most other objects. It's okay to cast it to char *.
|
||||||
*/
|
*/
|
||||||
PyObject_Free((char *)type->tp_doc);
|
PyMem_Free((char *)type->tp_doc);
|
||||||
|
|
||||||
PyHeapTypeObject *et = (PyHeapTypeObject *)type;
|
PyHeapTypeObject *et = (PyHeapTypeObject *)type;
|
||||||
Py_XDECREF(et->ht_name);
|
Py_XDECREF(et->ht_name);
|
||||||
|
|
|
@ -129,7 +129,7 @@ set_fstring_expr(struct tok_state* tok, struct token *token, char c) {
|
||||||
|
|
||||||
if (hash_detected) {
|
if (hash_detected) {
|
||||||
Py_ssize_t input_length = tok_mode->last_expr_size - tok_mode->last_expr_end;
|
Py_ssize_t input_length = tok_mode->last_expr_size - tok_mode->last_expr_end;
|
||||||
char *result = (char *)PyObject_Malloc((input_length + 1) * sizeof(char));
|
char *result = (char *)PyMem_Malloc((input_length + 1) * sizeof(char));
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ set_fstring_expr(struct tok_state* tok, struct token *token, char c) {
|
||||||
|
|
||||||
result[j] = '\0'; // Null-terminate the result string
|
result[j] = '\0'; // Null-terminate the result string
|
||||||
res = PyUnicode_DecodeUTF8(result, j, NULL);
|
res = PyUnicode_DecodeUTF8(result, j, NULL);
|
||||||
PyObject_Free(result);
|
PyMem_Free(result);
|
||||||
} else {
|
} else {
|
||||||
res = PyUnicode_DecodeUTF8(
|
res = PyUnicode_DecodeUTF8(
|
||||||
tok_mode->last_expr_buffer,
|
tok_mode->last_expr_buffer,
|
||||||
|
|
Loading…
Reference in New Issue