changeset: 105541:49a7fdc0d40a user: Victor Stinner date: Fri Dec 09 00:38:53 2016 +0100 files: Modules/timemodule.c description: 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 -r 032cbdb596fe -r 49a7fdc0d40a Modules/timemodule.c --- a/Modules/timemodule.c Fri Dec 09 00:38:16 2016 +0100 +++ b/Modules/timemodule.c Fri Dec 09 00:38:53 2016 +0100 @@ -717,16 +717,22 @@ 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; }