diff options
| author | Benjamin Peterson <benjamin@python.org> | 2010-02-06 19:16:33 (GMT) | 
|---|---|---|
| committer | Benjamin Peterson <benjamin@python.org> | 2010-02-06 19:16:33 (GMT) | 
| commit | 004f3dcaa50e21564527ea93e5f3c14fa133972c (patch) | |
| tree | 8f8ee66ad8900c82107f82488063039bf1552d86 /Python/ceval.c | |
| parent | c54b62141f5d500b08ae683b9030464d75854190 (diff) | |
| download | cpython-004f3dcaa50e21564527ea93e5f3c14fa133972c.zip cpython-004f3dcaa50e21564527ea93e5f3c14fa133972c.tar.gz cpython-004f3dcaa50e21564527ea93e5f3c14fa133972c.tar.bz2  | |
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 6c71c27..f72fe4a 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  | 
