diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2011-07-23 19:50:21 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-07-23 19:50:21 (GMT) |
commit | d42c1d09e99d74f6b411bdb1d3c8b9a648dd6a79 (patch) | |
tree | ad9943d40fcf0ab23ae4d5ddeaacb71afab0d433 /Modules/_io/textio.c | |
parent | f23339a7bb9d9fe977de6d90c64e3c9a27e6b00b (diff) | |
parent | e96ec6810184f5daacb2d47ab8801365c99bb206 (diff) | |
download | cpython-d42c1d09e99d74f6b411bdb1d3c8b9a648dd6a79.zip cpython-d42c1d09e99d74f6b411bdb1d3c8b9a648dd6a79.tar.gz cpython-d42c1d09e99d74f6b411bdb1d3c8b9a648dd6a79.tar.bz2 |
Issue #12591: Allow io.TextIOWrapper to work with raw IO objects (without
a read1() method), and add a *write_through* parameter to
mandate unbuffered writes.
Diffstat (limited to 'Modules/_io/textio.c')
-rw-r--r-- | Modules/_io/textio.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 1a32120..13d4bd9 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -653,10 +653,12 @@ typedef struct PyObject *errors; const char *writenl; /* utf-8 encoded, NULL stands for \n */ char line_buffering; + char write_through; char readuniversal; char readtranslate; char writetranslate; char seekable; + char has_read1; char telling; char deallocating; /* Specialized encoding func (see below) */ @@ -813,13 +815,13 @@ static int textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) { char *kwlist[] = {"buffer", "encoding", "errors", - "newline", "line_buffering", + "newline", "line_buffering", "write_through", NULL}; PyObject *buffer, *raw; char *encoding = NULL; char *errors = NULL; char *newline = NULL; - int line_buffering = 0; + int line_buffering = 0, write_through = 0; _PyIO_State *state = IO_STATE; PyObject *res; @@ -827,9 +829,9 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) self->ok = 0; self->detached = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|zzzi:fileio", + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|zzzii:fileio", kwlist, &buffer, &encoding, &errors, - &newline, &line_buffering)) + &newline, &line_buffering, &write_through)) return -1; if (newline && newline[0] != '\0' @@ -935,6 +937,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) self->chunk_size = 8192; self->readuniversal = (newline == NULL || newline[0] == '\0'); self->line_buffering = line_buffering; + self->write_through = write_through; self->readtranslate = (newline == NULL); if (newline) { self->readnl = PyUnicode_FromString(newline); @@ -1044,6 +1047,8 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) self->seekable = self->telling = PyObject_IsTrue(res); Py_DECREF(res); + self->has_read1 = PyObject_HasAttrString(buffer, "read1"); + self->encoding_start_of_stream = 0; if (self->seekable && self->encoder) { PyObject *cookieObj; @@ -1287,7 +1292,9 @@ textiowrapper_write(textio *self, PyObject *args) text = newtext; } - if (self->line_buffering && + if (self->write_through) + needflush = 1; + else if (self->line_buffering && (haslf || findchar(PyUnicode_AS_UNICODE(text), PyUnicode_GET_SIZE(text), '\r'))) @@ -1435,7 +1442,8 @@ textiowrapper_read_chunk(textio *self) if (chunk_size == NULL) goto fail; input_chunk = PyObject_CallMethodObjArgs(self->buffer, - _PyIO_str_read1, chunk_size, NULL); + (self->has_read1 ? _PyIO_str_read1: _PyIO_str_read), + chunk_size, NULL); Py_DECREF(chunk_size); if (input_chunk == NULL) goto fail; |