diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-09-30 12:51:01 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-09-30 12:51:01 (GMT) |
commit | 85c386dee4dc9ca0508553f2d64bf4d10086e558 (patch) | |
tree | 3fa061f885307fcdab6a4e496ea53a1638d4cde9 /Objects | |
parent | 9a14214aee22512f833a8d5cf8627ca45627d330 (diff) | |
parent | 008fc77e1e443e799be19aebb697b7daf335a0c7 (diff) | |
download | cpython-85c386dee4dc9ca0508553f2d64bf4d10086e558.zip cpython-85c386dee4dc9ca0508553f2d64bf4d10086e558.tar.gz cpython-85c386dee4dc9ca0508553f2d64bf4d10086e558.tar.bz2 |
Issue #25182: The stdprinter (used as sys.stderr before the io module is
imported at startup) now uses the backslashreplace error handler.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/fileobject.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 1b18410..a836cb3 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -372,8 +372,11 @@ PyFile_NewStdPrinter(int fd) static PyObject * stdprinter_write(PyStdPrinter_Object *self, PyObject *args) { + PyObject *unicode; + PyObject *bytes = NULL; char *str; Py_ssize_t n; + int _errno; if (self->fd < 0) { /* fd might be invalid on Windows @@ -383,13 +386,27 @@ stdprinter_write(PyStdPrinter_Object *self, PyObject *args) Py_RETURN_NONE; } - /* encode Unicode to UTF-8 */ - if (!PyArg_ParseTuple(args, "s", &str)) + if (!PyArg_ParseTuple(args, "U", &unicode)) return NULL; - n = _Py_write(self->fd, str, strlen(str)); + /* encode Unicode to UTF-8 */ + str = PyUnicode_AsUTF8AndSize(unicode, &n); + if (str == NULL) { + PyErr_Clear(); + bytes = _PyUnicode_AsUTF8String(unicode, "backslashreplace"); + if (bytes == NULL) + return NULL; + if (PyBytes_AsStringAndSize(bytes, &str, &n) < 0) { + Py_DECREF(bytes); + return NULL; + } + } + + n = _Py_write(self->fd, str, n); + _errno = errno; + Py_XDECREF(bytes); if (n == -1) { - if (errno == EAGAIN) { + if (_errno == EAGAIN) { PyErr_Clear(); Py_RETURN_NONE; } |