diff options
author | Jeroen Demeyer <J.Demeyer@UGent.be> | 2019-07-08 08:19:25 (GMT) |
---|---|---|
committer | Inada Naoki <songofacandy@gmail.com> | 2019-07-08 08:19:25 (GMT) |
commit | 762f93ff2efd6b7ef0177cad57939c0ab2002eac (patch) | |
tree | 4811b08fa9342c3b2575de7e7c1030d1d5eea8a0 /Modules/_io | |
parent | 38f44b4a4adc37e8f5f8971917d8b3145f351a56 (diff) | |
download | cpython-762f93ff2efd6b7ef0177cad57939c0ab2002eac.zip cpython-762f93ff2efd6b7ef0177cad57939c0ab2002eac.tar.gz cpython-762f93ff2efd6b7ef0177cad57939c0ab2002eac.tar.bz2 |
bpo-37337: Add _PyObject_CallMethodNoArgs() (GH-14267)
Diffstat (limited to 'Modules/_io')
-rw-r--r-- | Modules/_io/_iomodule.c | 4 | ||||
-rw-r--r-- | Modules/_io/bufferedio.c | 26 | ||||
-rw-r--r-- | Modules/_io/iobase.c | 17 | ||||
-rw-r--r-- | Modules/_io/stringio.c | 4 | ||||
-rw-r--r-- | Modules/_io/textio.c | 79 |
5 files changed, 64 insertions, 66 deletions
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 5c2f019..96426e0 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -400,7 +400,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, /* buffering */ if (buffering < 0) { - PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(raw, &PyId_isatty); if (res == NULL) goto error; isatty = PyLong_AsLong(res); @@ -494,7 +494,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, if (result != NULL) { PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - close_result = _PyObject_CallMethodId(result, &PyId_close, NULL); + close_result = _PyObject_CallMethodIdNoArgs(result, &PyId_close); _PyErr_ChainExceptions(exc, val, tb); Py_XDECREF(close_result); Py_DECREF(result); diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 44e12db..9e7e5f3 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -461,7 +461,7 @@ static PyObject * buffered_simple_flush(buffered *self, PyObject *args) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_flush, NULL); + return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_flush); } static int @@ -513,7 +513,7 @@ buffered_close(buffered *self, PyObject *args) } /* flush() will most probably re-take the lock, so drop it first */ LEAVE_BUFFERED(self) - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (!ENTER_BUFFERED(self)) return NULL; if (res == NULL) @@ -521,7 +521,7 @@ buffered_close(buffered *self, PyObject *args) else Py_DECREF(res); - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL); + res = _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_close); if (self->buffer) { PyMem_Free(self->buffer); @@ -545,7 +545,7 @@ buffered_detach(buffered *self, PyObject *Py_UNUSED(ignored)) { PyObject *raw, *res; CHECK_INITIALIZED(self) - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -562,21 +562,21 @@ static PyObject * buffered_seekable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_seekable, NULL); + return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_seekable); } static PyObject * buffered_readable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readable, NULL); + return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_readable); } static PyObject * buffered_writable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_writable, NULL); + return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_writable); } static PyObject * @@ -599,14 +599,14 @@ static PyObject * buffered_fileno(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_fileno, NULL); + return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_fileno); } static PyObject * buffered_isatty(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL); + return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_isatty); } /* Forward decls */ @@ -670,7 +670,7 @@ _buffered_raw_tell(buffered *self) { Py_off_t n; PyObject *res; - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_tell, NULL); + res = _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_tell); if (res == NULL) return -1; n = PyNumber_AsOff_t(res, PyExc_ValueError); @@ -1350,8 +1350,8 @@ buffered_iternext(buffered *self) line = _buffered_readline(self, -1); } else { - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = _PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyBytes_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a bytes object, " @@ -1566,7 +1566,7 @@ _bufferedreader_read_all(buffered *self) } /* Read until EOF or until read() would block. */ - data = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_read, NULL); + data = _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_read); if (data == NULL) goto cleanup; if (data != Py_None && !PyBytes_Check(data)) { diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 82cc776..d51fc94 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -235,7 +235,7 @@ _io__IOBase_close_impl(PyObject *self) Py_RETURN_NONE; } - res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL); + res = _PyObject_CallMethodNoArgs(self, _PyIO_str_flush); PyErr_Fetch(&exc, &val, &tb); rc = _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True); @@ -281,8 +281,7 @@ iobase_finalize(PyObject *self) finalization process. */ if (_PyObject_SetAttrId(self, &PyId__finalizing, Py_True)) PyErr_Clear(); - res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close, - NULL); + res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_close); /* Silencing I/O errors is bad, but printing spurious tracebacks is equally as bad, and potentially more frequent (because of shutdown issues). */ @@ -383,7 +382,7 @@ _io__IOBase_seekable_impl(PyObject *self) PyObject * _PyIOBase_check_seekable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL); + PyObject *res = _PyObject_CallMethodNoArgs(self, _PyIO_str_seekable); if (res == NULL) return NULL; if (res != Py_True) { @@ -416,7 +415,7 @@ _io__IOBase_readable_impl(PyObject *self) PyObject * _PyIOBase_check_readable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL); + PyObject *res = _PyObject_CallMethodNoArgs(self, _PyIO_str_readable); if (res == NULL) return NULL; if (res != Py_True) { @@ -449,7 +448,7 @@ _io__IOBase_writable_impl(PyObject *self) PyObject * _PyIOBase_check_writable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL); + PyObject *res = _PyObject_CallMethodNoArgs(self, _PyIO_str_writable); if (res == NULL) return NULL; if (res != Py_True) { @@ -478,7 +477,7 @@ iobase_enter(PyObject *self, PyObject *args) static PyObject * iobase_exit(PyObject *self, PyObject *args) { - return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL); + return _PyObject_CallMethodNoArgs(self, _PyIO_str_close); } /* Lower-level APIs */ @@ -656,7 +655,7 @@ iobase_iter(PyObject *self) static PyObject * iobase_iternext(PyObject *self) { - PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL); + PyObject *line = _PyObject_CallMethodNoArgs(self, _PyIO_str_readline); if (line == NULL) return NULL; @@ -921,7 +920,7 @@ _io__RawIOBase_read_impl(PyObject *self, Py_ssize_t n) if (n < 0) { _Py_IDENTIFIER(readall); - return _PyObject_CallMethodId(self, &PyId_readall, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_readall); } /* TODO: allocate a bytes object directly instead and manually construct diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index 9e9724d..810cad6 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -408,8 +408,8 @@ stringio_iternext(stringio *self) } else { /* XXX is subclassing StringIO really supported? */ - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = _PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a str object, " diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 021231e..ed1dc00 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -527,8 +527,8 @@ _io_IncrementalNewlineDecoder_getstate_impl(nldecoder_object *self) unsigned long long flag; if (self->decoder != Py_None) { - PyObject *state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + PyObject *state = _PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (state == NULL) return NULL; if (!PyTuple_Check(state)) { @@ -601,7 +601,7 @@ _io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self) self->seennl = 0; self->pendingcr = 0; if (self->decoder != Py_None) - return PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); + return _PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else Py_RETURN_NONE; } @@ -862,7 +862,7 @@ _textiowrapper_set_decoder(textio *self, PyObject *codec_info, PyObject *res; int r; - res = _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_readable); if (res == NULL) return -1; @@ -917,7 +917,7 @@ _textiowrapper_set_encoder(textio *self, PyObject *codec_info, PyObject *res; int r; - res = _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_writable); if (res == NULL) return -1; @@ -963,8 +963,8 @@ _textiowrapper_fix_encoder_state(textio *self) self->encoding_start_of_stream = 1; - PyObject *cookieObj = PyObject_CallMethodObjArgs( - self->buffer, _PyIO_str_tell, NULL); + PyObject *cookieObj = _PyObject_CallMethodNoArgs( + self->buffer, _PyIO_str_tell); if (cookieObj == NULL) { return -1; } @@ -1126,7 +1126,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, state = IO_STATE(); if (state == NULL) goto error; - fileno = _PyObject_CallMethodId(buffer, &PyId_fileno, NULL); + fileno = _PyObject_CallMethodIdNoArgs(buffer, &PyId_fileno); /* Ignore only AttributeError and UnsupportedOperation */ if (fileno == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError) || @@ -1241,7 +1241,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, } } - res = _PyObject_CallMethodId(buffer, &PyId_seekable, NULL); + res = _PyObject_CallMethodIdNoArgs(buffer, &PyId_seekable); if (res == NULL) goto error; r = PyObject_IsTrue(res); @@ -1386,7 +1386,7 @@ _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding, return NULL; } - PyObject *res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + PyObject *res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) { return NULL; } @@ -1525,7 +1525,7 @@ _io_TextIOWrapper_detach_impl(textio *self) { PyObject *buffer, *res; CHECK_ATTACHED(self); - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -1720,7 +1720,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) } if (needflush) { - ret = PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_flush, NULL); + ret = _PyObject_CallMethodNoArgs(self->buffer, _PyIO_str_flush); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1730,7 +1730,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) Py_CLEAR(self->snapshot); if (self->decoder) { - ret = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); + ret = _PyObject_CallMethodIdNoArgs(self->decoder, &PyId_reset); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1810,9 +1810,8 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) /* To prepare for tell(), we need to snapshot a point in the file * where the decoder's input buffer is empty. */ - - PyObject *state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + PyObject *state = _PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (state == NULL) return -1; /* Given this, we know there was a valid snapshot point @@ -1935,7 +1934,7 @@ _io_TextIOWrapper_read_impl(textio *self, Py_ssize_t n) if (n < 0) { /* Read everything */ - PyObject *bytes = _PyObject_CallMethodId(self->buffer, &PyId_read, NULL); + PyObject *bytes = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_read); PyObject *decoded; if (bytes == NULL) goto fail; @@ -2396,7 +2395,7 @@ _textiowrapper_decoder_setstate(textio *self, cookie_type *cookie) utf-16, that we are expecting a BOM). */ if (cookie->start_pos == 0 && cookie->dec_flags == 0) - res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); + res = _PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "((yi))", "", cookie->dec_flags); @@ -2411,7 +2410,7 @@ _textiowrapper_encoder_reset(textio *self, int start_of_stream) { PyObject *res; if (start_of_stream) { - res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_reset, NULL); + res = _PyObject_CallMethodNoArgs(self->encoder, _PyIO_str_reset); self->encoding_start_of_stream = 1; } else { @@ -2476,7 +2475,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) * sync the underlying buffer with the current position. */ Py_DECREF(cookieObj); - cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL); + cookieObj = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_tell); if (cookieObj == NULL) goto fail; break; @@ -2492,7 +2491,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2500,7 +2499,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) textiowrapper_set_decoded_chars(self, NULL); Py_CLEAR(self->snapshot); if (self->decoder) { - res = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); + res = _PyObject_CallMethodIdNoArgs(self->decoder, &PyId_reset); if (res == NULL) goto fail; Py_DECREF(res); @@ -2540,7 +2539,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2663,12 +2662,12 @@ _io_TextIOWrapper_tell_impl(textio *self) if (_textiowrapper_writeflush(self) < 0) return NULL; - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) goto fail; Py_DECREF(res); - posobj = _PyObject_CallMethodId(self->buffer, &PyId_tell, NULL); + posobj = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_tell); if (posobj == NULL) goto fail; @@ -2704,15 +2703,15 @@ _io_TextIOWrapper_tell_impl(textio *self) chars_to_skip = self->decoded_chars_used; /* Decoder state will be restored at the end */ - saved_state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + saved_state = _PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (saved_state == NULL) goto fail; #define DECODER_GETSTATE() do { \ PyObject *dec_buffer; \ - PyObject *_state = PyObject_CallMethodObjArgs(self->decoder, \ - _PyIO_str_getstate, NULL); \ + PyObject *_state = _PyObject_CallMethodNoArgs(self->decoder, \ + _PyIO_str_getstate); \ if (_state == NULL) \ goto fail; \ if (!PyTuple_Check(_state)) { \ @@ -2874,7 +2873,7 @@ _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos) CHECK_ATTACHED(self) - res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_flush, NULL); + res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -2963,7 +2962,7 @@ _io_TextIOWrapper_fileno_impl(textio *self) /*[clinic end generated code: output=21490a4c3da13e6c input=c488ca83d0069f9b]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_fileno, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_fileno); } /*[clinic input] @@ -2975,7 +2974,7 @@ _io_TextIOWrapper_seekable_impl(textio *self) /*[clinic end generated code: output=ab223dbbcffc0f00 input=8b005ca06e1fca13]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_seekable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_seekable); } /*[clinic input] @@ -2987,7 +2986,7 @@ _io_TextIOWrapper_readable_impl(textio *self) /*[clinic end generated code: output=72ff7ba289a8a91b input=0704ea7e01b0d3eb]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_readable); } /*[clinic input] @@ -2999,7 +2998,7 @@ _io_TextIOWrapper_writable_impl(textio *self) /*[clinic end generated code: output=a728c71790d03200 input=c41740bc9d8636e8]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_writable); } /*[clinic input] @@ -3011,7 +3010,7 @@ _io_TextIOWrapper_isatty_impl(textio *self) /*[clinic end generated code: output=12be1a35bace882e input=fb68d9f2c99bbfff]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_isatty); } /*[clinic input] @@ -3027,7 +3026,7 @@ _io_TextIOWrapper_flush_impl(textio *self) self->telling = self->seekable; if (_textiowrapper_writeflush(self) < 0) return NULL; - return _PyObject_CallMethodId(self->buffer, &PyId_flush, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_flush); } /*[clinic input] @@ -3064,13 +3063,13 @@ _io_TextIOWrapper_close_impl(textio *self) else PyErr_Clear(); } - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) PyErr_Fetch(&exc, &val, &tb); else Py_DECREF(res); - res = _PyObject_CallMethodId(self->buffer, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_close); if (exc != NULL) { _PyErr_ChainExceptions(exc, val, tb); Py_CLEAR(res); @@ -3092,8 +3091,8 @@ textiowrapper_iternext(textio *self) line = _textiowrapper_readline(self, -1); } else { - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = _PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a str object, " |