From: Victor Stinner Date: Thu, 8 Dec 2016 23:38:53 +0000 (+0100) Subject: time_strptime() uses PyObject_Call() X-Git-Tag: v3.7.0a1~1798 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dbe28d26b46adb7ed3d6731bc148fc095ff43bba;p=python time_strptime() uses PyObject_Call() Issue #28915: Use PyObject_Call() to pass a tuple of positional arguments, instead of relying on _PyObject_CallMethodId() weird behaviour to unpack the tuple. --- diff --git a/Modules/timemodule.c b/Modules/timemodule.c index db0ab5805c..e9edbf3d3f 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -717,16 +717,22 @@ is not present, current time as returned by localtime() is used.\n\ static PyObject * time_strptime(PyObject *self, PyObject *args) { - PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime"); - PyObject *strptime_result; + PyObject *module, *func, *result; _Py_IDENTIFIER(_strptime_time); - if (!strptime_module) + module = PyImport_ImportModuleNoBlock("_strptime"); + if (!module) return NULL; - strptime_result = _PyObject_CallMethodId(strptime_module, - &PyId__strptime_time, "O", args); - Py_DECREF(strptime_module); - return strptime_result; + + func = _PyObject_GetAttrId(module, &PyId__strptime_time); + Py_DECREF(module); + if (!func) { + return NULL; + } + + result = PyObject_Call(func, args, NULL); + Py_DECREF(func); + return result; }