mirror of
https://github.com/python/cpython.git
synced 2025-07-28 13:44:43 +00:00
allow unicode keyword arguments for the ** syntax #4978
This commit is contained in:
parent
196a0f7a8a
commit
e18ef194d9
3 changed files with 55 additions and 12 deletions
|
@ -127,6 +127,7 @@ static void reset_exc_info(PyThreadState *);
|
|||
static void format_exc_check_arg(PyObject *, char *, PyObject *);
|
||||
static PyObject * string_concatenate(PyObject *, PyObject *,
|
||||
PyFrameObject *, unsigned char *);
|
||||
static PyObject * kwd_as_string(PyObject *);
|
||||
|
||||
#define NAME_ERROR_MSG \
|
||||
"name '%.200s' is not defined"
|
||||
|
@ -2932,7 +2933,8 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
|||
PyObject *keyword = kws[2*i];
|
||||
PyObject *value = kws[2*i + 1];
|
||||
int j;
|
||||
if (keyword == NULL || !PyString_Check(keyword)) {
|
||||
if (keyword == NULL || !(PyString_Check(keyword) ||
|
||||
PyUnicode_Check(keyword))) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s() keywords must be strings",
|
||||
PyString_AsString(co->co_name));
|
||||
|
@ -2961,11 +2963,15 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
|||
goto fail;
|
||||
if (j >= co->co_argcount) {
|
||||
if (kwdict == NULL) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s() got an unexpected "
|
||||
"keyword argument '%.400s'",
|
||||
PyString_AsString(co->co_name),
|
||||
PyString_AsString(keyword));
|
||||
PyObject *kwd_str = kwd_as_string(keyword);
|
||||
if (kwd_str) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s() got an unexpected "
|
||||
"keyword argument '%.400s'",
|
||||
PyString_AsString(co->co_name),
|
||||
PyString_AsString(kwd_str));
|
||||
Py_DECREF(kwd_str);
|
||||
}
|
||||
goto fail;
|
||||
}
|
||||
PyDict_SetItem(kwdict, keyword, value);
|
||||
|
@ -2973,12 +2979,16 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
|||
}
|
||||
kw_found:
|
||||
if (GETLOCAL(j) != NULL) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s() got multiple "
|
||||
"values for keyword "
|
||||
"argument '%.400s'",
|
||||
PyString_AsString(co->co_name),
|
||||
PyString_AsString(keyword));
|
||||
PyObject *kwd_str = kwd_as_string(keyword);
|
||||
if (kwd_str) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s() got multiple "
|
||||
"values for keyword "
|
||||
"argument '%.400s'",
|
||||
PyString_AsString(co->co_name),
|
||||
PyString_AsString(kwd_str));
|
||||
Py_DECREF(kwd_str);
|
||||
}
|
||||
goto fail;
|
||||
}
|
||||
Py_INCREF(value);
|
||||
|
@ -3105,6 +3115,17 @@ fail: /* Jump here from prelude on failure */
|
|||
}
|
||||
|
||||
|
||||
static PyObject *
|
||||
kwd_as_string(PyObject *kwd) {
|
||||
if (PyString_Check(kwd)) {
|
||||
Py_INCREF(kwd);
|
||||
return kwd;
|
||||
}
|
||||
else
|
||||
return _PyUnicode_AsDefaultEncodedString(kwd, "replace");
|
||||
}
|
||||
|
||||
|
||||
/* Implementation notes for set_exc_info() and reset_exc_info():
|
||||
|
||||
- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue