]> granicus.if.org Git - python/commitdiff
PyEval_CallObjectWithKeywords() uses fast call with kwargs
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 22 Aug 2016 21:26:00 +0000 (23:26 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 22 Aug 2016 21:26:00 +0000 (23:26 +0200)
Issue #27809. _PyObject_FastCallDict() now supports keyword arguments, and so
the args==NULL fast-path can also be used when kwargs is not NULL.

Python/ceval.c

index 9c6593791f10e0b27d67ec008922936409b9c846..fd456ceed1ec5f9a209757b8d0c99b2b3fc6a3c2 100644 (file)
@@ -4590,30 +4590,22 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *args, PyObject *kwargs)
 #endif
 
     if (args == NULL) {
-        if (kwargs == NULL) {
-            return _PyObject_CallNoArg(func);
-        }
-
-        args = PyTuple_New(0);
-        if (args == NULL)
-            return NULL;
+        return _PyObject_FastCallDict(func, NULL, 0, kwargs);
     }
-    else if (!PyTuple_Check(args)) {
+
+    if (!PyTuple_Check(args)) {
         PyErr_SetString(PyExc_TypeError,
                         "argument list must be a tuple");
         return NULL;
     }
-    else {
-        Py_INCREF(args);
-    }
 
     if (kwargs != NULL && !PyDict_Check(kwargs)) {
         PyErr_SetString(PyExc_TypeError,
                         "keyword list must be a dictionary");
-        Py_DECREF(args);
         return NULL;
     }
 
+    Py_INCREF(args);
     result = PyObject_Call(func, args, kwargs);
     Py_DECREF(args);