Home | History | Annotate | Download | only in _io
      1 /*
      2     An implementation of the I/O abstract base classes hierarchy
      3     as defined by PEP 3116 - "New I/O"
      4 
      5     Classes defined here: IOBase, RawIOBase.
      6 
      7     Written by Amaury Forgeot d'Arc and Antoine Pitrou
      8 */
      9 
     10 
     11 #define PY_SSIZE_T_CLEAN
     12 #include "Python.h"
     13 #include "structmember.h"
     14 #include "_iomodule.h"
     15 
     16 /*
     17  * IOBase class, an abstract class
     18  */
     19 
     20 typedef struct {
     21     PyObject_HEAD
     22 
     23     PyObject *dict;
     24     PyObject *weakreflist;
     25 } iobase;
     26 
     27 PyDoc_STRVAR(iobase_doc,
     28     "The abstract base class for all I/O classes, acting on streams of\n"
     29     "bytes. There is no public constructor.\n"
     30     "\n"
     31     "This class provides dummy implementations for many methods that\n"
     32     "derived classes can override selectively; the default implementations\n"
     33     "represent a file that cannot be read, written or seeked.\n"
     34     "\n"
     35     "Even though IOBase does not declare read, readinto, or write because\n"
     36     "their signatures will vary, implementations and clients should\n"
     37     "consider those methods part of the interface. Also, implementations\n"
     38     "may raise a IOError when operations they do not support are called.\n"
     39     "\n"
     40     "The basic type used for binary data read from or written to a file is\n"
     41     "bytes. bytearrays are accepted too, and in some cases (such as\n"
     42     "readinto) needed. Text I/O classes work with str data.\n"
     43     "\n"
     44     "Note that calling any method (except additional calls to close(),\n"
     45     "which are ignored) on a closed stream should raise a ValueError.\n"
     46     "\n"
     47     "IOBase (and its subclasses) support the iterator protocol, meaning\n"
     48     "that an IOBase object can be iterated over yielding the lines in a\n"
     49     "stream.\n"
     50     "\n"
     51     "IOBase also supports the :keyword:`with` statement. In this example,\n"
     52     "fp is closed after the suite of the with statement is complete:\n"
     53     "\n"
     54     "with open('spam.txt', 'r') as fp:\n"
     55     "    fp.write('Spam and eggs!')\n");
     56 
     57 /* Use this macro whenever you want to check the internal `closed` status
     58    of the IOBase object rather than the virtual `closed` attribute as returned
     59    by whatever subclass. */
     60 
     61 #define IS_CLOSED(self) \
     62     PyObject_HasAttrString(self, "__IOBase_closed")
     63 
     64 /* Internal methods */
     65 static PyObject *
     66 iobase_unsupported(const char *message)
     67 {
     68     PyErr_SetString(_PyIO_unsupported_operation, message);
     69     return NULL;
     70 }
     71 
     72 /* Positionning */
     73 
     74 PyDoc_STRVAR(iobase_seek_doc,
     75     "Change stream position.\n"
     76     "\n"
     77     "Change the stream position to the given byte offset. The offset is\n"
     78     "interpreted relative to the position indicated by whence.  Values\n"
     79     "for whence are:\n"
     80     "\n"
     81     "* 0 -- start of stream (the default); offset should be zero or positive\n"
     82     "* 1 -- current stream position; offset may be negative\n"
     83     "* 2 -- end of stream; offset is usually negative\n"
     84     "\n"
     85     "Return the new absolute position.");
     86 
     87 static PyObject *
     88 iobase_seek(PyObject *self, PyObject *args)
     89 {
     90     return iobase_unsupported("seek");
     91 }
     92 
     93 PyDoc_STRVAR(iobase_tell_doc,
     94              "Return current stream position.");
     95 
     96 static PyObject *
     97 iobase_tell(PyObject *self, PyObject *args)
     98 {
     99     return PyObject_CallMethod(self, "seek", "ii", 0, 1);
    100 }
    101 
    102 PyDoc_STRVAR(iobase_truncate_doc,
    103     "Truncate file to size bytes.\n"
    104     "\n"
    105     "File pointer is left unchanged.  Size defaults to the current IO\n"
    106     "position as reported by tell().  Returns the new size.");
    107 
    108 static PyObject *
    109 iobase_truncate(PyObject *self, PyObject *args)
    110 {
    111     return iobase_unsupported("truncate");
    112 }
    113 
    114 /* Flush and close methods */
    115 
    116 PyDoc_STRVAR(iobase_flush_doc,
    117     "Flush write buffers, if applicable.\n"
    118     "\n"
    119     "This is not implemented for read-only and non-blocking streams.\n");
    120 
    121 static PyObject *
    122 iobase_flush(PyObject *self, PyObject *args)
    123 {
    124     /* XXX Should this return the number of bytes written??? */
    125     if (IS_CLOSED(self)) {
    126         PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
    127         return NULL;
    128     }
    129     Py_RETURN_NONE;
    130 }
    131 
    132 PyDoc_STRVAR(iobase_close_doc,
    133     "Flush and close the IO object.\n"
    134     "\n"
    135     "This method has no effect if the file is already closed.\n");
    136 
    137 static int
    138 iobase_closed(PyObject *self)
    139 {
    140     PyObject *res;
    141     int closed;
    142     /* This gets the derived attribute, which is *not* __IOBase_closed
    143        in most cases! */
    144     res = PyObject_GetAttr(self, _PyIO_str_closed);
    145     if (res == NULL)
    146         return 0;
    147     closed = PyObject_IsTrue(res);
    148     Py_DECREF(res);
    149     return closed;
    150 }
    151 
    152 static PyObject *
    153 iobase_closed_get(PyObject *self, void *context)
    154 {
    155     return PyBool_FromLong(IS_CLOSED(self));
    156 }
    157 
    158 PyObject *
    159 _PyIOBase_check_closed(PyObject *self, PyObject *args)
    160 {
    161     if (iobase_closed(self)) {
    162         PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
    163         return NULL;
    164     }
    165     if (args == Py_True)
    166         return Py_None;
    167     else
    168         Py_RETURN_NONE;
    169 }
    170 
    171 /* XXX: IOBase thinks it has to maintain its own internal state in
    172    `__IOBase_closed` and call flush() by itself, but it is redundant with
    173    whatever behaviour a non-trivial derived class will implement. */
    174 
    175 static PyObject *
    176 iobase_close(PyObject *self, PyObject *args)
    177 {
    178     PyObject *res;
    179 
    180     if (IS_CLOSED(self))
    181         Py_RETURN_NONE;
    182 
    183     res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL);
    184     PyObject_SetAttrString(self, "__IOBase_closed", Py_True);
    185     if (res == NULL) {
    186         return NULL;
    187     }
    188     Py_XDECREF(res);
    189     Py_RETURN_NONE;
    190 }
    191 
    192 /* Finalization and garbage collection support */
    193 
    194 int
    195 _PyIOBase_finalize(PyObject *self)
    196 {
    197     PyObject *res;
    198     PyObject *tp, *v, *tb;
    199     int closed = 1;
    200     int is_zombie;
    201 
    202     /* If _PyIOBase_finalize() is called from a destructor, we need to
    203        resurrect the object as calling close() can invoke arbitrary code. */
    204     is_zombie = (Py_REFCNT(self) == 0);
    205     if (is_zombie) {
    206         ++Py_REFCNT(self);
    207     }
    208     PyErr_Fetch(&tp, &v, &tb);
    209     /* If `closed` doesn't exist or can't be evaluated as bool, then the
    210        object is probably in an unusable state, so ignore. */
    211     res = PyObject_GetAttr(self, _PyIO_str_closed);
    212     if (res == NULL)
    213         PyErr_Clear();
    214     else {
    215         closed = PyObject_IsTrue(res);
    216         Py_DECREF(res);
    217         if (closed == -1)
    218             PyErr_Clear();
    219     }
    220     if (closed == 0) {
    221         res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close,
    222                                           NULL);
    223         /* Silencing I/O errors is bad, but printing spurious tracebacks is
    224            equally as bad, and potentially more frequent (because of
    225            shutdown issues). */
    226         if (res == NULL)
    227             PyErr_Clear();
    228         else
    229             Py_DECREF(res);
    230     }
    231     PyErr_Restore(tp, v, tb);
    232     if (is_zombie) {
    233         if (--Py_REFCNT(self) != 0) {
    234             /* The object lives again. The following code is taken from
    235                slot_tp_del in typeobject.c. */
    236             Py_ssize_t refcnt = Py_REFCNT(self);
    237             _Py_NewReference(self);
    238             Py_REFCNT(self) = refcnt;
    239             /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
    240              * we need to undo that. */
    241             _Py_DEC_REFTOTAL;
    242             /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
    243              * chain, so no more to do there.
    244              * If COUNT_ALLOCS, the original decref bumped tp_frees, and
    245              * _Py_NewReference bumped tp_allocs:  both of those need to be
    246              * undone.
    247              */
    248 #ifdef COUNT_ALLOCS
    249             --Py_TYPE(self)->tp_frees;
    250             --Py_TYPE(self)->tp_allocs;
    251 #endif
    252             return -1;
    253         }
    254     }
    255     return 0;
    256 }
    257 
    258 static int
    259 iobase_traverse(iobase *self, visitproc visit, void *arg)
    260 {
    261     Py_VISIT(self->dict);
    262     return 0;
    263 }
    264 
    265 static int
    266 iobase_clear(iobase *self)
    267 {
    268     if (_PyIOBase_finalize((PyObject *) self) < 0)
    269         return -1;
    270     Py_CLEAR(self->dict);
    271     return 0;
    272 }
    273 
    274 /* Destructor */
    275 
    276 static void
    277 iobase_dealloc(iobase *self)
    278 {
    279     /* NOTE: since IOBaseObject has its own dict, Python-defined attributes
    280        are still available here for close() to use.
    281        However, if the derived class declares a __slots__, those slots are
    282        already gone.
    283     */
    284     if (_PyIOBase_finalize((PyObject *) self) < 0) {
    285         /* When called from a heap type's dealloc, the type will be
    286            decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */
    287         if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE))
    288             Py_INCREF(Py_TYPE(self));
    289         return;
    290     }
    291     _PyObject_GC_UNTRACK(self);
    292     if (self->weakreflist != NULL)
    293         PyObject_ClearWeakRefs((PyObject *) self);
    294     Py_CLEAR(self->dict);
    295     Py_TYPE(self)->tp_free((PyObject *) self);
    296 }
    297 
    298 /* Inquiry methods */
    299 
    300 PyDoc_STRVAR(iobase_seekable_doc,
    301     "Return whether object supports random access.\n"
    302     "\n"
    303     "If False, seek(), tell() and truncate() will raise IOError.\n"
    304     "This method may need to do a test seek().");
    305 
    306 static PyObject *
    307 iobase_seekable(PyObject *self, PyObject *args)
    308 {
    309     Py_RETURN_FALSE;
    310 }
    311 
    312 PyObject *
    313 _PyIOBase_check_seekable(PyObject *self, PyObject *args)
    314 {
    315     PyObject *res  = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL);
    316     if (res == NULL)
    317         return NULL;
    318     if (res != Py_True) {
    319         Py_CLEAR(res);
    320         PyErr_SetString(PyExc_IOError, "File or stream is not seekable.");
    321         return NULL;
    322     }
    323     if (args == Py_True) {
    324         Py_DECREF(res);
    325     }
    326     return res;
    327 }
    328 
    329 PyDoc_STRVAR(iobase_readable_doc,
    330     "Return whether object was opened for reading.\n"
    331     "\n"
    332     "If False, read() will raise IOError.");
    333 
    334 static PyObject *
    335 iobase_readable(PyObject *self, PyObject *args)
    336 {
    337     Py_RETURN_FALSE;
    338 }
    339 
    340 /* May be called with any object */
    341 PyObject *
    342 _PyIOBase_check_readable(PyObject *self, PyObject *args)
    343 {
    344     PyObject *res  = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL);
    345     if (res == NULL)
    346         return NULL;
    347     if (res != Py_True) {
    348         Py_CLEAR(res);
    349         PyErr_SetString(PyExc_IOError, "File or stream is not readable.");
    350         return NULL;
    351     }
    352     if (args == Py_True) {
    353         Py_DECREF(res);
    354     }
    355     return res;
    356 }
    357 
    358 PyDoc_STRVAR(iobase_writable_doc,
    359     "Return whether object was opened for writing.\n"
    360     "\n"
    361     "If False, read() will raise IOError.");
    362 
    363 static PyObject *
    364 iobase_writable(PyObject *self, PyObject *args)
    365 {
    366     Py_RETURN_FALSE;
    367 }
    368 
    369 /* May be called with any object */
    370 PyObject *
    371 _PyIOBase_check_writable(PyObject *self, PyObject *args)
    372 {
    373     PyObject *res  = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL);
    374     if (res == NULL)
    375         return NULL;
    376     if (res != Py_True) {
    377         Py_CLEAR(res);
    378         PyErr_SetString(PyExc_IOError, "File or stream is not writable.");
    379         return NULL;
    380     }
    381     if (args == Py_True) {
    382         Py_DECREF(res);
    383     }
    384     return res;
    385 }
    386 
    387 /* Context manager */
    388 
    389 static PyObject *
    390 iobase_enter(PyObject *self, PyObject *args)
    391 {
    392     if (_PyIOBase_check_closed(self, Py_True) == NULL)
    393         return NULL;
    394 
    395     Py_INCREF(self);
    396     return self;
    397 }
    398 
    399 static PyObject *
    400 iobase_exit(PyObject *self, PyObject *args)
    401 {
    402     return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
    403 }
    404 
    405 /* Lower-level APIs */
    406 
    407 /* XXX Should these be present even if unimplemented? */
    408 
    409 PyDoc_STRVAR(iobase_fileno_doc,
    410     "Returns underlying file descriptor if one exists.\n"
    411     "\n"
    412     "An IOError is raised if the IO object does not use a file descriptor.\n");
    413 
    414 static PyObject *
    415 iobase_fileno(PyObject *self, PyObject *args)
    416 {
    417     return iobase_unsupported("fileno");
    418 }
    419 
    420 PyDoc_STRVAR(iobase_isatty_doc,
    421     "Return whether this is an 'interactive' stream.\n"
    422     "\n"
    423     "Return False if it can't be determined.\n");
    424 
    425 static PyObject *
    426 iobase_isatty(PyObject *self, PyObject *args)
    427 {
    428     if (_PyIOBase_check_closed(self, Py_True) == NULL)
    429         return NULL;
    430     Py_RETURN_FALSE;
    431 }
    432 
    433 /* Readline(s) and writelines */
    434 
    435 PyDoc_STRVAR(iobase_readline_doc,
    436     "Read and return a line from the stream.\n"
    437     "\n"
    438     "If limit is specified, at most limit bytes will be read.\n"
    439     "\n"
    440     "The line terminator is always b'\\n' for binary files; for text\n"
    441     "files, the newlines argument to open can be used to select the line\n"
    442     "terminator(s) recognized.\n");
    443 
    444 static PyObject *
    445 iobase_readline(PyObject *self, PyObject *args)
    446 {
    447     /* For backwards compatibility, a (slowish) readline(). */
    448 
    449     Py_ssize_t limit = -1;
    450     int has_peek = 0;
    451     PyObject *buffer, *result;
    452     Py_ssize_t old_size = -1;
    453 
    454     if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
    455         return NULL;
    456     }
    457 
    458     if (PyObject_HasAttrString(self, "peek"))
    459         has_peek = 1;
    460 
    461     buffer = PyByteArray_FromStringAndSize(NULL, 0);
    462     if (buffer == NULL)
    463         return NULL;
    464 
    465     while (limit < 0 || Py_SIZE(buffer) < limit) {
    466         Py_ssize_t nreadahead = 1;
    467         PyObject *b;
    468 
    469         if (has_peek) {
    470             PyObject *readahead = PyObject_CallMethod(self, "peek", "i", 1);
    471             if (readahead == NULL) {
    472                 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
    473                    when EINTR occurs so we needn't do it ourselves. */
    474                 if (_PyIO_trap_eintr()) {
    475                     continue;
    476                 }
    477                 goto fail;
    478             }
    479             if (!PyBytes_Check(readahead)) {
    480                 PyErr_Format(PyExc_IOError,
    481                              "peek() should have returned a bytes object, "
    482                              "not '%.200s'", Py_TYPE(readahead)->tp_name);
    483                 Py_DECREF(readahead);
    484                 goto fail;
    485             }
    486             if (PyBytes_GET_SIZE(readahead) > 0) {
    487                 Py_ssize_t n = 0;
    488                 const char *buf = PyBytes_AS_STRING(readahead);
    489                 if (limit >= 0) {
    490                     do {
    491                         if (n >= PyBytes_GET_SIZE(readahead) || n >= limit)
    492                             break;
    493                         if (buf[n++] == '\n')
    494                             break;
    495                     } while (1);
    496                 }
    497                 else {
    498                     do {
    499                         if (n >= PyBytes_GET_SIZE(readahead))
    500                             break;
    501                         if (buf[n++] == '\n')
    502                             break;
    503                     } while (1);
    504                 }
    505                 nreadahead = n;
    506             }
    507             Py_DECREF(readahead);
    508         }
    509 
    510         b = PyObject_CallMethod(self, "read", "n", nreadahead);
    511         if (b == NULL) {
    512             /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
    513                when EINTR occurs so we needn't do it ourselves. */
    514             if (_PyIO_trap_eintr()) {
    515                 continue;
    516             }
    517             goto fail;
    518         }
    519         if (!PyBytes_Check(b)) {
    520             PyErr_Format(PyExc_IOError,
    521                          "read() should have returned a bytes object, "
    522                          "not '%.200s'", Py_TYPE(b)->tp_name);
    523             Py_DECREF(b);
    524             goto fail;
    525         }
    526         if (PyBytes_GET_SIZE(b) == 0) {
    527             Py_DECREF(b);
    528             break;
    529         }
    530 
    531         old_size = PyByteArray_GET_SIZE(buffer);
    532         PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b));
    533         memcpy(PyByteArray_AS_STRING(buffer) + old_size,
    534                PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
    535 
    536         Py_DECREF(b);
    537 
    538         if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == '\n')
    539             break;
    540     }
    541 
    542     result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),
    543                                        PyByteArray_GET_SIZE(buffer));
    544     Py_DECREF(buffer);
    545     return result;
    546   fail:
    547     Py_DECREF(buffer);
    548     return NULL;
    549 }
    550 
    551 static PyObject *
    552 iobase_iter(PyObject *self)
    553 {
    554     if (_PyIOBase_check_closed(self, Py_True) == NULL)
    555         return NULL;
    556 
    557     Py_INCREF(self);
    558     return self;
    559 }
    560 
    561 static PyObject *
    562 iobase_iternext(PyObject *self)
    563 {
    564     PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);
    565 
    566     if (line == NULL)
    567         return NULL;
    568 
    569     if (PyObject_Size(line) == 0) {
    570         Py_DECREF(line);
    571         return NULL;
    572     }
    573 
    574     return line;
    575 }
    576 
    577 PyDoc_STRVAR(iobase_readlines_doc,
    578     "Return a list of lines from the stream.\n"
    579     "\n"
    580     "hint can be specified to control the number of lines read: no more\n"
    581     "lines will be read if the total size (in bytes/characters) of all\n"
    582     "lines so far exceeds hint.");
    583 
    584 static PyObject *
    585 iobase_readlines(PyObject *self, PyObject *args)
    586 {
    587     Py_ssize_t hint = -1, length = 0;
    588     PyObject *result;
    589 
    590     if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {
    591         return NULL;
    592     }
    593 
    594     result = PyList_New(0);
    595     if (result == NULL)
    596         return NULL;
    597 
    598     if (hint <= 0) {
    599         /* XXX special-casing this made sense in the Python version in order
    600            to remove the bytecode interpretation overhead, but it could
    601            probably be removed here. */
    602         PyObject *ret = PyObject_CallMethod(result, "extend", "O", self);
    603         if (ret == NULL) {
    604             Py_DECREF(result);
    605             return NULL;
    606         }
    607         Py_DECREF(ret);
    608         return result;
    609     }
    610 
    611     while (1) {
    612         PyObject *line = PyIter_Next(self);
    613         if (line == NULL) {
    614             if (PyErr_Occurred()) {
    615                 Py_DECREF(result);
    616                 return NULL;
    617             }
    618             else
    619                 break; /* StopIteration raised */
    620         }
    621 
    622         if (PyList_Append(result, line) < 0) {
    623             Py_DECREF(line);
    624             Py_DECREF(result);
    625             return NULL;
    626         }
    627         length += PyObject_Size(line);
    628         Py_DECREF(line);
    629 
    630         if (length > hint)
    631             break;
    632     }
    633     return result;
    634 }
    635 
    636 static PyObject *
    637 iobase_writelines(PyObject *self, PyObject *args)
    638 {
    639     PyObject *lines, *iter, *res;
    640 
    641     if (!PyArg_ParseTuple(args, "O:writelines", &lines)) {
    642         return NULL;
    643     }
    644 
    645     if (_PyIOBase_check_closed(self, Py_True) == NULL)
    646         return NULL;
    647 
    648     iter = PyObject_GetIter(lines);
    649     if (iter == NULL)
    650         return NULL;
    651 
    652     while (1) {
    653         PyObject *line = PyIter_Next(iter);
    654         if (line == NULL) {
    655             if (PyErr_Occurred()) {
    656                 Py_DECREF(iter);
    657                 return NULL;
    658             }
    659             else
    660                 break; /* Stop Iteration */
    661         }
    662 
    663         res = NULL;
    664         do {
    665             res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);
    666         } while (res == NULL && _PyIO_trap_eintr());
    667         Py_DECREF(line);
    668         if (res == NULL) {
    669             Py_DECREF(iter);
    670             return NULL;
    671         }
    672         Py_DECREF(res);
    673     }
    674     Py_DECREF(iter);
    675     Py_RETURN_NONE;
    676 }
    677 
    678 static PyMethodDef iobase_methods[] = {
    679     {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc},
    680     {"tell", iobase_tell, METH_NOARGS, iobase_tell_doc},
    681     {"truncate", iobase_truncate, METH_VARARGS, iobase_truncate_doc},
    682     {"flush", iobase_flush, METH_NOARGS, iobase_flush_doc},
    683     {"close", iobase_close, METH_NOARGS, iobase_close_doc},
    684 
    685     {"seekable", iobase_seekable, METH_NOARGS, iobase_seekable_doc},
    686     {"readable", iobase_readable, METH_NOARGS, iobase_readable_doc},
    687     {"writable", iobase_writable, METH_NOARGS, iobase_writable_doc},
    688 
    689     {"_checkClosed",   _PyIOBase_check_closed, METH_NOARGS},
    690     {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
    691     {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
    692     {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
    693 
    694     {"fileno", iobase_fileno, METH_NOARGS, iobase_fileno_doc},
    695     {"isatty", iobase_isatty, METH_NOARGS, iobase_isatty_doc},
    696 
    697     {"__enter__", iobase_enter, METH_NOARGS},
    698     {"__exit__", iobase_exit, METH_VARARGS},
    699 
    700     {"readline", iobase_readline, METH_VARARGS, iobase_readline_doc},
    701     {"readlines", iobase_readlines, METH_VARARGS, iobase_readlines_doc},
    702     {"writelines", iobase_writelines, METH_VARARGS},
    703 
    704     {NULL, NULL}
    705 };
    706 
    707 static PyGetSetDef iobase_getset[] = {
    708     {"closed", (getter)iobase_closed_get, NULL, NULL},
    709     {NULL}
    710 };
    711 
    712 
    713 PyTypeObject PyIOBase_Type = {
    714     PyVarObject_HEAD_INIT(NULL, 0)
    715     "_io._IOBase",              /*tp_name*/
    716     sizeof(iobase),             /*tp_basicsize*/
    717     0,                          /*tp_itemsize*/
    718     (destructor)iobase_dealloc, /*tp_dealloc*/
    719     0,                          /*tp_print*/
    720     0,                          /*tp_getattr*/
    721     0,                          /*tp_setattr*/
    722     0,                          /*tp_compare */
    723     0,                          /*tp_repr*/
    724     0,                          /*tp_as_number*/
    725     0,                          /*tp_as_sequence*/
    726     0,                          /*tp_as_mapping*/
    727     0,                          /*tp_hash */
    728     0,                          /*tp_call*/
    729     0,                          /*tp_str*/
    730     0,                          /*tp_getattro*/
    731     0,                          /*tp_setattro*/
    732     0,                          /*tp_as_buffer*/
    733     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
    734         | Py_TPFLAGS_HAVE_GC,   /*tp_flags*/
    735     iobase_doc,                 /* tp_doc */
    736     (traverseproc)iobase_traverse, /* tp_traverse */
    737     (inquiry)iobase_clear,      /* tp_clear */
    738     0,                          /* tp_richcompare */
    739     offsetof(iobase, weakreflist), /* tp_weaklistoffset */
    740     iobase_iter,                /* tp_iter */
    741     iobase_iternext,            /* tp_iternext */
    742     iobase_methods,             /* tp_methods */
    743     0,                          /* tp_members */
    744     iobase_getset,              /* tp_getset */
    745     0,                          /* tp_base */
    746     0,                          /* tp_dict */
    747     0,                          /* tp_descr_get */
    748     0,                          /* tp_descr_set */
    749     offsetof(iobase, dict),     /* tp_dictoffset */
    750     0,                          /* tp_init */
    751     0,                          /* tp_alloc */
    752     PyType_GenericNew,          /* tp_new */
    753 };
    754 
    755 
    756 /*
    757  * RawIOBase class, Inherits from IOBase.
    758  */
    759 PyDoc_STRVAR(rawiobase_doc,
    760              "Base class for raw binary I/O.");
    761 
    762 /*
    763  * The read() method is implemented by calling readinto(); derived classes
    764  * that want to support read() only need to implement readinto() as a
    765  * primitive operation.  In general, readinto() can be more efficient than
    766  * read().
    767  *
    768  * (It would be tempting to also provide an implementation of readinto() in
    769  * terms of read(), in case the latter is a more suitable primitive operation,
    770  * but that would lead to nasty recursion in case a subclass doesn't implement
    771  * either.)
    772 */
    773 
    774 static PyObject *
    775 rawiobase_read(PyObject *self, PyObject *args)
    776 {
    777     Py_ssize_t n = -1;
    778     PyObject *b, *res;
    779 
    780     if (!PyArg_ParseTuple(args, "|n:read", &n)) {
    781         return NULL;
    782     }
    783 
    784     if (n < 0)
    785         return PyObject_CallMethod(self, "readall", NULL);
    786 
    787     /* TODO: allocate a bytes object directly instead and manually construct
    788        a writable memoryview pointing to it. */
    789     b = PyByteArray_FromStringAndSize(NULL, n);
    790     if (b == NULL)
    791         return NULL;
    792 
    793     res = PyObject_CallMethodObjArgs(self, _PyIO_str_readinto, b, NULL);
    794     if (res == NULL || res == Py_None) {
    795         Py_DECREF(b);
    796         return res;
    797     }
    798 
    799     n = PyNumber_AsSsize_t(res, PyExc_ValueError);
    800     Py_DECREF(res);
    801     if (n == -1 && PyErr_Occurred()) {
    802         Py_DECREF(b);
    803         return NULL;
    804     }
    805 
    806     res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n);
    807     Py_DECREF(b);
    808     return res;
    809 }
    810 
    811 
    812 PyDoc_STRVAR(rawiobase_readall_doc,
    813              "Read until EOF, using multiple read() call.");
    814 
    815 static PyObject *
    816 rawiobase_readall(PyObject *self, PyObject *args)
    817 {
    818     int r;
    819     PyObject *chunks = PyList_New(0);
    820     PyObject *result;
    821 
    822     if (chunks == NULL)
    823         return NULL;
    824 
    825     while (1) {
    826         PyObject *data = PyObject_CallMethod(self, "read",
    827                                              "i", DEFAULT_BUFFER_SIZE);
    828         if (!data) {
    829             /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
    830                when EINTR occurs so we needn't do it ourselves. */
    831             if (_PyIO_trap_eintr()) {
    832                 continue;
    833             }
    834             Py_DECREF(chunks);
    835             return NULL;
    836         }
    837         if (data == Py_None) {
    838             if (PyList_GET_SIZE(chunks) == 0) {
    839                 Py_DECREF(chunks);
    840                 return data;
    841             }
    842             Py_DECREF(data);
    843             break;
    844         }
    845         if (!PyBytes_Check(data)) {
    846             Py_DECREF(chunks);
    847             Py_DECREF(data);
    848             PyErr_SetString(PyExc_TypeError, "read() should return bytes");
    849             return NULL;
    850         }
    851         if (PyBytes_GET_SIZE(data) == 0) {
    852             /* EOF */
    853             Py_DECREF(data);
    854             break;
    855         }
    856         r = PyList_Append(chunks, data);
    857         Py_DECREF(data);
    858         if (r < 0) {
    859             Py_DECREF(chunks);
    860             return NULL;
    861         }
    862     }
    863     result = _PyBytes_Join(_PyIO_empty_bytes, chunks);
    864     Py_DECREF(chunks);
    865     return result;
    866 }
    867 
    868 static PyMethodDef rawiobase_methods[] = {
    869     {"read", rawiobase_read, METH_VARARGS},
    870     {"readall", rawiobase_readall, METH_NOARGS, rawiobase_readall_doc},
    871     {NULL, NULL}
    872 };
    873 
    874 PyTypeObject PyRawIOBase_Type = {
    875     PyVarObject_HEAD_INIT(NULL, 0)
    876     "_io._RawIOBase",                /*tp_name*/
    877     0,                          /*tp_basicsize*/
    878     0,                          /*tp_itemsize*/
    879     0,                          /*tp_dealloc*/
    880     0,                          /*tp_print*/
    881     0,                          /*tp_getattr*/
    882     0,                          /*tp_setattr*/
    883     0,                          /*tp_compare */
    884     0,                          /*tp_repr*/
    885     0,                          /*tp_as_number*/
    886     0,                          /*tp_as_sequence*/
    887     0,                          /*tp_as_mapping*/
    888     0,                          /*tp_hash */
    889     0,                          /*tp_call*/
    890     0,                          /*tp_str*/
    891     0,                          /*tp_getattro*/
    892     0,                          /*tp_setattro*/
    893     0,                          /*tp_as_buffer*/
    894     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/
    895     rawiobase_doc,              /* tp_doc */
    896     0,                          /* tp_traverse */
    897     0,                          /* tp_clear */
    898     0,                          /* tp_richcompare */
    899     0,                          /* tp_weaklistoffset */
    900     0,                          /* tp_iter */
    901     0,                          /* tp_iternext */
    902     rawiobase_methods,          /* tp_methods */
    903     0,                          /* tp_members */
    904     0,                          /* tp_getset */
    905     &PyIOBase_Type,             /* tp_base */
    906     0,                          /* tp_dict */
    907     0,                          /* tp_descr_get */
    908     0,                          /* tp_descr_set */
    909     0,                          /* tp_dictoffset */
    910     0,                          /* tp_init */
    911     0,                          /* tp_alloc */
    912     0,                          /* tp_new */
    913 };
    914