From 7bfb42d5b7721ca26e33050d025fec5c43c00058 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 5 Dec 2016 17:04:32 +0100 Subject: [PATCH] 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. --- Include/abstract.h | 5 +---- Modules/_asynciomodule.c | 6 +++--- Modules/_collectionsmodule.c | 3 ++- Modules/_elementtree.c | 11 ++++++----- Modules/_pickle.c | 2 +- Modules/_sre.c | 2 +- Modules/pyexpat.c | 2 +- Objects/abstract.c | 2 +- Objects/fileobject.c | 2 +- Objects/genobject.c | 2 +- Objects/typeobject.c | 6 +++--- Python/_warnings.c | 2 +- Python/codecs.c | 2 +- Python/errors.c | 2 +- Python/sysmodule.c | 2 +- 15 files changed, 25 insertions(+), 26 deletions(-) diff --git a/Include/abstract.h b/Include/abstract.h index 900ef23932e..3dfac6577ac 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -338,10 +338,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ _PyObject_FastCallDict((func), (args), (nargs), NULL) #define _PyObject_CallNoArg(func) \ - _PyObject_FastCall((func), NULL, 0) - -#define _PyObject_CallArg1(func, arg) \ - _PyObject_FastCall((func), (PyObject **)&(arg), 1) + _PyObject_FastCallDict((func), NULL, 0, NULL) PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend(PyObject *func, PyObject *obj, PyObject *args, diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 4e8f74a3c94..ea02a5e9c09 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -257,7 +257,7 @@ future_get_result(FutureObj *fut, PyObject **result) return -1; } - exc = _PyObject_CallArg1(asyncio_InvalidStateError, msg); + exc = PyObject_CallFunctionObjArgs(asyncio_InvalidStateError, msg, NULL); Py_DECREF(msg); if (exc == NULL) { return -1; @@ -835,7 +835,7 @@ FutureObj_finalize(FutureObj *fut) func = _PyObject_GetAttrId(fut->fut_loop, &PyId_call_exception_handler); if (func != NULL) { - res = _PyObject_CallArg1(func, context); + res = PyObject_CallFunctionObjArgs(func, context, NULL); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -1731,7 +1731,7 @@ TaskObj_finalize(TaskObj *task) func = _PyObject_GetAttrId(task->task_loop, &PyId_call_exception_handler); if (func != NULL) { - res = _PyObject_CallArg1(func, context); + res = PyObject_CallFunctionObjArgs(func, context, NULL); if (res == NULL) { PyErr_WriteUnraisable(func); } diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index cbf5b50cc95..b8b7584282a 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -538,7 +538,8 @@ deque_copy(PyObject *deque) return NULL; } if (old_deque->maxlen < 0) - return _PyObject_CallArg1((PyObject *)(Py_TYPE(deque)), deque); + return PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)), + deque, NULL); else return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi", deque, old_deque->maxlen, NULL); diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 3837ff125a1..2e0cda7bcbf 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2831,7 +2831,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column, if (errmsg == NULL) return; - error = _PyObject_CallArg1(st->parseerror_obj, errmsg); + error = PyObject_CallFunctionObjArgs(st->parseerror_obj, errmsg, NULL); Py_DECREF(errmsg); if (!error) return; @@ -2894,7 +2894,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, (TreeBuilderObject*) self->target, value ); else if (self->handle_data) - res = _PyObject_CallArg1(self->handle_data, value); + res = PyObject_CallFunctionObjArgs(self->handle_data, value, NULL); else res = NULL; Py_XDECREF(res); @@ -3004,7 +3004,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in, /* shortcut */ res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); else if (self->handle_data) - res = _PyObject_CallArg1(self->handle_data, data); + res = PyObject_CallFunctionObjArgs(self->handle_data, data, NULL); else res = NULL; @@ -3031,7 +3031,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) else if (self->handle_end) { tag = makeuniversal(self, tag_in); if (tag) { - res = _PyObject_CallArg1(self->handle_end, tag); + res = PyObject_CallFunctionObjArgs(self->handle_end, tag, NULL); Py_DECREF(tag); } } @@ -3090,7 +3090,8 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) if (self->handle_comment) { comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict"); if (comment) { - res = _PyObject_CallArg1(self->handle_comment, comment); + res = PyObject_CallFunctionObjArgs(self->handle_comment, + comment, NULL); Py_XDECREF(res); Py_DECREF(comment); } diff --git a/Modules/_pickle.c b/Modules/_pickle.c index d6d5cca10fa..78c206e814d 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -346,7 +346,7 @@ _Pickle_FastCall(PyObject *func, PyObject *obj) { PyObject *result; - result = _PyObject_CallArg1(func, obj); + result = PyObject_CallFunctionObjArgs(func, obj, NULL); Py_DECREF(obj); return result; } diff --git a/Modules/_sre.c b/Modules/_sre.c index 6e149011017..438849483f3 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1157,7 +1157,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, match = pattern_new_match(self, &state, 1); if (!match) goto error; - item = _PyObject_CallArg1(filter, match); + item = PyObject_CallFunctionObjArgs(filter, match, NULL); Py_DECREF(match); if (!item) goto error; diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 541eee7beb0..ece4d160eb4 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -119,7 +119,7 @@ set_error(xmlparseobject *self, enum XML_Error code) XML_ErrorString(code), lineno, column); if (buffer == NULL) return NULL; - err = _PyObject_CallArg1(ErrorObject, buffer); + err = PyObject_CallFunctionObjArgs(ErrorObject, buffer, NULL); Py_DECREF(buffer); if ( err != NULL && set_error_attr(err, "code", code) diff --git a/Objects/abstract.c b/Objects/abstract.c index beb12c98f6a..a6a58db5910 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2496,7 +2496,7 @@ call_function_tail(PyObject *callable, PyObject *args) assert(args != NULL); if (!PyTuple_Check(args)) { - result = _PyObject_CallArg1(callable, args); + result = PyObject_CallFunctionObjArgs(callable, args, NULL); } else { result = PyObject_Call(callable, args, NULL); diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 32f8a8983ef..fcdb5fd0a44 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -146,7 +146,7 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags) Py_DECREF(writer); return -1; } - result = _PyObject_CallArg1(writer, value); + result = PyObject_CallFunctionObjArgs(writer, value, NULL); Py_DECREF(value); Py_DECREF(writer); if (result == NULL) diff --git a/Objects/genobject.c b/Objects/genobject.c index bd7873bceb7..59f53cefcb3 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1341,7 +1341,7 @@ async_gen_init_hooks(PyAsyncGenObject *o) PyObject *res; Py_INCREF(firstiter); - res = _PyObject_CallArg1(firstiter, o); + res = PyObject_CallFunctionObjArgs(firstiter, o, NULL); Py_DECREF(firstiter); if (res == NULL) { return 1; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 0af153481a6..d9699ef1ba0 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5873,7 +5873,7 @@ slot_sq_item(PyObject *self, Py_ssize_t i) goto error; } - retval = _PyObject_CallArg1(func, ival); + retval = PyObject_CallFunctionObjArgs(func, ival, NULL); Py_DECREF(func); Py_DECREF(ival); return retval; @@ -5914,7 +5914,7 @@ slot_sq_contains(PyObject *self, PyObject *value) return -1; } if (func != NULL) { - res = _PyObject_CallArg1(func, value); + res = PyObject_CallFunctionObjArgs(func, value, NULL); Py_DECREF(func); if (res != NULL) { result = PyObject_IsTrue(res); @@ -6284,7 +6284,7 @@ slot_tp_richcompare(PyObject *self, PyObject *other, int op) PyErr_Clear(); Py_RETURN_NOTIMPLEMENTED; } - res = _PyObject_CallArg1(func, other); + res = PyObject_CallFunctionObjArgs(func, other, NULL); Py_DECREF(func); return res; } diff --git a/Python/_warnings.c b/Python/_warnings.c index cecc8ad5881..189bf704317 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -476,7 +476,7 @@ warn_explicit(PyObject *category, PyObject *message, } else { text = message; - message = _PyObject_CallArg1(category, message); + message = PyObject_CallFunctionObjArgs(category, message, NULL); if (message == NULL) goto cleanup; } diff --git a/Python/codecs.c b/Python/codecs.c index 55f6ca85e3c..688a40bd6ff 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -322,7 +322,7 @@ PyObject *codec_getstreamcodec(const char *encoding, if (errors != NULL) streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors); else - streamcodec = _PyObject_CallArg1(codeccls, stream); + streamcodec = PyObject_CallFunctionObjArgs(codeccls, stream, NULL); Py_DECREF(codecs); return streamcodec; } diff --git a/Python/errors.c b/Python/errors.c index 01304d25a1a..74283c9be33 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -62,7 +62,7 @@ _PyErr_CreateException(PyObject *exception, PyObject *value) return PyObject_Call(exception, value, NULL); } else { - return _PyObject_CallArg1(exception, value); + return PyObject_CallFunctionObjArgs(exception, value, NULL); } } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 98a66741f59..416a02b5466 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2325,7 +2325,7 @@ sys_pyfile_write_unicode(PyObject *unicode, PyObject *file) if (writer == NULL) goto error; - result = _PyObject_CallArg1(writer, unicode); + result = PyObject_CallFunctionObjArgs(writer, unicode, NULL); if (result == NULL) { goto error; } else {