]> granicus.if.org Git - python/commitdiff
Issue #27809: methodcaller_reduce() uses fast call
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 22 Aug 2016 22:23:23 +0000 (00:23 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 22 Aug 2016 22:23:23 +0000 (00:23 +0200)
Modules/_operator.c

index dfff1d2faa1400e90e05b66bd60b8673ec569107..fb8eafc6793d703b7f9004e30ccc70f93e95fbfa 100644 (file)
@@ -1111,6 +1111,8 @@ methodcaller_reduce(methodcallerobject *mc)
         PyObject *functools;
         PyObject *partial;
         PyObject *constructor;
+        PyObject *newargs[2];
+
         _Py_IDENTIFIER(partial);
         functools = PyImport_ImportModule("functools");
         if (!functools)
@@ -1119,17 +1121,11 @@ methodcaller_reduce(methodcallerobject *mc)
         Py_DECREF(functools);
         if (!partial)
             return NULL;
-        newargs = PyTuple_New(2);
-        if (newargs == NULL) {
-            Py_DECREF(partial);
-            return NULL;
-        }
-        Py_INCREF(Py_TYPE(mc));
-        PyTuple_SET_ITEM(newargs, 0, (PyObject *)Py_TYPE(mc));
-        Py_INCREF(mc->name);
-        PyTuple_SET_ITEM(newargs, 1, mc->name);
-        constructor = PyObject_Call(partial, newargs, mc->kwds);
-        Py_DECREF(newargs);
+
+        newargs[0] = (PyObject *)Py_TYPE(mc);
+        newargs[1] = mc->name;
+        constructor = _PyObject_FastCallDict(partial, newargs, 2, mc->kwds);
+
         Py_DECREF(partial);
         return Py_BuildValue("NO", constructor, mc->args);
     }