]> granicus.if.org Git - python/commitdiff
bpo-20627: Fix error message when keyword arguments are used (#2115)
authorSylvain <sylvain.desodt+github@gmail.com>
Thu, 15 Jun 2017 15:05:23 +0000 (17:05 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 15 Jun 2017 15:05:23 +0000 (18:05 +0300)
Lib/test/test_call.py
Modules/_hashopenssl.c
Modules/_struct.c
Python/bltinmodule.c

index f46eb2142f1daa937fc29e91b9d78ed66bf59701..ca678b9deb7250f71436f8337b25f92cebd52fd8 100644 (file)
@@ -5,6 +5,8 @@ try:
     import _testcapi
 except ImportError:
     _testcapi = None
+import struct
+import collections
 
 # The test cases here cover several paths through the function calling
 # code.  They depend on the METH_XXX flag that is used to define a C
@@ -160,6 +162,30 @@ class CFunctionCallsErrorMessages(unittest.TestCase):
         msg = r"^hasattr\(\) takes no keyword arguments$"
         self.assertRaisesRegex(TypeError, msg, hasattr, x=2)
 
+    def test_varargs6_kw(self):
+        msg = r"^getattr\(\) takes no keyword arguments$"
+        self.assertRaisesRegex(TypeError, msg, getattr, x=2)
+
+    def test_varargs7_kw(self):
+        msg = r"^next\(\) takes no keyword arguments$"
+        self.assertRaisesRegex(TypeError, msg, next, x=2)
+
+    def test_varargs8_kw(self):
+        msg = r"^pack\(\) takes no keyword arguments$"
+        self.assertRaisesRegex(TypeError, msg, struct.pack, x=2)
+
+    def test_varargs9_kw(self):
+        msg = r"^pack_into\(\) takes no keyword arguments$"
+        self.assertRaisesRegex(TypeError, msg, struct.pack_into, x=2)
+
+    def test_varargs10_kw(self):
+        msg = r"^index\(\) takes no keyword arguments$"
+        self.assertRaisesRegex(TypeError, msg, collections.deque().index, x=2)
+
+    def test_varargs11_kw(self):
+        msg = r"^pack\(\) takes no keyword arguments$"
+        self.assertRaisesRegex(TypeError, msg, struct.Struct.pack, struct.Struct(""), x=2)
+
     def test_oldargs0_1(self):
         msg = r"keys\(\) takes no arguments \(1 given\)"
         self.assertRaisesRegex(TypeError, msg, {}.keys, 0)
index c83ebae4542705aeaef77a2ffe571069940cb095..5096f93818d28ccfb8b6e84335b7a444648447e1 100644 (file)
@@ -931,11 +931,11 @@ generate_hash_name_list(void)
         Py_buffer view = { 0 }; \
         PyObject *ret_obj; \
      \
-        if (!_PyArg_ParseStack(args, nargs, "|O:" #NAME , &data_obj)) { \
+        if (!_PyArg_NoStackKeywords(#NAME, kwnames)) { \
             return NULL; \
         } \
      \
-        if (!_PyArg_NoStackKeywords(#NAME, kwnames)) { \
+        if (!_PyArg_ParseStack(args, nargs, "|O:" #NAME , &data_obj)) { \
             return NULL; \
         } \
      \
index 5b74ec5b4923b3acc05306a2c351c6485e6e00d4..46e7b4071b95a4fe50b394a4d747130887d87f22 100644 (file)
@@ -1823,6 +1823,9 @@ s_pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
     PyObject *result;
 
     /* Validate arguments. */
+    if (!_PyArg_NoStackKeywords("pack", kwnames)) {
+        return NULL;
+    }
     soself = (PyStructObject *)self;
     assert(PyStruct_Check(self));
     assert(soself->s_codes != NULL);
@@ -1832,9 +1835,6 @@ s_pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
             "pack expected %zd items for packing (got %zd)", soself->s_len, nargs);
         return NULL;
     }
-    if (!_PyArg_NoStackKeywords("pack", kwnames)) {
-        return NULL;
-    }
 
     /* Allocate a new buffer */
     result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size);
@@ -1866,6 +1866,9 @@ s_pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames
     Py_ssize_t offset;
 
     /* Validate arguments.  +1 is for the first arg as buffer. */
+    if (!_PyArg_NoStackKeywords("pack_into", kwnames)) {
+        return NULL;
+    }
     soself = (PyStructObject *)self;
     assert(PyStruct_Check(self));
     assert(soself->s_codes != NULL);
@@ -1886,9 +1889,6 @@ s_pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames
         }
         return NULL;
     }
-    if (!_PyArg_NoStackKeywords("pack_into", kwnames)) {
-        return NULL;
-    }
 
     /* Extract a writable memory buffer from the first argument */
     if (!PyArg_Parse(args[0], "w*", &buffer))
@@ -2131,6 +2131,10 @@ pack(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
     PyObject *s_object = NULL;
     PyObject *format, *result;
 
+    if (!_PyArg_NoStackKeywords("pack", kwnames)) {
+        return NULL;
+    }
+
     if (nargs == 0) {
         PyErr_SetString(PyExc_TypeError, "missing format argument");
         return NULL;
@@ -2159,6 +2163,10 @@ pack_into(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
     PyObject *s_object = NULL;
     PyObject *format, *result;
 
+    if (!_PyArg_NoStackKeywords("pack_into", kwnames)) {
+        return NULL;
+    }
+
     if (nargs == 0) {
         PyErr_SetString(PyExc_TypeError, "missing format argument");
         return NULL;
index f7690b17ff4934583803015e70d811038764b47e..d16b1b4407ac0567a519ac8f6cb481f59ffe6beb 100644 (file)
@@ -997,13 +997,13 @@ builtin_getattr(PyObject *self, PyObject **args, Py_ssize_t nargs,
     PyObject *v, *result, *dflt = NULL;
     PyObject *name;
 
-    if (!_PyArg_UnpackStack(args, nargs, "getattr", 2, 3, &v, &name, &dflt))
-        return NULL;
-
     if (!_PyArg_NoStackKeywords("getattr", kwnames)) {
         return NULL;
     }
 
+    if (!_PyArg_UnpackStack(args, nargs, "getattr", 2, 3, &v, &name, &dflt))
+        return NULL;
+
     if (!PyUnicode_Check(name)) {
         PyErr_SetString(PyExc_TypeError,
                         "getattr(): attribute name must be string");
@@ -1307,13 +1307,13 @@ builtin_next(PyObject *self, PyObject **args, Py_ssize_t nargs,
     PyObject *it, *res;
     PyObject *def = NULL;
 
-    if (!_PyArg_UnpackStack(args, nargs, "next", 1, 2, &it, &def))
-        return NULL;
-
     if (!_PyArg_NoStackKeywords("next", kwnames)) {
         return NULL;
     }
 
+    if (!_PyArg_UnpackStack(args, nargs, "next", 1, 2, &it, &def))
+        return NULL;
+
     if (!PyIter_Check(it)) {
         PyErr_Format(PyExc_TypeError,
             "'%.200s' object is not an iterator",