From 2b635971e7fedc06b8a12d467a8b717c9752f4a4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 9 Dec 2016 00:38:16 +0100 Subject: [PATCH] build_struct_time() uses Py_BuildValue() Issue #28915: Avoid calling _PyObject_CallMethodId() with "(...)" format to avoid the creation of a temporary tuple: use Py_BuildValue() with _PyObject_CallMethodIdObjArgs(). --- Modules/_datetimemodule.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 0999218693c..77caba1ddce 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1385,21 +1385,30 @@ static PyObject * build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag) { PyObject *time; - PyObject *result = NULL; + PyObject *result; + _Py_IDENTIFIER(struct_time); + PyObject *args; + time = PyImport_ImportModuleNoBlock("time"); - if (time != NULL) { - _Py_IDENTIFIER(struct_time); - - result = _PyObject_CallMethodId(time, &PyId_struct_time, - "((iiiiiiiii))", - y, m, d, - hh, mm, ss, - weekday(y, m, d), - days_before_month(y, m) + d, - dstflag); - Py_DECREF(time); + if (time == NULL) { + return NULL; } + + args = Py_BuildValue("iiiiiiiii", + y, m, d, + hh, mm, ss, + weekday(y, m, d), + days_before_month(y, m) + d, + dstflag); + if (args == NULL) { + Py_DECREF(time); + return NULL; + } + + result = _PyObject_CallMethodIdObjArgs(time, &PyId_struct_time, + args, NULL); + Py_DECREF(time); return result; }