diff options
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index dd626e5..1559456 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2607,23 +2607,30 @@ call_cfunction(PyObject *func, PyObject *arg, PyObject *kw) PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); - if (flags & METH_KEYWORDS && kw == NULL) { - static PyObject *dict = NULL; - if (dict == NULL) { - dict = PyDict_New(); - if (dict == NULL) - return NULL; + if (flags & METH_KEYWORDS) { + if (kw == NULL) { + static PyObject *dict = NULL; + if (dict == NULL) { + dict = PyDict_New(); + if (dict == NULL) + return NULL; + } + kw = dict; + Py_INCREF(dict); } - kw = dict; - Py_INCREF(dict); + return (*(PyCFunctionWithKeywords)meth)(self, arg, kw); } - if (flags & METH_VARARGS && kw == NULL) { - return (*meth)(self, arg); + if (kw != NULL && PyDict_Size(kw) != 0) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no keyword arguments", + f->m_ml->ml_name); + return NULL; } - if (flags & METH_KEYWORDS) { - return (*(PyCFunctionWithKeywords)meth)(self, arg, kw); + if (flags & METH_VARARGS) { + return (*meth)(self, arg); } if (!(flags & METH_VARARGS)) { + /* the really old style */ int size = PyTuple_GET_SIZE(arg); if (size == 1) arg = PyTuple_GET_ITEM(arg, 0); @@ -2631,12 +2638,6 @@ call_cfunction(PyObject *func, PyObject *arg, PyObject *kw) arg = NULL; return (*meth)(self, arg); } - if (kw != NULL && PyDict_Size(kw) != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", - f->m_ml->ml_name); - return NULL; - } /* should never get here ??? */ PyErr_BadInternalCall(); return NULL; |