Home | History | Annotate | Download | only in _io
      1 /*
      2     An implementation of the new I/O lib as defined by PEP 3116 - "New I/O"
      3 
      4     Classes defined here: UnsupportedOperation, BlockingIOError.
      5     Functions defined here: open().
      6 
      7     Mostly written by Amaury Forgeot d'Arc
      8 */
      9 
     10 #define PY_SSIZE_T_CLEAN
     11 #include "Python.h"
     12 #include "structmember.h"
     13 #include "_iomodule.h"
     14 
     15 #ifdef HAVE_SYS_TYPES_H
     16 #include <sys/types.h>
     17 #endif /* HAVE_SYS_TYPES_H */
     18 
     19 #ifdef HAVE_SYS_STAT_H
     20 #include <sys/stat.h>
     21 #endif /* HAVE_SYS_STAT_H */
     22 
     23 
     24 /* Various interned strings */
     25 
     26 PyObject *_PyIO_str_close;
     27 PyObject *_PyIO_str_closed;
     28 PyObject *_PyIO_str_decode;
     29 PyObject *_PyIO_str_encode;
     30 PyObject *_PyIO_str_fileno;
     31 PyObject *_PyIO_str_flush;
     32 PyObject *_PyIO_str_getstate;
     33 PyObject *_PyIO_str_isatty;
     34 PyObject *_PyIO_str_newlines;
     35 PyObject *_PyIO_str_nl;
     36 PyObject *_PyIO_str_read;
     37 PyObject *_PyIO_str_read1;
     38 PyObject *_PyIO_str_readable;
     39 PyObject *_PyIO_str_readinto;
     40 PyObject *_PyIO_str_readline;
     41 PyObject *_PyIO_str_reset;
     42 PyObject *_PyIO_str_seek;
     43 PyObject *_PyIO_str_seekable;
     44 PyObject *_PyIO_str_setstate;
     45 PyObject *_PyIO_str_tell;
     46 PyObject *_PyIO_str_truncate;
     47 PyObject *_PyIO_str_writable;
     48 PyObject *_PyIO_str_write;
     49 
     50 PyObject *_PyIO_empty_str;
     51 PyObject *_PyIO_empty_bytes;
     52 PyObject *_PyIO_zero;
     53 
     54 
     55 PyDoc_STRVAR(module_doc,
     57 "The io module provides the Python interfaces to stream handling. The\n"
     58 "builtin open function is defined in this module.\n"
     59 "\n"
     60 "At the top of the I/O hierarchy is the abstract base class IOBase. It\n"
     61 "defines the basic interface to a stream. Note, however, that there is no\n"
     62 "separation between reading and writing to streams; implementations are\n"
     63 "allowed to raise an IOError if they do not support a given operation.\n"
     64 "\n"
     65 "Extending IOBase is RawIOBase which deals simply with the reading and\n"
     66 "writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"
     67 "an interface to OS files.\n"
     68 "\n"
     69 "BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\n"
     70 "subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\n"
     71 "streams that are readable, writable, and both respectively.\n"
     72 "BufferedRandom provides a buffered interface to random access\n"
     73 "streams. BytesIO is a simple stream of in-memory bytes.\n"
     74 "\n"
     75 "Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"
     76 "of streams into text. TextIOWrapper, which extends it, is a buffered text\n"
     77 "interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"
     78 "is a in-memory stream for text.\n"
     79 "\n"
     80 "Argument names are not part of the specification, and only the arguments\n"
     81 "of open() are intended to be used as keyword arguments.\n"
     82 "\n"
     83 "data:\n"
     84 "\n"
     85 "DEFAULT_BUFFER_SIZE\n"
     86 "\n"
     87 "   An int containing the default buffer size used by the module's buffered\n"
     88 "   I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n"
     89 "   possible.\n"
     90     );
     91 
     92 
     94 /*
     95  * BlockingIOError extends IOError
     96  */
     97 
     98 static int
     99 blockingioerror_init(PyBlockingIOErrorObject *self, PyObject *args,
    100                      PyObject *kwds)
    101 {
    102     PyObject *myerrno = NULL, *strerror = NULL;
    103     PyObject *baseargs = NULL;
    104     Py_ssize_t written = 0;
    105 
    106     assert(PyTuple_Check(args));
    107 
    108     self->written = 0;
    109     if (!PyArg_ParseTuple(args, "OO|n:BlockingIOError",
    110                           &myerrno, &strerror, &written))
    111         return -1;
    112 
    113     baseargs = PyTuple_Pack(2, myerrno, strerror);
    114     if (baseargs == NULL)
    115         return -1;
    116     /* This will take care of initializing of myerrno and strerror members */
    117     if (((PyTypeObject *)PyExc_IOError)->tp_init(
    118                 (PyObject *)self, baseargs, kwds) == -1) {
    119         Py_DECREF(baseargs);
    120         return -1;
    121     }
    122     Py_DECREF(baseargs);
    123 
    124     self->written = written;
    125     return 0;
    126 }
    127 
    128 static PyMemberDef blockingioerror_members[] = {
    129     {"characters_written", T_PYSSIZET, offsetof(PyBlockingIOErrorObject, written), 0},
    130     {NULL}  /* Sentinel */
    131 };
    132 
    133 static PyTypeObject _PyExc_BlockingIOError = {
    134     PyVarObject_HEAD_INIT(NULL, 0)
    135     "BlockingIOError", /*tp_name*/
    136     sizeof(PyBlockingIOErrorObject), /*tp_basicsize*/
    137     0,                          /*tp_itemsize*/
    138     0,                          /*tp_dealloc*/
    139     0,                          /*tp_print*/
    140     0,                          /*tp_getattr*/
    141     0,                          /*tp_setattr*/
    142     0,                          /*tp_compare */
    143     0,                          /*tp_repr*/
    144     0,                          /*tp_as_number*/
    145     0,                          /*tp_as_sequence*/
    146     0,                          /*tp_as_mapping*/
    147     0,                          /*tp_hash */
    148     0,                          /*tp_call*/
    149     0,                          /*tp_str*/
    150     0,                          /*tp_getattro*/
    151     0,                          /*tp_setattro*/
    152     0,                          /*tp_as_buffer*/
    153     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
    154     PyDoc_STR("Exception raised when I/O would block "
    155               "on a non-blocking I/O stream"), /* tp_doc */
    156     0,                          /* tp_traverse */
    157     0,                          /* tp_clear */
    158     0,                          /* tp_richcompare */
    159     0,                          /* tp_weaklistoffset */
    160     0,                          /* tp_iter */
    161     0,                          /* tp_iternext */
    162     0,                          /* tp_methods */
    163     blockingioerror_members,    /* tp_members */
    164     0,                          /* tp_getset */
    165     0,                          /* tp_base */
    166     0,                          /* tp_dict */
    167     0,                          /* tp_descr_get */
    168     0,                          /* tp_descr_set */
    169     0,                          /* tp_dictoffset */
    170     (initproc)blockingioerror_init, /* tp_init */
    171     0,                          /* tp_alloc */
    172     0,                          /* tp_new */
    173 };
    174 PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError;
    175 
    176 
    178 /*
    179  * The main open() function
    180  */
    181 PyDoc_STRVAR(open_doc,
    182 "Open file and return a stream.  Raise IOError upon failure.\n"
    183 "\n"
    184 "file is either a text or byte string giving the name (and the path\n"
    185 "if the file isn't in the current working directory) of the file to\n"
    186 "be opened or an integer file descriptor of the file to be\n"
    187 "wrapped. (If a file descriptor is given, it is closed when the\n"
    188 "returned I/O object is closed, unless closefd is set to False.)\n"
    189 "\n"
    190 "mode is an optional string that specifies the mode in which the file\n"
    191 "is opened. It defaults to 'r' which means open for reading in text\n"
    192 "mode.  Other common values are 'w' for writing (truncating the file if\n"
    193 "it already exists), and 'a' for appending (which on some Unix systems,\n"
    194 "means that all writes append to the end of the file regardless of the\n"
    195 "current seek position). In text mode, if encoding is not specified the\n"
    196 "encoding used is platform dependent. (For reading and writing raw\n"
    197 "bytes use binary mode and leave encoding unspecified.) The available\n"
    198 "modes are:\n"
    199 "\n"
    200 "========= ===============================================================\n"
    201 "Character Meaning\n"
    202 "--------- ---------------------------------------------------------------\n"
    203 "'r'       open for reading (default)\n"
    204 "'w'       open for writing, truncating the file first\n"
    205 "'a'       open for writing, appending to the end of the file if it exists\n"
    206 "'b'       binary mode\n"
    207 "'t'       text mode (default)\n"
    208 "'+'       open a disk file for updating (reading and writing)\n"
    209 "'U'       universal newline mode (for backwards compatibility; unneeded\n"
    210 "          for new code)\n"
    211 "========= ===============================================================\n"
    212 "\n"
    213 "The default mode is 'rt' (open for reading text). For binary random\n"
    214 "access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"
    215 "'r+b' opens the file without truncation.\n"
    216 "\n"
    217 "Python distinguishes between files opened in binary and text modes,\n"
    218 "even when the underlying operating system doesn't. Files opened in\n"
    219 "binary mode (appending 'b' to the mode argument) return contents as\n"
    220 "bytes objects without any decoding. In text mode (the default, or when\n"
    221 "'t' is appended to the mode argument), the contents of the file are\n"
    222 "returned as strings, the bytes having been first decoded using a\n"
    223 "platform-dependent encoding or using the specified encoding if given.\n"
    224 "\n"
    225 "buffering is an optional integer used to set the buffering policy.\n"
    226 "Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n"
    227 "line buffering (only usable in text mode), and an integer > 1 to indicate\n"
    228 "the size of a fixed-size chunk buffer.  When no buffering argument is\n"
    229 "given, the default buffering policy works as follows:\n"
    230 "\n"
    231 "* Binary files are buffered in fixed-size chunks; the size of the buffer\n"
    232 "  is chosen using a heuristic trying to determine the underlying device's\n"
    233 "  \"block size\" and falling back on `io.DEFAULT_BUFFER_SIZE`.\n"
    234 "  On many systems, the buffer will typically be 4096 or 8192 bytes long.\n"
    235 "\n"
    236 "* \"Interactive\" text files (files for which isatty() returns True)\n"
    237 "  use line buffering.  Other text files use the policy described above\n"
    238 "  for binary files.\n"
    239 "\n"
    240 "encoding is the name of the encoding used to decode or encode the\n"
    241 "file. This should only be used in text mode. The default encoding is\n"
    242 "platform dependent, but any encoding supported by Python can be\n"
    243 "passed.  See the codecs module for the list of supported encodings.\n"
    244 "\n"
    245 "errors is an optional string that specifies how encoding errors are to\n"
    246 "be handled---this argument should not be used in binary mode. Pass\n"
    247 "'strict' to raise a ValueError exception if there is an encoding error\n"
    248 "(the default of None has the same effect), or pass 'ignore' to ignore\n"
    249 "errors. (Note that ignoring encoding errors can lead to data loss.)\n"
    250 "See the documentation for codecs.register for a list of the permitted\n"
    251 "encoding error strings.\n"
    252 "\n"
    253 "newline controls how universal newlines works (it only applies to text\n"
    254 "mode). It can be None, '', '\\n', '\\r', and '\\r\\n'.  It works as\n"
    255 "follows:\n"
    256 "\n"
    257 "* On input, if newline is None, universal newlines mode is\n"
    258 "  enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"
    259 "  these are translated into '\\n' before being returned to the\n"
    260 "  caller. If it is '', universal newline mode is enabled, but line\n"
    261 "  endings are returned to the caller untranslated. If it has any of\n"
    262 "  the other legal values, input lines are only terminated by the given\n"
    263 "  string, and the line ending is returned to the caller untranslated.\n"
    264 "\n"
    265 "* On output, if newline is None, any '\\n' characters written are\n"
    266 "  translated to the system default line separator, os.linesep. If\n"
    267 "  newline is '', no translation takes place. If newline is any of the\n"
    268 "  other legal values, any '\\n' characters written are translated to\n"
    269 "  the given string.\n"
    270 "\n"
    271 "If closefd is False, the underlying file descriptor will be kept open\n"
    272 "when the file is closed. This does not work when a file name is given\n"
    273 "and must be True in that case.\n"
    274 "\n"
    275 "open() returns a file object whose type depends on the mode, and\n"
    276 "through which the standard file operations such as reading and writing\n"
    277 "are performed. When open() is used to open a file in a text mode ('w',\n"
    278 "'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open\n"
    279 "a file in a binary mode, the returned class varies: in read binary\n"
    280 "mode, it returns a BufferedReader; in write binary and append binary\n"
    281 "modes, it returns a BufferedWriter, and in read/write mode, it returns\n"
    282 "a BufferedRandom.\n"
    283 "\n"
    284 "It is also possible to use a string or bytearray as a file for both\n"
    285 "reading and writing. For strings StringIO can be used like a file\n"
    286 "opened in a text mode, and for bytes a BytesIO can be used like a file\n"
    287 "opened in a binary mode.\n"
    288     );
    289 
    290 static PyObject *
    291 io_open(PyObject *self, PyObject *args, PyObject *kwds)
    292 {
    293     char *kwlist[] = {"file", "mode", "buffering",
    294                       "encoding", "errors", "newline",
    295                       "closefd", NULL};
    296     PyObject *file;
    297     char *mode = "r";
    298     int buffering = -1, closefd = 1;
    299     char *encoding = NULL, *errors = NULL, *newline = NULL;
    300     unsigned i;
    301 
    302     int reading = 0, writing = 0, appending = 0, updating = 0;
    303     int text = 0, binary = 0, universal = 0;
    304 
    305     char rawmode[5], *m;
    306     int line_buffering;
    307     long isatty;
    308 
    309     PyObject *raw, *modeobj = NULL, *buffer, *wrapper, *result = NULL;
    310 
    311     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist,
    312                                      &file, &mode, &buffering,
    313                                      &encoding, &errors, &newline,
    314                                      &closefd)) {
    315         return NULL;
    316     }
    317 
    318     if (!PyUnicode_Check(file) &&
    319 	!PyBytes_Check(file) &&
    320 	!PyNumber_Check(file)) {
    321         PyObject *repr = PyObject_Repr(file);
    322         if (repr != NULL) {
    323             PyErr_Format(PyExc_TypeError, "invalid file: %s",
    324                          PyString_AS_STRING(repr));
    325             Py_DECREF(repr);
    326         }
    327         return NULL;
    328     }
    329 
    330     /* Decode mode */
    331     for (i = 0; i < strlen(mode); i++) {
    332         char c = mode[i];
    333 
    334         switch (c) {
    335         case 'r':
    336             reading = 1;
    337             break;
    338         case 'w':
    339             writing = 1;
    340             break;
    341         case 'a':
    342             appending = 1;
    343             break;
    344         case '+':
    345             updating = 1;
    346             break;
    347         case 't':
    348             text = 1;
    349             break;
    350         case 'b':
    351             binary = 1;
    352             break;
    353         case 'U':
    354             universal = 1;
    355             reading = 1;
    356             break;
    357         default:
    358             goto invalid_mode;
    359         }
    360 
    361         /* c must not be duplicated */
    362         if (strchr(mode+i+1, c)) {
    363           invalid_mode:
    364             PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);
    365             return NULL;
    366         }
    367 
    368     }
    369 
    370     m = rawmode;
    371     if (reading)   *(m++) = 'r';
    372     if (writing)   *(m++) = 'w';
    373     if (appending) *(m++) = 'a';
    374     if (updating)  *(m++) = '+';
    375     *m = '\0';
    376 
    377     /* Parameters validation */
    378     if (universal) {
    379         if (writing || appending) {
    380             PyErr_SetString(PyExc_ValueError,
    381                             "can't use U and writing mode at once");
    382             return NULL;
    383         }
    384         reading = 1;
    385     }
    386 
    387     if (text && binary) {
    388         PyErr_SetString(PyExc_ValueError,
    389                         "can't have text and binary mode at once");
    390         return NULL;
    391     }
    392 
    393     if (reading + writing + appending > 1) {
    394         PyErr_SetString(PyExc_ValueError,
    395                         "must have exactly one of read/write/append mode");
    396         return NULL;
    397     }
    398 
    399     if (binary && encoding != NULL) {
    400         PyErr_SetString(PyExc_ValueError,
    401                         "binary mode doesn't take an encoding argument");
    402         return NULL;
    403     }
    404 
    405     if (binary && errors != NULL) {
    406         PyErr_SetString(PyExc_ValueError,
    407                         "binary mode doesn't take an errors argument");
    408         return NULL;
    409     }
    410 
    411     if (binary && newline != NULL) {
    412         PyErr_SetString(PyExc_ValueError,
    413                         "binary mode doesn't take a newline argument");
    414         return NULL;
    415     }
    416 
    417     /* Create the Raw file stream */
    418     raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
    419 				"Osi", file, rawmode, closefd);
    420     if (raw == NULL)
    421         return NULL;
    422     result = raw;
    423 
    424     modeobj = PyUnicode_FromString(mode);
    425     if (modeobj == NULL)
    426         goto error;
    427 
    428     /* buffering */
    429     {
    430         PyObject *res = PyObject_CallMethod(raw, "isatty", NULL);
    431         if (res == NULL)
    432             goto error;
    433         isatty = PyLong_AsLong(res);
    434         Py_DECREF(res);
    435         if (isatty == -1 && PyErr_Occurred())
    436             goto error;
    437     }
    438 
    439     if (buffering == 1 || (buffering < 0 && isatty)) {
    440         buffering = -1;
    441         line_buffering = 1;
    442     }
    443     else
    444         line_buffering = 0;
    445 
    446     if (buffering < 0) {
    447         buffering = DEFAULT_BUFFER_SIZE;
    448 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
    449         {
    450             struct stat st;
    451             int fileno;
    452             PyObject *res = PyObject_CallMethod(raw, "fileno", NULL);
    453             if (res == NULL)
    454                 goto error;
    455 
    456             fileno = _PyInt_AsInt(res);
    457             Py_DECREF(res);
    458             if (fileno == -1 && PyErr_Occurred())
    459                 goto error;
    460 
    461             if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)
    462                 buffering = st.st_blksize;
    463         }
    464 #endif
    465     }
    466     if (buffering < 0) {
    467         PyErr_SetString(PyExc_ValueError,
    468                         "invalid buffering size");
    469         goto error;
    470     }
    471 
    472     /* if not buffering, returns the raw file object */
    473     if (buffering == 0) {
    474         if (!binary) {
    475             PyErr_SetString(PyExc_ValueError,
    476                             "can't have unbuffered text I/O");
    477             goto error;
    478         }
    479 
    480         Py_DECREF(modeobj);
    481         return result;
    482     }
    483 
    484     /* wraps into a buffered file */
    485     {
    486         PyObject *Buffered_class;
    487 
    488         if (updating)
    489             Buffered_class = (PyObject *)&PyBufferedRandom_Type;
    490         else if (writing || appending)
    491             Buffered_class = (PyObject *)&PyBufferedWriter_Type;
    492         else if (reading)
    493             Buffered_class = (PyObject *)&PyBufferedReader_Type;
    494         else {
    495             PyErr_Format(PyExc_ValueError,
    496                          "unknown mode: '%s'", mode);
    497             goto error;
    498         }
    499 
    500         buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);
    501     }
    502     if (buffer == NULL)
    503         goto error;
    504     result = buffer;
    505     Py_DECREF(raw);
    506 
    507 
    508     /* if binary, returns the buffered file */
    509     if (binary) {
    510         Py_DECREF(modeobj);
    511         return result;
    512     }
    513 
    514     /* wraps into a TextIOWrapper */
    515     wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
    516 				    "Osssi",
    517 				    buffer,
    518 				    encoding, errors, newline,
    519 				    line_buffering);
    520     if (wrapper == NULL)
    521         goto error;
    522     result = wrapper;
    523     Py_DECREF(buffer);
    524 
    525     if (PyObject_SetAttrString(wrapper, "mode", modeobj) < 0)
    526         goto error;
    527     Py_DECREF(modeobj);
    528     return result;
    529 
    530   error:
    531     if (result != NULL) {
    532         PyObject *exc, *val, *tb, *close_result;
    533         PyErr_Fetch(&exc, &val, &tb);
    534         close_result = PyObject_CallMethod(result, "close", NULL);
    535         _PyErr_ReplaceException(exc, val, tb);
    536         Py_XDECREF(close_result);
    537         Py_DECREF(result);
    538     }
    539     Py_XDECREF(modeobj);
    540     return NULL;
    541 }
    542 
    543 /*
    545  * Private helpers for the io module.
    546  */
    547 
    548 Py_off_t
    549 PyNumber_AsOff_t(PyObject *item, PyObject *err)
    550 {
    551     Py_off_t result;
    552     PyObject *runerr;
    553     PyObject *value = PyNumber_Index(item);
    554     if (value == NULL)
    555         return -1;
    556 
    557     if (PyInt_Check(value)) {
    558         /* We assume a long always fits in a Py_off_t... */
    559         result = (Py_off_t) PyInt_AS_LONG(value);
    560         goto finish;
    561     }
    562 
    563     /* We're done if PyLong_AsSsize_t() returns without error. */
    564     result = PyLong_AsOff_t(value);
    565     if (result != -1 || !(runerr = PyErr_Occurred()))
    566         goto finish;
    567 
    568     /* Error handling code -- only manage OverflowError differently */
    569     if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
    570         goto finish;
    571 
    572     PyErr_Clear();
    573     /* If no error-handling desired then the default clipping
    574        is sufficient.
    575      */
    576     if (!err) {
    577         assert(PyLong_Check(value));
    578         /* Whether or not it is less than or equal to
    579            zero is determined by the sign of ob_size
    580         */
    581         if (_PyLong_Sign(value) < 0)
    582             result = PY_OFF_T_MIN;
    583         else
    584             result = PY_OFF_T_MAX;
    585     }
    586     else {
    587         /* Otherwise replace the error with caller's error object. */
    588         PyErr_Format(err,
    589                      "cannot fit '%.200s' into an offset-sized integer",
    590                      item->ob_type->tp_name);
    591     }
    592 
    593  finish:
    594     Py_DECREF(value);
    595     return result;
    596 }
    597 
    598 
    599 /* Basically the "n" format code with the ability to turn None into -1. */
    600 int
    601 _PyIO_ConvertSsize_t(PyObject *obj, void *result) {
    602     Py_ssize_t limit;
    603     if (obj == Py_None) {
    604         limit = -1;
    605     }
    606     else if (PyNumber_Check(obj)) {
    607         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
    608         if (limit == -1 && PyErr_Occurred())
    609             return 0;
    610     }
    611     else {
    612         PyErr_Format(PyExc_TypeError,
    613                      "integer argument expected, got '%.200s'",
    614                      Py_TYPE(obj)->tp_name);
    615         return 0;
    616     }
    617     *((Py_ssize_t *)result) = limit;
    618     return 1;
    619 }
    620 
    621 
    622 /*
    623  * Module definition
    624  */
    625 
    626 PyObject *_PyIO_os_module = NULL;
    627 PyObject *_PyIO_locale_module = NULL;
    628 PyObject *_PyIO_unsupported_operation = NULL;
    629 
    630 static PyMethodDef module_methods[] = {
    631     {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},
    632     {NULL, NULL}
    633 };
    634 
    635 PyMODINIT_FUNC
    636 init_io(void)
    637 {
    638     PyObject *m = Py_InitModule4("_io", module_methods,
    639                                  module_doc, NULL, PYTHON_API_VERSION);
    640     if (m == NULL)
    641         return;
    642 
    643     /* put os in the module state */
    644     _PyIO_os_module = PyImport_ImportModule("os");
    645     if (_PyIO_os_module == NULL)
    646         goto fail;
    647 
    648 #define ADD_TYPE(type, name) \
    649     if (PyType_Ready(type) < 0) \
    650         goto fail; \
    651     Py_INCREF(type); \
    652     if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {  \
    653         Py_DECREF(type); \
    654         goto fail; \
    655     }
    656 
    657     /* DEFAULT_BUFFER_SIZE */
    658     if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
    659         goto fail;
    660 
    661     /* UnsupportedOperation inherits from ValueError and IOError */
    662     _PyIO_unsupported_operation = PyObject_CallFunction(
    663         (PyObject *)&PyType_Type, "s(OO){}",
    664         "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);
    665     if (_PyIO_unsupported_operation == NULL)
    666         goto fail;
    667     Py_INCREF(_PyIO_unsupported_operation);
    668     if (PyModule_AddObject(m, "UnsupportedOperation",
    669                            _PyIO_unsupported_operation) < 0)
    670         goto fail;
    671 
    672     /* BlockingIOError */
    673     _PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError;
    674     ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError");
    675 
    676     /* Concrete base types of the IO ABCs.
    677        (the ABCs themselves are declared through inheritance in io.py)
    678     */
    679     ADD_TYPE(&PyIOBase_Type, "_IOBase");
    680     ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
    681     ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
    682     ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
    683 
    684     /* Implementation of concrete IO objects. */
    685     /* FileIO */
    686     PyFileIO_Type.tp_base = &PyRawIOBase_Type;
    687     ADD_TYPE(&PyFileIO_Type, "FileIO");
    688 
    689     /* BytesIO */
    690     PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;
    691     ADD_TYPE(&PyBytesIO_Type, "BytesIO");
    692 
    693     /* StringIO */
    694     PyStringIO_Type.tp_base = &PyTextIOBase_Type;
    695     ADD_TYPE(&PyStringIO_Type, "StringIO");
    696 
    697     /* BufferedReader */
    698     PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
    699     ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");
    700 
    701     /* BufferedWriter */
    702     PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
    703     ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");
    704 
    705     /* BufferedRWPair */
    706     PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
    707     ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");
    708 
    709     /* BufferedRandom */
    710     PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
    711     ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");
    712 
    713     /* TextIOWrapper */
    714     PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;
    715     ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");
    716 
    717     /* IncrementalNewlineDecoder */
    718     ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");
    719 
    720     /* Interned strings */
    721     if (!(_PyIO_str_close = PyString_InternFromString("close")))
    722         goto fail;
    723     if (!(_PyIO_str_closed = PyString_InternFromString("closed")))
    724         goto fail;
    725     if (!(_PyIO_str_decode = PyString_InternFromString("decode")))
    726         goto fail;
    727     if (!(_PyIO_str_encode = PyString_InternFromString("encode")))
    728         goto fail;
    729     if (!(_PyIO_str_fileno = PyString_InternFromString("fileno")))
    730         goto fail;
    731     if (!(_PyIO_str_flush = PyString_InternFromString("flush")))
    732         goto fail;
    733     if (!(_PyIO_str_getstate = PyString_InternFromString("getstate")))
    734         goto fail;
    735     if (!(_PyIO_str_isatty = PyString_InternFromString("isatty")))
    736         goto fail;
    737     if (!(_PyIO_str_newlines = PyString_InternFromString("newlines")))
    738         goto fail;
    739     if (!(_PyIO_str_nl = PyString_InternFromString("\n")))
    740         goto fail;
    741     if (!(_PyIO_str_read = PyString_InternFromString("read")))
    742         goto fail;
    743     if (!(_PyIO_str_read1 = PyString_InternFromString("read1")))
    744         goto fail;
    745     if (!(_PyIO_str_readable = PyString_InternFromString("readable")))
    746         goto fail;
    747     if (!(_PyIO_str_readinto = PyString_InternFromString("readinto")))
    748         goto fail;
    749     if (!(_PyIO_str_readline = PyString_InternFromString("readline")))
    750         goto fail;
    751     if (!(_PyIO_str_reset = PyString_InternFromString("reset")))
    752         goto fail;
    753     if (!(_PyIO_str_seek = PyString_InternFromString("seek")))
    754         goto fail;
    755     if (!(_PyIO_str_seekable = PyString_InternFromString("seekable")))
    756         goto fail;
    757     if (!(_PyIO_str_setstate = PyString_InternFromString("setstate")))
    758         goto fail;
    759     if (!(_PyIO_str_tell = PyString_InternFromString("tell")))
    760         goto fail;
    761     if (!(_PyIO_str_truncate = PyString_InternFromString("truncate")))
    762         goto fail;
    763     if (!(_PyIO_str_write = PyString_InternFromString("write")))
    764         goto fail;
    765     if (!(_PyIO_str_writable = PyString_InternFromString("writable")))
    766         goto fail;
    767 
    768     if (!(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))
    769         goto fail;
    770     if (!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
    771         goto fail;
    772     if (!(_PyIO_zero = PyLong_FromLong(0L)))
    773         goto fail;
    774 
    775     return;
    776 
    777   fail:
    778     Py_CLEAR(_PyIO_os_module);
    779     Py_CLEAR(_PyIO_unsupported_operation);
    780     Py_DECREF(m);
    781 }
    782