[Python-checkins] cpython: Fix _PyMethodDef_RawFastCallDict() argument parsing

victor.stinner python-checkins at python.org
Wed Jan 18 08:22:57 EST 2017


https://hg.python.org/cpython/rev/a241817424e5
changeset:   106216:a241817424e5
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Jan 18 14:01:12 2017 +0100
summary:
  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()

files:
  Objects/methodobject.c |  30 ++++++++++++++++--------------
  1 files changed, 16 insertions(+), 14 deletions(-)


diff --git a/Objects/methodobject.c b/Objects/methodobject.c
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -159,30 +159,31 @@
     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 @@
 
     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 @@
 
 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;
 }
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list