Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Include/modsupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,13 @@ PyAPI_FUNC(int) _PyArg_UnpackStack(

PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs);
PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args);
PyAPI_FUNC(int) _PyArg_NoTupleKeywords(const char *funcname, PyObject *kwnames);
#define _PyArg_NoKeywords(funcname, kwargs) \
((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs)))
#define _PyArg_NoPositional(funcname, args) \
((args) == NULL || _PyArg_NoPositional((funcname), (args)))
#define _PyArg_NoTupleKeywords(funcname, kwnames) \
((kwnames) == NULL || _PyArg_NoTupleKeywords((funcname), (kwnames)))

PyAPI_FUNC(void) _PyArg_BadArgument(const char *, const char *, const char *, PyObject *);
PyAPI_FUNC(int) _PyArg_CheckPositional(const char *, Py_ssize_t,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add _PyArg_NoTupleKeywords 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_NoTupleKeywords("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_NoTupleKeywords("tuple", kwnames)) {
return NULL;
}
Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Expand Down
20 changes: 19 additions & 1 deletion Python/getargs.c
Original file line number Diff line number Diff line change
Expand Up @@ -2788,6 +2788,7 @@ _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name,

#undef _PyArg_NoKeywords
#undef _PyArg_NoPositional
#undef _PyArg_NoTupleKeywords

/* 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,24 @@ _PyArg_NoPositional(const char *funcname, PyObject *args)
return 0;
}

int
_PyArg_NoTupleKeywords(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, "%.200s() takes no keyword arguments",
funcname);
return 0;
}

void
_PyArg_Fini(void)
{
Expand Down