|
|
|
@ -3875,7 +3875,7 @@ exit_eval_frame: |
|
|
|
|
|
|
|
static void |
|
|
|
format_missing(PyThreadState *tstate, const char *kind, |
|
|
|
PyCodeObject *co, PyObject *names) |
|
|
|
PyCodeObject *co, PyObject *names, PyObject *qualname) |
|
|
|
{ |
|
|
|
int err; |
|
|
|
Py_ssize_t len = PyList_GET_SIZE(names); |
|
|
|
@ -3928,7 +3928,7 @@ format_missing(PyThreadState *tstate, const char *kind, |
|
|
|
return; |
|
|
|
_PyErr_Format(tstate, PyExc_TypeError, |
|
|
|
"%U() missing %i required %s argument%s: %U", |
|
|
|
co->co_name, |
|
|
|
qualname, |
|
|
|
len, |
|
|
|
kind, |
|
|
|
len == 1 ? "" : "s", |
|
|
|
@ -3939,7 +3939,7 @@ format_missing(PyThreadState *tstate, const char *kind, |
|
|
|
static void |
|
|
|
missing_arguments(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
Py_ssize_t missing, Py_ssize_t defcount, |
|
|
|
PyObject **fastlocals) |
|
|
|
PyObject **fastlocals, PyObject *qualname) |
|
|
|
{ |
|
|
|
Py_ssize_t i, j = 0; |
|
|
|
Py_ssize_t start, end; |
|
|
|
@ -3971,14 +3971,14 @@ missing_arguments(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
} |
|
|
|
} |
|
|
|
assert(j == missing); |
|
|
|
format_missing(tstate, kind, co, missing_names); |
|
|
|
format_missing(tstate, kind, co, missing_names, qualname); |
|
|
|
Py_DECREF(missing_names); |
|
|
|
} |
|
|
|
|
|
|
|
static void |
|
|
|
too_many_positional(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
Py_ssize_t given, Py_ssize_t defcount, |
|
|
|
PyObject **fastlocals) |
|
|
|
PyObject **fastlocals, PyObject *qualname) |
|
|
|
{ |
|
|
|
int plural; |
|
|
|
Py_ssize_t kwonly_given = 0; |
|
|
|
@ -4022,7 +4022,7 @@ too_many_positional(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
} |
|
|
|
_PyErr_Format(tstate, PyExc_TypeError, |
|
|
|
"%U() takes %U positional argument%s but %zd%U %s given", |
|
|
|
co->co_name, |
|
|
|
qualname, |
|
|
|
sig, |
|
|
|
plural ? "s" : "", |
|
|
|
given, |
|
|
|
@ -4034,7 +4034,8 @@ too_many_positional(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
|
|
|
|
static int |
|
|
|
positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
Py_ssize_t kwcount, PyObject* const* kwnames) |
|
|
|
Py_ssize_t kwcount, PyObject* const* kwnames, |
|
|
|
PyObject *qualname) |
|
|
|
{ |
|
|
|
int posonly_conflicts = 0; |
|
|
|
PyObject* posonly_names = PyList_New(0); |
|
|
|
@ -4079,7 +4080,7 @@ positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, |
|
|
|
_PyErr_Format(tstate, PyExc_TypeError, |
|
|
|
"%U() got some positional-only arguments passed" |
|
|
|
" as keyword arguments: '%U'", |
|
|
|
co->co_name, error_names); |
|
|
|
qualname, error_names); |
|
|
|
Py_DECREF(error_names); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
@ -4180,7 +4181,7 @@ _PyEval_EvalCode(PyThreadState *tstate, |
|
|
|
if (keyword == NULL || !PyUnicode_Check(keyword)) { |
|
|
|
_PyErr_Format(tstate, PyExc_TypeError, |
|
|
|
"%U() keywords must be strings", |
|
|
|
co->co_name); |
|
|
|
qualname); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
|
|
|
|
@ -4211,14 +4212,14 @@ _PyEval_EvalCode(PyThreadState *tstate, |
|
|
|
|
|
|
|
if (co->co_posonlyargcount |
|
|
|
&& positional_only_passed_as_keyword(tstate, co, |
|
|
|
kwcount, kwnames)) |
|
|
|
kwcount, kwnames, qualname)) |
|
|
|
{ |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
|
|
|
|
_PyErr_Format(tstate, PyExc_TypeError, |
|
|
|
"%U() got an unexpected keyword argument '%S'", |
|
|
|
co->co_name, keyword); |
|
|
|
qualname, keyword); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
|
|
|
|
@ -4231,7 +4232,7 @@ _PyEval_EvalCode(PyThreadState *tstate, |
|
|
|
if (GETLOCAL(j) != NULL) { |
|
|
|
_PyErr_Format(tstate, PyExc_TypeError, |
|
|
|
"%U() got multiple values for argument '%S'", |
|
|
|
co->co_name, keyword); |
|
|
|
qualname, keyword); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
Py_INCREF(value); |
|
|
|
@ -4240,7 +4241,7 @@ _PyEval_EvalCode(PyThreadState *tstate, |
|
|
|
|
|
|
|
/* Check the number of positional arguments */ |
|
|
|
if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) { |
|
|
|
too_many_positional(tstate, co, argcount, defcount, fastlocals); |
|
|
|
too_many_positional(tstate, co, argcount, defcount, fastlocals, qualname); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
|
|
|
|
@ -4254,7 +4255,7 @@ _PyEval_EvalCode(PyThreadState *tstate, |
|
|
|
} |
|
|
|
} |
|
|
|
if (missing) { |
|
|
|
missing_arguments(tstate, co, missing, defcount, fastlocals); |
|
|
|
missing_arguments(tstate, co, missing, defcount, fastlocals, qualname); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
if (n > m) |
|
|
|
@ -4292,7 +4293,7 @@ _PyEval_EvalCode(PyThreadState *tstate, |
|
|
|
missing++; |
|
|
|
} |
|
|
|
if (missing) { |
|
|
|
missing_arguments(tstate, co, missing, -1, fastlocals); |
|
|
|
missing_arguments(tstate, co, missing, -1, fastlocals, qualname); |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
} |
|
|
|
|