Skip to content

Commit

Permalink
bpo-37207: Add _PyArg_NoKwnames() helper function (GH-18980)
Browse files Browse the repository at this point in the history
  • Loading branch information
corona10 committed Mar 16, 2020
1 parent c98f87f commit 87ec86c
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 5 deletions.
3 changes: 3 additions & 0 deletions Include/modsupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)))

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add _PyArg_NoKwnames helper function. Patch by Dong-hee Na.
3 changes: 1 addition & 2 deletions Objects/rangeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 1 addition & 2 deletions Objects/tupleobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
19 changes: 18 additions & 1 deletion Python/getargs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -2813,7 +2814,6 @@ _PyArg_NoKeywords(const char *funcname, PyObject *kwargs)
return 0;
}


int
_PyArg_NoPositional(const char *funcname, PyObject *args)
{
Expand All @@ -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)
{
Expand Down

0 comments on commit 87ec86c

Please sign in to comment.