From 573c08c1b73048876b62d99ff8d82337dc8ce0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20D=C3=B6rwald?= Date: Fri, 25 May 2007 15:46:59 +0000 Subject: Change PyErr_Format() to generate a unicode string (by using PyUnicode_FromFormatV() instead of PyString_FromFormatV()). Change calls to PyErr_Format() to benefit from the new format specifiers: Using %S, object instead of %s, PyString_AS_STRING(object) with will work with unicode objects too. --- Include/pyerrors.h | 3 +-- Python/ceval.c | 42 +++++++++++++++++++----------------------- Python/codecs.c | 19 +++++++------------ Python/compile.c | 4 ++-- Python/errors.c | 10 ++++------ 5 files changed, 33 insertions(+), 45 deletions(-) diff --git a/Include/pyerrors.h b/Include/pyerrors.h index c72a5bd..1f7b2ca 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -173,8 +173,7 @@ PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( PyObject *, Py_UNICODE *); #endif /* Py_WIN_WIDE_FILENAMES */ -PyAPI_FUNC(PyObject *) PyErr_Format(PyObject *, const char *, ...) - Py_GCC_ATTRIBUTE((format(printf, 2, 3))); +PyAPI_FUNC(PyObject *) PyErr_Format(PyObject *, const char *, ...); #ifdef MS_WINDOWS PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilenameObject( diff --git a/Python/ceval.c b/Python/ceval.c index d777a3a..37659f8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2615,9 +2615,9 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, if (argcount > co->co_argcount) { if (!(co->co_flags & CO_VARARGS)) { PyErr_Format(PyExc_TypeError, - "%.200s() takes %s %d " + "%S() takes %s %d " "%spositional argument%s (%d given)", - PyString_AsString(co->co_name), + co->co_name, defcount ? "at most" : "exactly", co->co_argcount, kwcount ? "non-keyword " : "", @@ -2649,8 +2649,8 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, int j; if (keyword == NULL || !(PyString_Check(keyword) || PyUnicode_Check(keyword))) { PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", - PyString_AsString(co->co_name)); + "%S() keywords must be strings", + co->co_name); goto fail; } /* XXX slow -- speed up using dictionary? */ @@ -2672,10 +2672,10 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, if (j >= co->co_argcount + co->co_kwonlyargcount) { if (kwdict == NULL) { PyErr_Format(PyExc_TypeError, - "%.200s() got an unexpected " - "keyword argument '%.400s'", - PyString_AsString(co->co_name), - PyString_AsString(keyword)); + "%S() got an unexpected " + "keyword argument '%S'", + co->co_name, + keyword); goto fail; } PyDict_SetItem(kwdict, keyword, value); @@ -2683,11 +2683,11 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, else { if (GETLOCAL(j) != NULL) { PyErr_Format(PyExc_TypeError, - "%.200s() got multiple " + "%S() got multiple " "values for keyword " - "argument '%.400s'", - PyString_AsString(co->co_name), - PyString_AsString(keyword)); + "argument '%S'", + co->co_name, + keyword); goto fail; } Py_INCREF(value); @@ -2711,10 +2711,8 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, continue; } PyErr_Format(PyExc_TypeError, - "%.200s() needs " - "keyword-only argument %s", - PyString_AsString(co->co_name), - PyString_AsString(name)); + "%S() needs keyword-only argument %S", + co->co_name, name); goto fail; } } @@ -2723,10 +2721,10 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, for (i = argcount; i < m; i++) { if (GETLOCAL(i) == NULL) { PyErr_Format(PyExc_TypeError, - "%.200s() takes %s %d " + "%S() takes %s %d " "%spositional argument%s " "(%d given)", - PyString_AsString(co->co_name), + co->co_name, ((co->co_flags & CO_VARARGS) || defcount) ? "at least" : "exactly", @@ -2751,8 +2749,8 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, else { if (argcount > 0 || kwcount > 0) { PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%d given)", - PyString_AsString(co->co_name), + "%S() takes no arguments (%d given)", + co->co_name, argcount + kwcount); goto fail; } @@ -4021,9 +4019,7 @@ import_from(PyObject *v, PyObject *name) x = PyObject_GetAttr(v, name); if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, - "cannot import name %.230s", - PyString_AsString(name)); + PyErr_Format(PyExc_ImportError, "cannot import name %S", name); } return x; } diff --git a/Python/codecs.c b/Python/codecs.c index ddd19359..3aa1f38 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -443,18 +443,13 @@ static void wrong_exception_type(PyObject *exc) { PyObject *type = PyObject_GetAttrString(exc, "__class__"); if (type != NULL) { - PyObject *name = PyObject_GetAttrString(type, "__name__"); - Py_DECREF(type); - if (name != NULL) { - PyObject *string = PyObject_Str(name); - Py_DECREF(name); - if (string != NULL) { - PyErr_Format(PyExc_TypeError, - "don't know how to handle %.400s in error callback", - PyString_AS_STRING(string)); - Py_DECREF(string); - } - } + PyObject *name = PyObject_GetAttrString(type, "__name__"); + Py_DECREF(type); + if (name != NULL) { + PyErr_Format(PyExc_TypeError, + "don't know how to handle %S in error callback", name); + Py_DECREF(name); + } } } diff --git a/Python/compile.c b/Python/compile.c index ffca830..359de58 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2467,9 +2467,9 @@ mangled = _Py_Mangle(c->u->u_private, name); break; case Del: PyErr_Format(PyExc_SyntaxError, - "can not delete variable '%s' referenced " + "can not delete variable '%S' referenced " "in nested scope", - PyString_AS_STRING(name)); + name); Py_DECREF(mangled); return 0; case Param: diff --git a/Python/errors.c b/Python/errors.c index 4ef491f..2a84c8d 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -54,11 +54,9 @@ PyErr_SetObject(PyObject *exception, PyObject *value) { if (exception != NULL && !PyExceptionClass_Check(exception)) { - PyObject *excstr = PyObject_ReprStr8(exception); PyErr_Format(PyExc_SystemError, - "exception %s not a BaseException subclass", - PyString_AS_STRING(excstr)); - Py_DECREF(excstr); + "exception %R not a BaseException subclass", + exception); return; } Py_XINCREF(exception); @@ -75,7 +73,7 @@ PyErr_SetNone(PyObject *exception) void PyErr_SetString(PyObject *exception, const char *string) { - PyObject *value = PyString_FromString(string); + PyObject *value = PyUnicode_FromString(string); PyErr_SetObject(exception, value); Py_XDECREF(value); } @@ -528,7 +526,7 @@ PyErr_Format(PyObject *exception, const char *format, ...) va_start(vargs); #endif - string = PyString_FromFormatV(format, vargs); + string = PyUnicode_FromFormatV(format, vargs); PyErr_SetObject(exception, string); Py_XDECREF(string); va_end(vargs); -- cgit v0.12