Python-2.7.3/Modules/_io/_iomodule.c

No issues found

  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,
 56 "The io module provides the Python interfaces to stream handling. The\n"
 57 "builtin open function is defined in this module.\n"
 58 "\n"
 59 "At the top of the I/O hierarchy is the abstract base class IOBase. It\n"
 60 "defines the basic interface to a stream. Note, however, that there is no\n"
 61 "seperation between reading and writing to streams; implementations are\n"
 62 "allowed to throw an IOError if they do not support a given operation.\n"
 63 "\n"
 64 "Extending IOBase is RawIOBase which deals simply with the reading and\n"
 65 "writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"
 66 "an interface to OS files.\n"
 67 "\n"
 68 "BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\n"
 69 "subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\n"
 70 "streams that are readable, writable, and both respectively.\n"
 71 "BufferedRandom provides a buffered interface to random access\n"
 72 "streams. BytesIO is a simple stream of in-memory bytes.\n"
 73 "\n"
 74 "Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"
 75 "of streams into text. TextIOWrapper, which extends it, is a buffered text\n"
 76 "interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"
 77 "is a in-memory stream for text.\n"
 78 "\n"
 79 "Argument names are not part of the specification, and only the arguments\n"
 80 "of open() are intended to be used as keyword arguments.\n"
 81 "\n"
 82 "data:\n"
 83 "\n"
 84 "DEFAULT_BUFFER_SIZE\n"
 85 "\n"
 86 "   An int containing the default buffer size used by the module's buffered\n"
 87 "   I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n"
 88 "   possible.\n"
 89     );
 90 

 91 
 92 /*
 93  * BlockingIOError extends IOError
 94  */
 95 
 96 static int
 97 blockingioerror_init(PyBlockingIOErrorObject *self, PyObject *args,
 98                      PyObject *kwds)
 99 {
100     PyObject *myerrno = NULL, *strerror = NULL;
101     PyObject *baseargs = NULL;
102     Py_ssize_t written = 0;
103 
104     assert(PyTuple_Check(args));
105 
106     self->written = 0;
107     if (!PyArg_ParseTuple(args, "OO|n:BlockingIOError",
108                           &myerrno, &strerror, &written))
109         return -1;
110 
111     baseargs = PyTuple_Pack(2, myerrno, strerror);
112     if (baseargs == NULL)
113         return -1;
114     /* This will take care of initializing of myerrno and strerror members */
115     if (((PyTypeObject *)PyExc_IOError)->tp_init(
116                 (PyObject *)self, baseargs, kwds) == -1) {
117         Py_DECREF(baseargs);
118         return -1;
119     }
120     Py_DECREF(baseargs);
121 
122     self->written = written;
123     return 0;
124 }
125 
126 static PyMemberDef blockingioerror_members[] = {
127     {"characters_written", T_PYSSIZET, offsetof(PyBlockingIOErrorObject, written), 0},
128     {NULL}  /* Sentinel */
129 };
130 
131 static PyTypeObject _PyExc_BlockingIOError = {
132     PyVarObject_HEAD_INIT(NULL, 0)
133     "BlockingIOError", /*tp_name*/
134     sizeof(PyBlockingIOErrorObject), /*tp_basicsize*/
135     0,                          /*tp_itemsize*/
136     0,                          /*tp_dealloc*/
137     0,                          /*tp_print*/
138     0,                          /*tp_getattr*/
139     0,                          /*tp_setattr*/
140     0,                          /*tp_compare */
141     0,                          /*tp_repr*/
142     0,                          /*tp_as_number*/
143     0,                          /*tp_as_sequence*/
144     0,                          /*tp_as_mapping*/
145     0,                          /*tp_hash */
146     0,                          /*tp_call*/
147     0,                          /*tp_str*/
148     0,                          /*tp_getattro*/
149     0,                          /*tp_setattro*/
150     0,                          /*tp_as_buffer*/
151     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
152     PyDoc_STR("Exception raised when I/O would block "
153               "on a non-blocking I/O stream"), /* tp_doc */
154     0,                          /* tp_traverse */
155     0,                          /* tp_clear */
156     0,                          /* tp_richcompare */
157     0,                          /* tp_weaklistoffset */
158     0,                          /* tp_iter */
159     0,                          /* tp_iternext */
160     0,                          /* tp_methods */
161     blockingioerror_members,    /* tp_members */
162     0,                          /* tp_getset */
163     0,                          /* tp_base */
164     0,                          /* tp_dict */
165     0,                          /* tp_descr_get */
166     0,                          /* tp_descr_set */
167     0,                          /* tp_dictoffset */
168     (initproc)blockingioerror_init, /* tp_init */
169     0,                          /* tp_alloc */
170     0,                          /* tp_new */
171 };
172 PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError;
173 

174 
175 /*
176  * The main open() function
177  */
178 PyDoc_STRVAR(open_doc,
179 "Open file and return a stream.  Raise IOError upon failure.\n"
180 "\n"
181 "file is either a text or byte string giving the name (and the path\n"
182 "if the file isn't in the current working directory) of the file to\n"
183 "be opened or an integer file descriptor of the file to be\n"
184 "wrapped. (If a file descriptor is given, it is closed when the\n"
185 "returned I/O object is closed, unless closefd is set to False.)\n"
186 "\n"
187 "mode is an optional string that specifies the mode in which the file\n"
188 "is opened. It defaults to 'r' which means open for reading in text\n"
189 "mode.  Other common values are 'w' for writing (truncating the file if\n"
190 "it already exists), and 'a' for appending (which on some Unix systems,\n"
191 "means that all writes append to the end of the file regardless of the\n"
192 "current seek position). In text mode, if encoding is not specified the\n"
193 "encoding used is platform dependent. (For reading and writing raw\n"
194 "bytes use binary mode and leave encoding unspecified.) The available\n"
195 "modes are:\n"
196 "\n"
197 "========= ===============================================================\n"
198 "Character Meaning\n"
199 "--------- ---------------------------------------------------------------\n"
200 "'r'       open for reading (default)\n"
201 "'w'       open for writing, truncating the file first\n"
202 "'a'       open for writing, appending to the end of the file if it exists\n"
203 "'b'       binary mode\n"
204 "'t'       text mode (default)\n"
205 "'+'       open a disk file for updating (reading and writing)\n"
206 "'U'       universal newline mode (for backwards compatibility; unneeded\n"
207 "          for new code)\n"
208 "========= ===============================================================\n"
209 "\n"
210 "The default mode is 'rt' (open for reading text). For binary random\n"
211 "access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"
212 "'r+b' opens the file without truncation.\n"
213 "\n"
214 "Python distinguishes between files opened in binary and text modes,\n"
215 "even when the underlying operating system doesn't. Files opened in\n"
216 "binary mode (appending 'b' to the mode argument) return contents as\n"
217 "bytes objects without any decoding. In text mode (the default, or when\n"
218 "'t' is appended to the mode argument), the contents of the file are\n"
219 "returned as strings, the bytes having been first decoded using a\n"
220 "platform-dependent encoding or using the specified encoding if given.\n"
221 "\n"
222 "buffering is an optional integer used to set the buffering policy.\n"
223 "Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n"
224 "line buffering (only usable in text mode), and an integer > 1 to indicate\n"
225 "the size of a fixed-size chunk buffer.  When no buffering argument is\n"
226 "given, the default buffering policy works as follows:\n"
227 "\n"
228 "* Binary files are buffered in fixed-size chunks; the size of the buffer\n"
229 "  is chosen using a heuristic trying to determine the underlying device's\n"
230 "  \"block size\" and falling back on `io.DEFAULT_BUFFER_SIZE`.\n"
231 "  On many systems, the buffer will typically be 4096 or 8192 bytes long.\n"
232 "\n"
233 "* \"Interactive\" text files (files for which isatty() returns True)\n"
234 "  use line buffering.  Other text files use the policy described above\n"
235 "  for binary files.\n"
236 "\n"
237 "encoding is the name of the encoding used to decode or encode the\n"
238 "file. This should only be used in text mode. The default encoding is\n"
239 "platform dependent, but any encoding supported by Python can be\n"
240 "passed.  See the codecs module for the list of supported encodings.\n"
241 "\n"
242 "errors is an optional string that specifies how encoding errors are to\n"
243 "be handled---this argument should not be used in binary mode. Pass\n"
244 "'strict' to raise a ValueError exception if there is an encoding error\n"
245 "(the default of None has the same effect), or pass 'ignore' to ignore\n"
246 "errors. (Note that ignoring encoding errors can lead to data loss.)\n"
247 "See the documentation for codecs.register for a list of the permitted\n"
248 "encoding error strings.\n"
249 "\n"
250 "newline controls how universal newlines works (it only applies to text\n"
251 "mode). It can be None, '', '\\n', '\\r', and '\\r\\n'.  It works as\n"
252 "follows:\n"
253 "\n"
254 "* On input, if newline is None, universal newlines mode is\n"
255 "  enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"
256 "  these are translated into '\\n' before being returned to the\n"
257 "  caller. If it is '', universal newline mode is enabled, but line\n"
258 "  endings are returned to the caller untranslated. If it has any of\n"
259 "  the other legal values, input lines are only terminated by the given\n"
260 "  string, and the line ending is returned to the caller untranslated.\n"
261 "\n"
262 "* On output, if newline is None, any '\\n' characters written are\n"
263 "  translated to the system default line separator, os.linesep. If\n"
264 "  newline is '', no translation takes place. If newline is any of the\n"
265 "  other legal values, any '\\n' characters written are translated to\n"
266 "  the given string.\n"
267 "\n"
268 "If closefd is False, the underlying file descriptor will be kept open\n"
269 "when the file is closed. This does not work when a file name is given\n"
270 "and must be True in that case.\n"
271 "\n"
272 "open() returns a file object whose type depends on the mode, and\n"
273 "through which the standard file operations such as reading and writing\n"
274 "are performed. When open() is used to open a file in a text mode ('w',\n"
275 "'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open\n"
276 "a file in a binary mode, the returned class varies: in read binary\n"
277 "mode, it returns a BufferedReader; in write binary and append binary\n"
278 "modes, it returns a BufferedWriter, and in read/write mode, it returns\n"
279 "a BufferedRandom.\n"
280 "\n"
281 "It is also possible to use a string or bytearray as a file for both\n"
282 "reading and writing. For strings StringIO can be used like a file\n"
283 "opened in a text mode, and for bytes a BytesIO can be used like a file\n"
284 "opened in a binary mode.\n"
285     );
286 
287 static PyObject *
288 io_open(PyObject *self, PyObject *args, PyObject *kwds)
289 {
290     char *kwlist[] = {"file", "mode", "buffering",
291                       "encoding", "errors", "newline",
292                       "closefd", NULL};
293     PyObject *file;
294     char *mode = "r";
295     int buffering = -1, closefd = 1;
296     char *encoding = NULL, *errors = NULL, *newline = NULL;
297     unsigned i;
298 
299     int reading = 0, writing = 0, appending = 0, updating = 0;
300     int text = 0, binary = 0, universal = 0;
301 
302     char rawmode[5], *m;
303     int line_buffering, isatty;
304 
305     PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL;
306 
307     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist,
308                                      &file, &mode, &buffering,
309                                      &encoding, &errors, &newline,
310                                      &closefd)) {
311         return NULL;
312     }
313 
314     if (!PyUnicode_Check(file) &&
315 	!PyBytes_Check(file) &&
316 	!PyNumber_Check(file)) {
317         PyObject *repr = PyObject_Repr(file);
318         if (repr != NULL) {
319             PyErr_Format(PyExc_TypeError, "invalid file: %s",
320                          PyString_AS_STRING(repr));
321             Py_DECREF(repr);
322         }
323         return NULL;
324     }
325 
326     /* Decode mode */
327     for (i = 0; i < strlen(mode); i++) {
328         char c = mode[i];
329 
330         switch (c) {
331         case 'r':
332             reading = 1;
333             break;
334         case 'w':
335             writing = 1;
336             break;
337         case 'a':
338             appending = 1;
339             break;
340         case '+':
341             updating = 1;
342             break;
343         case 't':
344             text = 1;
345             break;
346         case 'b':
347             binary = 1;
348             break;
349         case 'U':
350             universal = 1;
351             reading = 1;
352             break;
353         default:
354             goto invalid_mode;
355         }
356 
357         /* c must not be duplicated */
358         if (strchr(mode+i+1, c)) {
359           invalid_mode:
360             PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);
361             return NULL;
362         }
363 
364     }
365 
366     m = rawmode;
367     if (reading)   *(m++) = 'r';
368     if (writing)   *(m++) = 'w';
369     if (appending) *(m++) = 'a';
370     if (updating)  *(m++) = '+';
371     *m = '\0';
372 
373     /* Parameters validation */
374     if (universal) {
375         if (writing || appending) {
376             PyErr_SetString(PyExc_ValueError,
377                             "can't use U and writing mode at once");
378             return NULL;
379         }
380         reading = 1;
381     }
382 
383     if (text && binary) {
384         PyErr_SetString(PyExc_ValueError,
385                         "can't have text and binary mode at once");
386         return NULL;
387     }
388 
389     if (reading + writing + appending > 1) {
390         PyErr_SetString(PyExc_ValueError,
391                         "must have exactly one of read/write/append mode");
392         return NULL;
393     }
394 
395     if (binary && encoding != NULL) {
396         PyErr_SetString(PyExc_ValueError,
397                         "binary mode doesn't take an encoding argument");
398         return NULL;
399     }
400 
401     if (binary && errors != NULL) {
402         PyErr_SetString(PyExc_ValueError,
403                         "binary mode doesn't take an errors argument");
404         return NULL;
405     }
406 
407     if (binary && newline != NULL) {
408         PyErr_SetString(PyExc_ValueError,
409                         "binary mode doesn't take a newline argument");
410         return NULL;
411     }
412 
413     /* Create the Raw file stream */
414     raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
415 				"Osi", file, rawmode, closefd);
416     if (raw == NULL)
417         return NULL;
418 
419     modeobj = PyUnicode_FromString(mode);
420     if (modeobj == NULL)
421         goto error;
422 
423     /* buffering */
424     {
425         PyObject *res = PyObject_CallMethod(raw, "isatty", NULL);
426         if (res == NULL)
427             goto error;
428         isatty = PyLong_AsLong(res);
429         Py_DECREF(res);
430         if (isatty == -1 && PyErr_Occurred())
431             goto error;
432     }
433 
434     if (buffering == 1 || (buffering < 0 && isatty)) {
435         buffering = -1;
436         line_buffering = 1;
437     }
438     else
439         line_buffering = 0;
440 
441     if (buffering < 0) {
442         buffering = DEFAULT_BUFFER_SIZE;
443 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
444         {
445             struct stat st;
446             long fileno;
447             PyObject *res = PyObject_CallMethod(raw, "fileno", NULL);
448             if (res == NULL)
449                 goto error;
450 
451             fileno = PyInt_AsLong(res);
452             Py_DECREF(res);
453             if (fileno == -1 && PyErr_Occurred())
454                 goto error;
455 
456             if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)
457                 buffering = st.st_blksize;
458         }
459 #endif
460     }
461     if (buffering < 0) {
462         PyErr_SetString(PyExc_ValueError,
463                         "invalid buffering size");
464         goto error;
465     }
466 
467     /* if not buffering, returns the raw file object */
468     if (buffering == 0) {
469         if (!binary) {
470             PyErr_SetString(PyExc_ValueError,
471                             "can't have unbuffered text I/O");
472             goto error;
473         }
474 
475         Py_DECREF(modeobj);
476         return raw;
477     }
478 
479     /* wraps into a buffered file */
480     {
481         PyObject *Buffered_class;
482 
483         if (updating)
484             Buffered_class = (PyObject *)&PyBufferedRandom_Type;
485         else if (writing || appending)
486             Buffered_class = (PyObject *)&PyBufferedWriter_Type;
487         else if (reading)
488             Buffered_class = (PyObject *)&PyBufferedReader_Type;
489         else {
490             PyErr_Format(PyExc_ValueError,
491                          "unknown mode: '%s'", mode);
492             goto error;
493         }
494 
495         buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);
496     }
497     Py_CLEAR(raw);
498     if (buffer == NULL)
499         goto error;
500 
501 
502     /* if binary, returns the buffered file */
503     if (binary) {
504         Py_DECREF(modeobj);
505         return buffer;
506     }
507 
508     /* wraps into a TextIOWrapper */
509     wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
510 				    "Osssi",
511 				    buffer,
512 				    encoding, errors, newline,
513 				    line_buffering);
514     Py_CLEAR(buffer);
515     if (wrapper == NULL)
516         goto error;
517 
518     if (PyObject_SetAttrString(wrapper, "mode", modeobj) < 0)
519         goto error;
520     Py_DECREF(modeobj);
521     return wrapper;
522 
523   error:
524     Py_XDECREF(raw);
525     Py_XDECREF(modeobj);
526     Py_XDECREF(buffer);
527     Py_XDECREF(wrapper);
528     return NULL;
529 }
530 

531 /*
532  * Private helpers for the io module.
533  */
534 
535 Py_off_t
536 PyNumber_AsOff_t(PyObject *item, PyObject *err)
537 {
538     Py_off_t result;
539     PyObject *runerr;
540     PyObject *value = PyNumber_Index(item);
541     if (value == NULL)
542         return -1;
543 
544     if (PyInt_Check(value)) {
545         /* We assume a long always fits in a Py_off_t... */
546         result = (Py_off_t) PyInt_AS_LONG(value);
547         goto finish;
548     }
549 
550     /* We're done if PyLong_AsSsize_t() returns without error. */
551     result = PyLong_AsOff_t(value);
552     if (result != -1 || !(runerr = PyErr_Occurred()))
553         goto finish;
554 
555     /* Error handling code -- only manage OverflowError differently */
556     if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
557         goto finish;
558 
559     PyErr_Clear();
560     /* If no error-handling desired then the default clipping
561        is sufficient.
562      */
563     if (!err) {
564         assert(PyLong_Check(value));
565         /* Whether or not it is less than or equal to
566            zero is determined by the sign of ob_size
567         */
568         if (_PyLong_Sign(value) < 0)
569             result = PY_OFF_T_MIN;
570         else
571             result = PY_OFF_T_MAX;
572     }
573     else {
574         /* Otherwise replace the error with caller's error object. */
575         PyErr_Format(err,
576                      "cannot fit '%.200s' into an offset-sized integer",
577                      item->ob_type->tp_name);
578     }
579 
580  finish:
581     Py_DECREF(value);
582     return result;
583 }
584 
585 
586 /* Basically the "n" format code with the ability to turn None into -1. */
587 int 
588 _PyIO_ConvertSsize_t(PyObject *obj, void *result) {
589     Py_ssize_t limit;
590     if (obj == Py_None) {
591         limit = -1;
592     }
593     else if (PyNumber_Check(obj)) {
594         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
595         if (limit == -1 && PyErr_Occurred())
596             return 0;
597     }
598     else {
599         PyErr_Format(PyExc_TypeError,
600                      "integer argument expected, got '%.200s'",
601                      Py_TYPE(obj)->tp_name);
602         return 0;
603     }
604     *((Py_ssize_t *)result) = limit;
605     return 1;
606 }
607 
608 
609 /*
610  * Module definition
611  */
612 
613 PyObject *_PyIO_os_module = NULL;
614 PyObject *_PyIO_locale_module = NULL;
615 PyObject *_PyIO_unsupported_operation = NULL;
616 
617 static PyMethodDef module_methods[] = {
618     {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},
619     {NULL, NULL}
620 };
621 
622 PyMODINIT_FUNC
623 init_io(void)
624 {
625     PyObject *m = Py_InitModule4("_io", module_methods,
626                                  module_doc, NULL, PYTHON_API_VERSION);
627     if (m == NULL)
628         return;
629 
630     /* put os in the module state */
631     _PyIO_os_module = PyImport_ImportModule("os");
632     if (_PyIO_os_module == NULL)
633         goto fail;
634 
635 #define ADD_TYPE(type, name) \
636     if (PyType_Ready(type) < 0) \
637         goto fail; \
638     Py_INCREF(type); \
639     if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {  \
640         Py_DECREF(type); \
641         goto fail; \
642     }
643 
644     /* DEFAULT_BUFFER_SIZE */
645     if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
646         goto fail;
647 
648     /* UnsupportedOperation inherits from ValueError and IOError */
649     _PyIO_unsupported_operation = PyObject_CallFunction(
650         (PyObject *)&PyType_Type, "s(OO){}",
651         "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);
652     if (_PyIO_unsupported_operation == NULL)
653         goto fail;
654     Py_INCREF(_PyIO_unsupported_operation);
655     if (PyModule_AddObject(m, "UnsupportedOperation",
656                            _PyIO_unsupported_operation) < 0)
657         goto fail;
658 
659     /* BlockingIOError */
660     _PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError;
661     ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError");
662 
663     /* Concrete base types of the IO ABCs.
664        (the ABCs themselves are declared through inheritance in io.py)
665     */
666     ADD_TYPE(&PyIOBase_Type, "_IOBase");
667     ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
668     ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
669     ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
670 
671     /* Implementation of concrete IO objects. */
672     /* FileIO */
673     PyFileIO_Type.tp_base = &PyRawIOBase_Type;
674     ADD_TYPE(&PyFileIO_Type, "FileIO");
675 
676     /* BytesIO */
677     PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;
678     ADD_TYPE(&PyBytesIO_Type, "BytesIO");
679 
680     /* StringIO */
681     PyStringIO_Type.tp_base = &PyTextIOBase_Type;
682     ADD_TYPE(&PyStringIO_Type, "StringIO");
683 
684     /* BufferedReader */
685     PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
686     ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");
687 
688     /* BufferedWriter */
689     PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
690     ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");
691 
692     /* BufferedRWPair */
693     PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
694     ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");
695 
696     /* BufferedRandom */
697     PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
698     ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");
699 
700     /* TextIOWrapper */
701     PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;
702     ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");
703 
704     /* IncrementalNewlineDecoder */
705     ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");
706 
707     /* Interned strings */
708     if (!(_PyIO_str_close = PyString_InternFromString("close")))
709         goto fail;
710     if (!(_PyIO_str_closed = PyString_InternFromString("closed")))
711         goto fail;
712     if (!(_PyIO_str_decode = PyString_InternFromString("decode")))
713         goto fail;
714     if (!(_PyIO_str_encode = PyString_InternFromString("encode")))
715         goto fail;
716     if (!(_PyIO_str_fileno = PyString_InternFromString("fileno")))
717         goto fail;
718     if (!(_PyIO_str_flush = PyString_InternFromString("flush")))
719         goto fail;
720     if (!(_PyIO_str_getstate = PyString_InternFromString("getstate")))
721         goto fail;
722     if (!(_PyIO_str_isatty = PyString_InternFromString("isatty")))
723         goto fail;
724     if (!(_PyIO_str_newlines = PyString_InternFromString("newlines")))
725         goto fail;
726     if (!(_PyIO_str_nl = PyString_InternFromString("\n")))
727         goto fail;
728     if (!(_PyIO_str_read = PyString_InternFromString("read")))
729         goto fail;
730     if (!(_PyIO_str_read1 = PyString_InternFromString("read1")))
731         goto fail;
732     if (!(_PyIO_str_readable = PyString_InternFromString("readable")))
733         goto fail;
734     if (!(_PyIO_str_readinto = PyString_InternFromString("readinto")))
735         goto fail;
736     if (!(_PyIO_str_readline = PyString_InternFromString("readline")))
737         goto fail;
738     if (!(_PyIO_str_reset = PyString_InternFromString("reset")))
739         goto fail;
740     if (!(_PyIO_str_seek = PyString_InternFromString("seek")))
741         goto fail;
742     if (!(_PyIO_str_seekable = PyString_InternFromString("seekable")))
743         goto fail;
744     if (!(_PyIO_str_setstate = PyString_InternFromString("setstate")))
745         goto fail;
746     if (!(_PyIO_str_tell = PyString_InternFromString("tell")))
747         goto fail;
748     if (!(_PyIO_str_truncate = PyString_InternFromString("truncate")))
749         goto fail;
750     if (!(_PyIO_str_write = PyString_InternFromString("write")))
751         goto fail;
752     if (!(_PyIO_str_writable = PyString_InternFromString("writable")))
753         goto fail;
754     
755     if (!(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))
756         goto fail;
757     if (!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
758         goto fail;
759     if (!(_PyIO_zero = PyLong_FromLong(0L)))
760         goto fail;
761 
762     return;
763 
764   fail:
765     Py_CLEAR(_PyIO_os_module);
766     Py_CLEAR(_PyIO_unsupported_operation);
767     Py_DECREF(m);
768 }