diff options
| author | Victor Stinner <victor.stinner@gmail.com> | 2017-01-18 14:01:12 +0100 | 
|---|---|---|
| committer | Victor Stinner <victor.stinner@gmail.com> | 2017-01-18 14:01:12 +0100 | 
| commit | 250e4b0063fab35770719b64d1e36209c4aa2596 (patch) | |
| tree | 006880f6d8b2295f0aa7d4520a94ab9036a9baed /Objects/methodobject.c | |
| parent | 7612f1e36a90029a5abf14b9063dbb800340eff7 (diff) | |
| download | cpython-git-250e4b0063fab35770719b64d1e36209c4aa2596.tar.gz | |
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 054cf530e4..19d2971b9b 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;  } | 
