Issue #28858: Remove _PyObject_CallArg1() macro

Replace
   _PyObject_CallArg1(func, arg)
with
   PyObject_CallFunctionObjArgs(func, arg, NULL)

Using the _PyObject_CallArg1() macro increases the usage of the C stack, which
was unexpected and unwanted. PyObject_CallFunctionObjArgs() doesn't have this
issue.
This commit is contained in:
Victor Stinner 2016-12-05 17:04:32 +01:00
parent d77e5b7211
commit 7bfb42d5b7
15 changed files with 25 additions and 26 deletions

View File

@ -338,10 +338,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
_PyObject_FastCallDict((func), (args), (nargs), NULL) _PyObject_FastCallDict((func), (args), (nargs), NULL)
#define _PyObject_CallNoArg(func) \ #define _PyObject_CallNoArg(func) \
_PyObject_FastCall((func), NULL, 0) _PyObject_FastCallDict((func), NULL, 0, NULL)
#define _PyObject_CallArg1(func, arg) \
_PyObject_FastCall((func), (PyObject **)&(arg), 1)
PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend(PyObject *func, PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend(PyObject *func,
PyObject *obj, PyObject *args, PyObject *obj, PyObject *args,

View File

@ -257,7 +257,7 @@ future_get_result(FutureObj *fut, PyObject **result)
return -1; return -1;
} }
exc = _PyObject_CallArg1(asyncio_InvalidStateError, msg); exc = PyObject_CallFunctionObjArgs(asyncio_InvalidStateError, msg, NULL);
Py_DECREF(msg); Py_DECREF(msg);
if (exc == NULL) { if (exc == NULL) {
return -1; return -1;
@ -835,7 +835,7 @@ FutureObj_finalize(FutureObj *fut)
func = _PyObject_GetAttrId(fut->fut_loop, &PyId_call_exception_handler); func = _PyObject_GetAttrId(fut->fut_loop, &PyId_call_exception_handler);
if (func != NULL) { if (func != NULL) {
res = _PyObject_CallArg1(func, context); res = PyObject_CallFunctionObjArgs(func, context, NULL);
if (res == NULL) { if (res == NULL) {
PyErr_WriteUnraisable(func); PyErr_WriteUnraisable(func);
} }
@ -1731,7 +1731,7 @@ TaskObj_finalize(TaskObj *task)
func = _PyObject_GetAttrId(task->task_loop, &PyId_call_exception_handler); func = _PyObject_GetAttrId(task->task_loop, &PyId_call_exception_handler);
if (func != NULL) { if (func != NULL) {
res = _PyObject_CallArg1(func, context); res = PyObject_CallFunctionObjArgs(func, context, NULL);
if (res == NULL) { if (res == NULL) {
PyErr_WriteUnraisable(func); PyErr_WriteUnraisable(func);
} }

View File

@ -538,7 +538,8 @@ deque_copy(PyObject *deque)
return NULL; return NULL;
} }
if (old_deque->maxlen < 0) if (old_deque->maxlen < 0)
return _PyObject_CallArg1((PyObject *)(Py_TYPE(deque)), deque); return PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)),
deque, NULL);
else else
return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi", return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
deque, old_deque->maxlen, NULL); deque, old_deque->maxlen, NULL);

View File

@ -2831,7 +2831,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column,
if (errmsg == NULL) if (errmsg == NULL)
return; return;
error = _PyObject_CallArg1(st->parseerror_obj, errmsg); error = PyObject_CallFunctionObjArgs(st->parseerror_obj, errmsg, NULL);
Py_DECREF(errmsg); Py_DECREF(errmsg);
if (!error) if (!error)
return; return;
@ -2894,7 +2894,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
(TreeBuilderObject*) self->target, value (TreeBuilderObject*) self->target, value
); );
else if (self->handle_data) else if (self->handle_data)
res = _PyObject_CallArg1(self->handle_data, value); res = PyObject_CallFunctionObjArgs(self->handle_data, value, NULL);
else else
res = NULL; res = NULL;
Py_XDECREF(res); Py_XDECREF(res);
@ -3004,7 +3004,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
/* shortcut */ /* shortcut */
res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); res = treebuilder_handle_data((TreeBuilderObject*) self->target, data);
else if (self->handle_data) else if (self->handle_data)
res = _PyObject_CallArg1(self->handle_data, data); res = PyObject_CallFunctionObjArgs(self->handle_data, data, NULL);
else else
res = NULL; res = NULL;
@ -3031,7 +3031,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
else if (self->handle_end) { else if (self->handle_end) {
tag = makeuniversal(self, tag_in); tag = makeuniversal(self, tag_in);
if (tag) { if (tag) {
res = _PyObject_CallArg1(self->handle_end, tag); res = PyObject_CallFunctionObjArgs(self->handle_end, tag, NULL);
Py_DECREF(tag); Py_DECREF(tag);
} }
} }
@ -3090,7 +3090,8 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
if (self->handle_comment) { if (self->handle_comment) {
comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict"); comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict");
if (comment) { if (comment) {
res = _PyObject_CallArg1(self->handle_comment, comment); res = PyObject_CallFunctionObjArgs(self->handle_comment,
comment, NULL);
Py_XDECREF(res); Py_XDECREF(res);
Py_DECREF(comment); Py_DECREF(comment);
} }

View File

@ -346,7 +346,7 @@ _Pickle_FastCall(PyObject *func, PyObject *obj)
{ {
PyObject *result; PyObject *result;
result = _PyObject_CallArg1(func, obj); result = PyObject_CallFunctionObjArgs(func, obj, NULL);
Py_DECREF(obj); Py_DECREF(obj);
return result; return result;
} }

View File

@ -1157,7 +1157,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
match = pattern_new_match(self, &state, 1); match = pattern_new_match(self, &state, 1);
if (!match) if (!match)
goto error; goto error;
item = _PyObject_CallArg1(filter, match); item = PyObject_CallFunctionObjArgs(filter, match, NULL);
Py_DECREF(match); Py_DECREF(match);
if (!item) if (!item)
goto error; goto error;

View File

@ -119,7 +119,7 @@ set_error(xmlparseobject *self, enum XML_Error code)
XML_ErrorString(code), lineno, column); XML_ErrorString(code), lineno, column);
if (buffer == NULL) if (buffer == NULL)
return NULL; return NULL;
err = _PyObject_CallArg1(ErrorObject, buffer); err = PyObject_CallFunctionObjArgs(ErrorObject, buffer, NULL);
Py_DECREF(buffer); Py_DECREF(buffer);
if ( err != NULL if ( err != NULL
&& set_error_attr(err, "code", code) && set_error_attr(err, "code", code)

View File

@ -2496,7 +2496,7 @@ call_function_tail(PyObject *callable, PyObject *args)
assert(args != NULL); assert(args != NULL);
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
result = _PyObject_CallArg1(callable, args); result = PyObject_CallFunctionObjArgs(callable, args, NULL);
} }
else { else {
result = PyObject_Call(callable, args, NULL); result = PyObject_Call(callable, args, NULL);

View File

@ -146,7 +146,7 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags)
Py_DECREF(writer); Py_DECREF(writer);
return -1; return -1;
} }
result = _PyObject_CallArg1(writer, value); result = PyObject_CallFunctionObjArgs(writer, value, NULL);
Py_DECREF(value); Py_DECREF(value);
Py_DECREF(writer); Py_DECREF(writer);
if (result == NULL) if (result == NULL)

View File

@ -1341,7 +1341,7 @@ async_gen_init_hooks(PyAsyncGenObject *o)
PyObject *res; PyObject *res;
Py_INCREF(firstiter); Py_INCREF(firstiter);
res = _PyObject_CallArg1(firstiter, o); res = PyObject_CallFunctionObjArgs(firstiter, o, NULL);
Py_DECREF(firstiter); Py_DECREF(firstiter);
if (res == NULL) { if (res == NULL) {
return 1; return 1;

View File

@ -5873,7 +5873,7 @@ slot_sq_item(PyObject *self, Py_ssize_t i)
goto error; goto error;
} }
retval = _PyObject_CallArg1(func, ival); retval = PyObject_CallFunctionObjArgs(func, ival, NULL);
Py_DECREF(func); Py_DECREF(func);
Py_DECREF(ival); Py_DECREF(ival);
return retval; return retval;
@ -5914,7 +5914,7 @@ slot_sq_contains(PyObject *self, PyObject *value)
return -1; return -1;
} }
if (func != NULL) { if (func != NULL) {
res = _PyObject_CallArg1(func, value); res = PyObject_CallFunctionObjArgs(func, value, NULL);
Py_DECREF(func); Py_DECREF(func);
if (res != NULL) { if (res != NULL) {
result = PyObject_IsTrue(res); result = PyObject_IsTrue(res);
@ -6284,7 +6284,7 @@ slot_tp_richcompare(PyObject *self, PyObject *other, int op)
PyErr_Clear(); PyErr_Clear();
Py_RETURN_NOTIMPLEMENTED; Py_RETURN_NOTIMPLEMENTED;
} }
res = _PyObject_CallArg1(func, other); res = PyObject_CallFunctionObjArgs(func, other, NULL);
Py_DECREF(func); Py_DECREF(func);
return res; return res;
} }

View File

@ -476,7 +476,7 @@ warn_explicit(PyObject *category, PyObject *message,
} }
else { else {
text = message; text = message;
message = _PyObject_CallArg1(category, message); message = PyObject_CallFunctionObjArgs(category, message, NULL);
if (message == NULL) if (message == NULL)
goto cleanup; goto cleanup;
} }

View File

@ -322,7 +322,7 @@ PyObject *codec_getstreamcodec(const char *encoding,
if (errors != NULL) if (errors != NULL)
streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors); streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors);
else else
streamcodec = _PyObject_CallArg1(codeccls, stream); streamcodec = PyObject_CallFunctionObjArgs(codeccls, stream, NULL);
Py_DECREF(codecs); Py_DECREF(codecs);
return streamcodec; return streamcodec;
} }

View File

@ -62,7 +62,7 @@ _PyErr_CreateException(PyObject *exception, PyObject *value)
return PyObject_Call(exception, value, NULL); return PyObject_Call(exception, value, NULL);
} }
else { else {
return _PyObject_CallArg1(exception, value); return PyObject_CallFunctionObjArgs(exception, value, NULL);
} }
} }

View File

@ -2325,7 +2325,7 @@ sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
if (writer == NULL) if (writer == NULL)
goto error; goto error;
result = _PyObject_CallArg1(writer, unicode); result = PyObject_CallFunctionObjArgs(writer, unicode, NULL);
if (result == NULL) { if (result == NULL) {
goto error; goto error;
} else { } else {