From 72dccde884d89586b0cafd990675b7e21720a81f Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 16 Feb 2017 09:26:01 +0900 Subject: [PATCH] bpo-29548: Fix some inefficient call API usage (GH-97) --- Modules/_testcapimodule.c | 2 +- Modules/_threadmodule.c | 3 +-- Modules/_tkinter.c | 11 ++++------- Objects/abstract.c | 2 +- Objects/fileobject.c | 41 +++++++++++++-------------------------- Objects/typeobject.c | 2 +- Objects/weakrefobject.c | 2 +- 7 files changed, 23 insertions(+), 40 deletions(-) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 03a4acbc798..11015df011a 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3070,7 +3070,7 @@ slot_tp_del(PyObject *self) /* Execute __del__ method, if any. */ del = _PyObject_LookupSpecial(self, &PyId___tp_del__); if (del != NULL) { - res = PyEval_CallObject(del, NULL); + res = _PyObject_CallNoArg(del); if (res == NULL) PyErr_WriteUnraisable(del); else diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 8be9306d6a1..bf25a19eb25 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -994,8 +994,7 @@ t_bootstrap(void *boot_raw) _PyThreadState_Init(tstate); PyEval_AcquireThread(tstate); nb_threads++; - res = PyEval_CallObjectWithKeywords( - boot->func, boot->args, boot->keyw); + res = PyObject_Call(boot->func, boot->args, boot->keyw); if (res == NULL) { if (PyErr_ExceptionMatches(PyExc_SystemExit)) PyErr_Clear(); diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index f69a4dfed9b..1abc0e225e9 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -2417,7 +2417,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ } PyTuple_SET_ITEM(arg, i, s); } - res = PyEval_CallObject(func, arg); + res = PyObject_Call(func, arg, NULL); Py_DECREF(arg); if (res == NULL) @@ -2661,16 +2661,13 @@ static void FileHandler(ClientData clientData, int mask) { FileHandler_ClientData *data = (FileHandler_ClientData *)clientData; - PyObject *func, *file, *arg, *res; + PyObject *func, *file, *res; ENTER_PYTHON func = data->func; file = data->file; - arg = Py_BuildValue("(Oi)", file, (long) mask); - res = PyEval_CallObject(func, arg); - Py_DECREF(arg); - + res = PyObject_CallFunction(func, "Oi", file, mask); if (res == NULL) { errorInCmd = 1; PyErr_Fetch(&excInCmd, &valInCmd, &trbInCmd); @@ -2840,7 +2837,7 @@ TimerHandler(ClientData clientData) ENTER_PYTHON - res = PyEval_CallObject(func, NULL); + res = _PyObject_CallNoArg(func); Py_DECREF(func); Py_DECREF(v); /* See Tktt_New() */ diff --git a/Objects/abstract.c b/Objects/abstract.c index 589d9e8fd9b..4a75b92e1d0 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1329,7 +1329,7 @@ PyNumber_Long(PyObject *o) } trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__); if (trunc_func) { - result = PyEval_CallObject(trunc_func, NULL); + result = _PyObject_CallNoArg(trunc_func); Py_DECREF(trunc_func); if (result == NULL || PyLong_CheckExact(result)) { return result; diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 3c3d46da512..0f71944d526 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -49,6 +49,7 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c PyObject * PyFile_GetLine(PyObject *f, int n) { + _Py_IDENTIFIER(readline); PyObject *result; if (f == NULL) { @@ -56,32 +57,18 @@ PyFile_GetLine(PyObject *f, int n) return NULL; } - { - PyObject *reader; - PyObject *args; - _Py_IDENTIFIER(readline); - - reader = _PyObject_GetAttrId(f, &PyId_readline); - if (reader == NULL) - return NULL; - if (n <= 0) - args = PyTuple_New(0); - else - args = Py_BuildValue("(i)", n); - if (args == NULL) { - Py_DECREF(reader); - return NULL; - } - result = PyEval_CallObject(reader, args); - Py_DECREF(reader); - Py_DECREF(args); - if (result != NULL && !PyBytes_Check(result) && - !PyUnicode_Check(result)) { - Py_DECREF(result); - result = NULL; - PyErr_SetString(PyExc_TypeError, - "object.readline() returned non-string"); - } + if (n <= 0) { + result = _PyObject_CallMethodIdObjArgs(f, &PyId_readline, NULL); + } + else { + result = _PyObject_CallMethodId(f, &PyId_readline, "i", n); + } + if (result != NULL && !PyBytes_Check(result) && + !PyUnicode_Check(result)) { + Py_DECREF(result); + result = NULL; + PyErr_SetString(PyExc_TypeError, + "object.readline() returned non-string"); } if (n < 0 && result != NULL && PyBytes_Check(result)) { @@ -197,7 +184,7 @@ PyObject_AsFileDescriptor(PyObject *o) } else if ((meth = _PyObject_GetAttrId(o, &PyId_fileno)) != NULL) { - PyObject *fno = PyEval_CallObject(meth, NULL); + PyObject *fno = _PyObject_CallNoArg(meth); Py_DECREF(meth); if (fno == NULL) return -1; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index f18a79526b2..18b67c83258 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4348,7 +4348,7 @@ _common_reduce(PyObject *self, int proto) if (!copyreg) return NULL; - res = PyEval_CallMethod(copyreg, "_reduce_ex", "(Oi)", self, proto); + res = PyObject_CallMethod(copyreg, "_reduce_ex", "Oi", self, proto); Py_DECREF(copyreg); return res; diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index ab6b2352555..d12db9185d8 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -461,7 +461,7 @@ proxy_checkref(PyWeakReference *proxy) WRAP_BINARY(proxy_getattr, PyObject_GetAttr) WRAP_UNARY(proxy_str, PyObject_Str) -WRAP_TERNARY(proxy_call, PyEval_CallObjectWithKeywords) +WRAP_TERNARY(proxy_call, PyObject_Call) static PyObject * proxy_repr(PyWeakReference *proxy)