diff options
author | Benjamin Peterson <benjamin@python.org> | 2010-02-06 19:16:33 +0000 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2010-02-06 19:16:33 +0000 |
commit | 004f3dcaa50e21564527ea93e5f3c14fa133972c (patch) | |
tree | 8f8ee66ad8900c82107f82488063039bf1552d86 /Python/ceval.c | |
parent | c54b62141f5d500b08ae683b9030464d75854190 (diff) | |
download | cpython-git-004f3dcaa50e21564527ea93e5f3c14fa133972c.tar.gz |
Merged revisions 68805 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68805 | benjamin.peterson | 2009-01-20 08:21:16 -0600 (Tue, 20 Jan 2009) | 1 line
allow unicode keyword arguments for the ** syntax #4978
........
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 6c71c27350..f72fe4ae02 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -145,6 +145,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" @@ -2831,7 +2832,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)); @@ -2860,11 +2862,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); @@ -2872,12 +2878,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); @@ -3004,6 +3014,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 |