diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-01-18 13:01:12 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2017-01-18 13:01:12 (GMT) |
commit | 250e4b0063fab35770719b64d1e36209c4aa2596 (patch) | |
tree | 006880f6d8b2295f0aa7d4520a94ab9036a9baed /Objects/methodobject.c | |
parent | 7612f1e36a90029a5abf14b9063dbb800340eff7 (diff) | |
download | cpython-250e4b0063fab35770719b64d1e36209c4aa2596.zip cpython-250e4b0063fab35770719b64d1e36209c4aa2596.tar.gz cpython-250e4b0063fab35770719b64d1e36209c4aa2596.tar.bz2 |
Fix _PyMethodDef_RawFastCallDict() argument parsing
Issue #29259:
* Move also the !PyErr_Occurred() assertion to the top, similar to
other functions.
* Fix also comment/error messages: the function was renamed to
_PyMethodDef_RawFastCallDict()
Diffstat (limited to 'Objects/methodobject.c')
-rw-r--r-- | Objects/methodobject.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 054cf53..19d2971 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -159,30 +159,31 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, PyObject **arg PyObject *result; int flags; + /* _PyMethodDef_RawFastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + assert(method != NULL); assert(nargs >= 0); assert(nargs == 0 || args != NULL); assert(kwargs == NULL || PyDict_Check(kwargs)); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - meth = method->ml_meth; flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST); switch (flags) { case METH_NOARGS: - if (nargs != 0) { - goto no_keyword_error; - } + if (nargs != 0) { + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%zd given)", + method->ml_name, nargs); + return NULL; + } if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", - method->ml_name); - return NULL; + goto no_keyword_error; } result = (*meth) (self, NULL); @@ -249,7 +250,7 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, PyObject **arg default: PyErr_SetString(PyExc_SystemError, - "Bad call flags in PyCFunction_Call. " + "Bad call flags in _PyMethodDef_RawFastCallDict. " "METH_OLDARGS is no longer supported!"); return NULL; } @@ -258,8 +259,9 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, PyObject **arg no_keyword_error: PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", - method->ml_name, nargs); + "%.200s() takes no keyword arguments", + method->ml_name, nargs); + return NULL; } |