]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-37207: Add _PyArg_NoKwnames() helper function (GH-18980)
authorDong-hee Na <donghee.na92@gmail.com>
Mon, 16 Mar 2020 14:06:20 +0000 (23:06 +0900)
committerGitHub <noreply@github.com>
Mon, 16 Mar 2020 14:06:20 +0000 (15:06 +0100)
Include/modsupport.h
Misc/NEWS.d/next/C API/2020-03-14-01-56-03.bpo-37207.R3jaTy.rst [new file with mode: 0644]
Objects/rangeobject.c
Objects/tupleobject.c
Python/getargs.c

index f90ede4831e32ba0bf17f9c7b6716afdb3cb6531..f2dc812df2ba8b78aff0adcf61e834dfb98d6ba5 100644 (file)
@@ -60,9 +60,12 @@ PyAPI_FUNC(int) _PyArg_UnpackStack(
     ...);
 
 PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs);
+PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames);
 PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args);
 #define _PyArg_NoKeywords(funcname, kwargs) \
     ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs)))
+#define _PyArg_NoKwnames(funcname, kwnames) \
+    ((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames)))
 #define _PyArg_NoPositional(funcname, args) \
     ((args) == NULL || _PyArg_NoPositional((funcname), (args)))
 
diff --git a/Misc/NEWS.d/next/C API/2020-03-14-01-56-03.bpo-37207.R3jaTy.rst b/Misc/NEWS.d/next/C API/2020-03-14-01-56-03.bpo-37207.R3jaTy.rst
new file mode 100644 (file)
index 0000000..216a821
--- /dev/null
@@ -0,0 +1 @@
+Add _PyArg_NoKwnames helper function. Patch by Dong-hee Na.
index 123ca0b032e0e4d0a48152e62511f6ce3d28ecdb..5bd178b20279e7168afafabf75812b9f53941a40 100644 (file)
@@ -146,8 +146,7 @@ range_vectorcall(PyTypeObject *type, PyObject *const *args,
                  size_t nargsf, PyObject *kwnames)
 {
     Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
-    if (kwnames && PyTuple_GET_SIZE(kwnames) != 0) {
-        PyErr_Format(PyExc_TypeError, "range() takes no keyword arguments");
+    if (!_PyArg_NoKwnames("range", kwnames)) {
         return NULL;
     }
     return range_from_array(type, args, nargs);
index d4165dec17a000736c7aa4e4eb7f56e0ae35a5d9..8a8c6ae74f8a10edd7cae9bffc5589cd92204f84 100644 (file)
@@ -709,8 +709,7 @@ static PyObject *
 tuple_vectorcall(PyObject *type, PyObject * const*args,
                  size_t nargsf, PyObject *kwnames)
 {
-    if (kwnames && PyTuple_GET_SIZE(kwnames) != 0) {
-        PyErr_Format(PyExc_TypeError, "tuple() takes no keyword arguments");
+    if (!_PyArg_NoKwnames("tuple", kwnames)) {
         return NULL;
     }
 
index d644aea5207aca4977c00de2ef5aebca1ea8b2bc..062f8141926ecb38110550d145c83ef60e63ed46 100644 (file)
@@ -2787,6 +2787,7 @@ _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name,
 
 
 #undef _PyArg_NoKeywords
+#undef _PyArg_NoKwnames
 #undef _PyArg_NoPositional
 
 /* For type constructors that don't take keyword args
@@ -2813,7 +2814,6 @@ _PyArg_NoKeywords(const char *funcname, PyObject *kwargs)
     return 0;
 }
 
-
 int
 _PyArg_NoPositional(const char *funcname, PyObject *args)
 {
@@ -2831,6 +2831,23 @@ _PyArg_NoPositional(const char *funcname, PyObject *args)
     return 0;
 }
 
+int
+_PyArg_NoKwnames(const char *funcname, PyObject *kwnames)
+{
+    if (kwnames == NULL) {
+        return 1;
+    }
+
+    assert(PyTuple_CheckExact(kwnames));
+
+    if (PyTuple_GET_SIZE(kwnames) == 0) {
+        return 1;
+    }
+
+    PyErr_Format(PyExc_TypeError, "%s() takes no keyword arguments", funcname);
+    return 0;
+}
+
 void
 _PyArg_Fini(void)
 {