LCOV - code coverage report
Current view: top level - libreoffice/workdir/unxlngi6.pro/UnpackedTarball/python3/Modules/_io - _iomodule.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 158 259 61.0 %
Date: 2012-12-17 Functions: 4 7 57.1 %
Legend: Lines: hit not hit

          Line data    Source code
       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_readall;
      40             : PyObject *_PyIO_str_readinto;
      41             : PyObject *_PyIO_str_readline;
      42             : PyObject *_PyIO_str_reset;
      43             : PyObject *_PyIO_str_seek;
      44             : PyObject *_PyIO_str_seekable;
      45             : PyObject *_PyIO_str_setstate;
      46             : PyObject *_PyIO_str_tell;
      47             : PyObject *_PyIO_str_truncate;
      48             : PyObject *_PyIO_str_writable;
      49             : PyObject *_PyIO_str_write;
      50             : 
      51             : PyObject *_PyIO_empty_str;
      52             : PyObject *_PyIO_empty_bytes;
      53             : PyObject *_PyIO_zero;
      54             : 
      55             : 
      56             : 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 throw 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             : 
      93             : /*
      94             :  * The main open() function
      95             :  */
      96             : PyDoc_STRVAR(open_doc,
      97             : "open(file, mode='r', buffering=-1, encoding=None,\n"
      98             : "     errors=None, newline=None, closefd=True, opener=None) -> file object\n"
      99             : "\n"
     100             : "Open file and return a stream.  Raise IOError upon failure.\n"
     101             : "\n"
     102             : "file is either a text or byte string giving the name (and the path\n"
     103             : "if the file isn't in the current working directory) of the file to\n"
     104             : "be opened or an integer file descriptor of the file to be\n"
     105             : "wrapped. (If a file descriptor is given, it is closed when the\n"
     106             : "returned I/O object is closed, unless closefd is set to False.)\n"
     107             : "\n"
     108             : "mode is an optional string that specifies the mode in which the file\n"
     109             : "is opened. It defaults to 'r' which means open for reading in text\n"
     110             : "mode.  Other common values are 'w' for writing (truncating the file if\n"
     111             : "it already exists), 'x' for creating and writing to a new file, and\n"
     112             : "'a' for appending (which on some Unix systems, means that all writes\n"
     113             : "append to the end of the file regardless of the current seek position).\n"
     114             : "In text mode, if encoding is not specified the encoding used is platform\n"
     115             : "dependent: locale.getpreferredencoding(False) is called to get the\n"
     116             : "current locale encoding. (For reading and writing raw bytes use binary\n"
     117             : "mode and leave encoding unspecified.) The available modes are:\n"
     118             : "\n"
     119             : "========= ===============================================================\n"
     120             : "Character Meaning\n"
     121             : "--------- ---------------------------------------------------------------\n"
     122             : "'r'       open for reading (default)\n"
     123             : "'w'       open for writing, truncating the file first\n"
     124             : "'x'       create a new file and open it for writing\n"
     125             : "'a'       open for writing, appending to the end of the file if it exists\n"
     126             : "'b'       binary mode\n"
     127             : "'t'       text mode (default)\n"
     128             : "'+'       open a disk file for updating (reading and writing)\n"
     129             : "'U'       universal newline mode (for backwards compatibility; unneeded\n"
     130             : "          for new code)\n"
     131             : "========= ===============================================================\n"
     132             : "\n"
     133             : "The default mode is 'rt' (open for reading text). For binary random\n"
     134             : "access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"
     135             : "'r+b' opens the file without truncation. The 'x' mode implies 'w' and\n"
     136             : "raises an `FileExistsError` if the file already exists.\n"
     137             : "\n"
     138             : "Python distinguishes between files opened in binary and text modes,\n"
     139             : "even when the underlying operating system doesn't. Files opened in\n"
     140             : "binary mode (appending 'b' to the mode argument) return contents as\n"
     141             : "bytes objects without any decoding. In text mode (the default, or when\n"
     142             : "'t' is appended to the mode argument), the contents of the file are\n"
     143             : "returned as strings, the bytes having been first decoded using a\n"
     144             : "platform-dependent encoding or using the specified encoding if given.\n"
     145             : "\n"
     146             : "buffering is an optional integer used to set the buffering policy.\n"
     147             : "Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n"
     148             : "line buffering (only usable in text mode), and an integer > 1 to indicate\n"
     149             : "the size of a fixed-size chunk buffer.  When no buffering argument is\n"
     150             : "given, the default buffering policy works as follows:\n"
     151             : "\n"
     152             : "* Binary files are buffered in fixed-size chunks; the size of the buffer\n"
     153             : "  is chosen using a heuristic trying to determine the underlying device's\n"
     154             : "  \"block size\" and falling back on `io.DEFAULT_BUFFER_SIZE`.\n"
     155             : "  On many systems, the buffer will typically be 4096 or 8192 bytes long.\n"
     156             : "\n"
     157             : "* \"Interactive\" text files (files for which isatty() returns True)\n"
     158             : "  use line buffering.  Other text files use the policy described above\n"
     159             : "  for binary files.\n"
     160             : "\n"
     161             : "encoding is the name of the encoding used to decode or encode the\n"
     162             : "file. This should only be used in text mode. The default encoding is\n"
     163             : "platform dependent, but any encoding supported by Python can be\n"
     164             : "passed.  See the codecs module for the list of supported encodings.\n"
     165             : "\n"
     166             : "errors is an optional string that specifies how encoding errors are to\n"
     167             : "be handled---this argument should not be used in binary mode. Pass\n"
     168             : "'strict' to raise a ValueError exception if there is an encoding error\n"
     169             : "(the default of None has the same effect), or pass 'ignore' to ignore\n"
     170             : "errors. (Note that ignoring encoding errors can lead to data loss.)\n"
     171             : "See the documentation for codecs.register for a list of the permitted\n"
     172             : "encoding error strings.\n"
     173             : "\n"
     174             : "newline controls how universal newlines works (it only applies to text\n"
     175             : "mode). It can be None, '', '\\n', '\\r', and '\\r\\n'.  It works as\n"
     176             : "follows:\n"
     177             : "\n"
     178             : "* On input, if newline is None, universal newlines mode is\n"
     179             : "  enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"
     180             : "  these are translated into '\\n' before being returned to the\n"
     181             : "  caller. If it is '', universal newline mode is enabled, but line\n"
     182             : "  endings are returned to the caller untranslated. If it has any of\n"
     183             : "  the other legal values, input lines are only terminated by the given\n"
     184             : "  string, and the line ending is returned to the caller untranslated.\n"
     185             : "\n"
     186             : "* On output, if newline is None, any '\\n' characters written are\n"
     187             : "  translated to the system default line separator, os.linesep. If\n"
     188             : "  newline is '' or '\n', no translation takes place. If newline is any\n"
     189             : "  of the other legal values, any '\\n' characters written are translated\n"
     190             : "  to the given string.\n"
     191             : "\n"
     192             : "If closefd is False, the underlying file descriptor will be kept open\n"
     193             : "when the file is closed. This does not work when a file name is given\n"
     194             : "and must be True in that case.\n"
     195             : "\n"
     196             : "A custom opener can be used by passing a callable as *opener*. The\n"
     197             : "underlying file descriptor for the file object is then obtained by\n"
     198             : "calling *opener* with (*file*, *flags*). *opener* must return an open\n"
     199             : "file descriptor (passing os.open as *opener* results in functionality\n"
     200             : "similar to passing None).\n"
     201             : "\n"
     202             : "open() returns a file object whose type depends on the mode, and\n"
     203             : "through which the standard file operations such as reading and writing\n"
     204             : "are performed. When open() is used to open a file in a text mode ('w',\n"
     205             : "'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open\n"
     206             : "a file in a binary mode, the returned class varies: in read binary\n"
     207             : "mode, it returns a BufferedReader; in write binary and append binary\n"
     208             : "modes, it returns a BufferedWriter, and in read/write mode, it returns\n"
     209             : "a BufferedRandom.\n"
     210             : "\n"
     211             : "It is also possible to use a string or bytearray as a file for both\n"
     212             : "reading and writing. For strings StringIO can be used like a file\n"
     213             : "opened in a text mode, and for bytes a BytesIO can be used like a file\n"
     214             : "opened in a binary mode.\n"
     215             :     );
     216             : 
     217             : static PyObject *
     218           4 : io_open(PyObject *self, PyObject *args, PyObject *kwds)
     219             : {
     220           4 :     char *kwlist[] = {"file", "mode", "buffering",
     221             :                       "encoding", "errors", "newline",
     222             :                       "closefd", "opener", NULL};
     223           4 :     PyObject *file, *opener = Py_None;
     224           4 :     char *mode = "r";
     225           4 :     int buffering = -1, closefd = 1;
     226           4 :     char *encoding = NULL, *errors = NULL, *newline = NULL;
     227             :     unsigned i;
     228             : 
     229           4 :     int creating = 0, reading = 0, writing = 0, appending = 0, updating = 0;
     230           4 :     int text = 0, binary = 0, universal = 0;
     231             : 
     232             :     char rawmode[6], *m;
     233             :     int line_buffering, isatty;
     234             : 
     235           4 :     PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL;
     236             : 
     237             :     _Py_IDENTIFIER(isatty);
     238             :     _Py_IDENTIFIER(fileno);
     239             :     _Py_IDENTIFIER(mode);
     240             : 
     241           4 :     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziO:open", kwlist,
     242             :                                      &file, &mode, &buffering,
     243             :                                      &encoding, &errors, &newline,
     244             :                                      &closefd, &opener)) {
     245           0 :         return NULL;
     246             :     }
     247             : 
     248           7 :     if (!PyUnicode_Check(file) &&
     249           6 :         !PyBytes_Check(file) &&
     250           3 :         !PyNumber_Check(file)) {
     251           0 :         PyErr_Format(PyExc_TypeError, "invalid file: %R", file);
     252           0 :         return NULL;
     253             :     }
     254             : 
     255             :     /* Decode mode */
     256          11 :     for (i = 0; i < strlen(mode); i++) {
     257           7 :         char c = mode[i];
     258             : 
     259           7 :         switch (c) {
     260             :         case 'x':
     261           0 :             creating = 1;
     262           0 :             break;
     263             :         case 'r':
     264           2 :             reading = 1;
     265           2 :             break;
     266             :         case 'w':
     267           2 :             writing = 1;
     268           2 :             break;
     269             :         case 'a':
     270           0 :             appending = 1;
     271           0 :             break;
     272             :         case '+':
     273           0 :             updating = 1;
     274           0 :             break;
     275             :         case 't':
     276           0 :             text = 1;
     277           0 :             break;
     278             :         case 'b':
     279           3 :             binary = 1;
     280           3 :             break;
     281             :         case 'U':
     282           0 :             universal = 1;
     283           0 :             reading = 1;
     284           0 :             break;
     285             :         default:
     286           0 :             goto invalid_mode;
     287             :         }
     288             : 
     289             :         /* c must not be duplicated */
     290           7 :         if (strchr(mode+i+1, c)) {
     291             :           invalid_mode:
     292           0 :             PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);
     293           0 :             return NULL;
     294             :         }
     295             : 
     296             :     }
     297             : 
     298           4 :     m = rawmode;
     299           4 :     if (creating)  *(m++) = 'x';
     300           4 :     if (reading)   *(m++) = 'r';
     301           4 :     if (writing)   *(m++) = 'w';
     302           4 :     if (appending) *(m++) = 'a';
     303           4 :     if (updating)  *(m++) = '+';
     304           4 :     *m = '\0';
     305             : 
     306             :     /* Parameters validation */
     307           4 :     if (universal) {
     308           0 :         if (writing || appending) {
     309           0 :             PyErr_SetString(PyExc_ValueError,
     310             :                             "can't use U and writing mode at once");
     311           0 :             return NULL;
     312             :         }
     313           0 :         reading = 1;
     314             :     }
     315             : 
     316           4 :     if (text && binary) {
     317           0 :         PyErr_SetString(PyExc_ValueError,
     318             :                         "can't have text and binary mode at once");
     319           0 :         return NULL;
     320             :     }
     321             : 
     322           4 :     if (creating + reading + writing + appending > 1) {
     323           0 :         PyErr_SetString(PyExc_ValueError,
     324             :                         "must have exactly one of create/read/write/append mode");
     325           0 :         return NULL;
     326             :     }
     327             : 
     328           4 :     if (binary && encoding != NULL) {
     329           0 :         PyErr_SetString(PyExc_ValueError,
     330             :                         "binary mode doesn't take an encoding argument");
     331           0 :         return NULL;
     332             :     }
     333             : 
     334           4 :     if (binary && errors != NULL) {
     335           0 :         PyErr_SetString(PyExc_ValueError,
     336             :                         "binary mode doesn't take an errors argument");
     337           0 :         return NULL;
     338             :     }
     339             : 
     340           4 :     if (binary && newline != NULL) {
     341           0 :         PyErr_SetString(PyExc_ValueError,
     342             :                         "binary mode doesn't take a newline argument");
     343           0 :         return NULL;
     344             :     }
     345             : 
     346             :     /* Create the Raw file stream */
     347           4 :     raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
     348             :                                 "OsiO", file, rawmode, closefd, opener);
     349           4 :     if (raw == NULL)
     350           0 :         return NULL;
     351             : 
     352           4 :     modeobj = PyUnicode_FromString(mode);
     353           4 :     if (modeobj == NULL)
     354           0 :         goto error;
     355             : 
     356             :     /* buffering */
     357             :     {
     358           4 :         PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL);
     359           4 :         if (res == NULL)
     360           0 :             goto error;
     361           4 :         isatty = PyLong_AsLong(res);
     362           4 :         Py_DECREF(res);
     363           4 :         if (isatty == -1 && PyErr_Occurred())
     364           0 :             goto error;
     365             :     }
     366             : 
     367           4 :     if (buffering == 1 || (buffering < 0 && isatty)) {
     368           0 :         buffering = -1;
     369           0 :         line_buffering = 1;
     370             :     }
     371             :     else
     372           4 :         line_buffering = 0;
     373             : 
     374           4 :     if (buffering < 0) {
     375           4 :         buffering = DEFAULT_BUFFER_SIZE;
     376             : #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
     377             :         {
     378             :             struct stat st;
     379             :             long fileno;
     380           4 :             PyObject *res = _PyObject_CallMethodId(raw, &PyId_fileno, NULL);
     381           4 :             if (res == NULL)
     382             :                 goto error;
     383             : 
     384           4 :             fileno = PyLong_AsLong(res);
     385           4 :             Py_DECREF(res);
     386           4 :             if (fileno == -1 && PyErr_Occurred())
     387             :                 goto error;
     388             : 
     389           4 :             if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)
     390           4 :                 buffering = st.st_blksize;
     391             :         }
     392             : #endif
     393             :     }
     394           4 :     if (buffering < 0) {
     395           0 :         PyErr_SetString(PyExc_ValueError,
     396             :                         "invalid buffering size");
     397           0 :         goto error;
     398             :     }
     399             : 
     400             :     /* if not buffering, returns the raw file object */
     401           4 :     if (buffering == 0) {
     402           0 :         if (!binary) {
     403           0 :             PyErr_SetString(PyExc_ValueError,
     404             :                             "can't have unbuffered text I/O");
     405           0 :             goto error;
     406             :         }
     407             : 
     408           0 :         Py_DECREF(modeobj);
     409           0 :         return raw;
     410             :     }
     411             : 
     412             :     /* wraps into a buffered file */
     413             :     {
     414             :         PyObject *Buffered_class;
     415             : 
     416           4 :         if (updating)
     417           0 :             Buffered_class = (PyObject *)&PyBufferedRandom_Type;
     418           4 :         else if (creating || writing || appending)
     419           2 :             Buffered_class = (PyObject *)&PyBufferedWriter_Type;
     420           2 :         else if (reading)
     421           2 :             Buffered_class = (PyObject *)&PyBufferedReader_Type;
     422             :         else {
     423           0 :             PyErr_Format(PyExc_ValueError,
     424             :                          "unknown mode: '%s'", mode);
     425           0 :             goto error;
     426             :         }
     427             : 
     428           4 :         buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);
     429             :     }
     430           4 :     Py_CLEAR(raw);
     431           4 :     if (buffer == NULL)
     432           0 :         goto error;
     433             : 
     434             : 
     435             :     /* if binary, returns the buffered file */
     436           4 :     if (binary) {
     437           3 :         Py_DECREF(modeobj);
     438           3 :         return buffer;
     439             :     }
     440             : 
     441             :     /* wraps into a TextIOWrapper */
     442           1 :     wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
     443             :                                     "Osssi",
     444             :                                     buffer,
     445             :                                     encoding, errors, newline,
     446             :                                     line_buffering);
     447           1 :     Py_CLEAR(buffer);
     448           1 :     if (wrapper == NULL)
     449           0 :         goto error;
     450             : 
     451           1 :     if (_PyObject_SetAttrId(wrapper, &PyId_mode, modeobj) < 0)
     452           0 :         goto error;
     453           1 :     Py_DECREF(modeobj);
     454           1 :     return wrapper;
     455             : 
     456             :   error:
     457           0 :     Py_XDECREF(raw);
     458           0 :     Py_XDECREF(modeobj);
     459           0 :     Py_XDECREF(buffer);
     460           0 :     Py_XDECREF(wrapper);
     461           0 :     return NULL;
     462             : }
     463             : 
     464             : /*
     465             :  * Private helpers for the io module.
     466             :  */
     467             : 
     468             : Py_off_t
     469           1 : PyNumber_AsOff_t(PyObject *item, PyObject *err)
     470             : {
     471             :     Py_off_t result;
     472             :     PyObject *runerr;
     473           1 :     PyObject *value = PyNumber_Index(item);
     474           1 :     if (value == NULL)
     475           0 :         return -1;
     476             : 
     477             :     /* We're done if PyLong_AsSsize_t() returns without error. */
     478           1 :     result = PyLong_AsOff_t(value);
     479           1 :     if (result != -1 || !(runerr = PyErr_Occurred()))
     480             :         goto finish;
     481             : 
     482             :     /* Error handling code -- only manage OverflowError differently */
     483           0 :     if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
     484           0 :         goto finish;
     485             : 
     486           0 :     PyErr_Clear();
     487             :     /* If no error-handling desired then the default clipping
     488             :        is sufficient.
     489             :      */
     490           0 :     if (!err) {
     491             :         assert(PyLong_Check(value));
     492             :         /* Whether or not it is less than or equal to
     493             :            zero is determined by the sign of ob_size
     494             :         */
     495           0 :         if (_PyLong_Sign(value) < 0)
     496           0 :             result = PY_OFF_T_MIN;
     497             :         else
     498           0 :             result = PY_OFF_T_MAX;
     499             :     }
     500             :     else {
     501             :         /* Otherwise replace the error with caller's error object. */
     502           0 :         PyErr_Format(err,
     503             :                      "cannot fit '%.200s' into an offset-sized integer",
     504           0 :                      item->ob_type->tp_name);
     505             :     }
     506             : 
     507             :  finish:
     508           1 :     Py_DECREF(value);
     509           1 :     return result;
     510             : }
     511             : 
     512             : 
     513             : /* Basically the "n" format code with the ability to turn None into -1. */
     514             : int
     515           0 : _PyIO_ConvertSsize_t(PyObject *obj, void *result) {
     516             :     Py_ssize_t limit;
     517           0 :     if (obj == Py_None) {
     518           0 :         limit = -1;
     519             :     }
     520           0 :     else if (PyNumber_Check(obj)) {
     521           0 :         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
     522           0 :         if (limit == -1 && PyErr_Occurred())
     523           0 :             return 0;
     524             :     }
     525             :     else {
     526           0 :         PyErr_Format(PyExc_TypeError,
     527             :                      "integer argument expected, got '%.200s'",
     528           0 :                      Py_TYPE(obj)->tp_name);
     529           0 :         return 0;
     530             :     }
     531           0 :     *((Py_ssize_t *)result) = limit;
     532           0 :     return 1;
     533             : }
     534             : 
     535             : 
     536             : static int
     537           4 : iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
     538           4 :     _PyIO_State *state = IO_MOD_STATE(mod);
     539           4 :     if (!state->initialized)
     540           2 :         return 0;
     541           2 :     if (state->locale_module != NULL) {
     542           2 :         Py_VISIT(state->locale_module);
     543             :     }
     544           2 :     Py_VISIT(state->unsupported_operation);
     545           2 :     return 0;
     546             : }
     547             : 
     548             : 
     549             : static int
     550           0 : iomodule_clear(PyObject *mod) {
     551           0 :     _PyIO_State *state = IO_MOD_STATE(mod);
     552           0 :     if (!state->initialized)
     553           0 :         return 0;
     554           0 :     if (state->locale_module != NULL)
     555           0 :         Py_CLEAR(state->locale_module);
     556           0 :     Py_CLEAR(state->unsupported_operation);
     557           0 :     return 0;
     558             : }
     559             : 
     560             : static void
     561           0 : iomodule_free(PyObject *mod) {
     562           0 :     iomodule_clear(mod);
     563           0 : }
     564             : 
     565             : 
     566             : /*
     567             :  * Module definition
     568             :  */
     569             : 
     570             : static PyMethodDef module_methods[] = {
     571             :     {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},
     572             :     {NULL, NULL}
     573             : };
     574             : 
     575             : struct PyModuleDef _PyIO_Module = {
     576             :     PyModuleDef_HEAD_INIT,
     577             :     "io",
     578             :     module_doc,
     579             :     sizeof(_PyIO_State),
     580             :     module_methods,
     581             :     NULL,
     582             :     iomodule_traverse,
     583             :     iomodule_clear,
     584             :     (freefunc)iomodule_free,
     585             : };
     586             : 
     587             : PyMODINIT_FUNC
     588           1 : PyInit__io(void)
     589             : {
     590           1 :     PyObject *m = PyModule_Create(&_PyIO_Module);
     591           1 :     _PyIO_State *state = NULL;
     592           1 :     if (m == NULL)
     593           0 :         return NULL;
     594           1 :     state = IO_MOD_STATE(m);
     595           1 :     state->initialized = 0;
     596             : 
     597             : #define ADD_TYPE(type, name) \
     598             :     if (PyType_Ready(type) < 0) \
     599             :         goto fail; \
     600             :     Py_INCREF(type); \
     601             :     if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {  \
     602             :         Py_DECREF(type); \
     603             :         goto fail; \
     604             :     }
     605             : 
     606             :     /* DEFAULT_BUFFER_SIZE */
     607           1 :     if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
     608           0 :         goto fail;
     609             : 
     610             :     /* UnsupportedOperation inherits from ValueError and IOError */
     611           1 :     state->unsupported_operation = PyObject_CallFunction(
     612             :         (PyObject *)&PyType_Type, "s(OO){}",
     613             :         "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);
     614           1 :     if (state->unsupported_operation == NULL)
     615           0 :         goto fail;
     616           1 :     Py_INCREF(state->unsupported_operation);
     617           1 :     if (PyModule_AddObject(m, "UnsupportedOperation",
     618             :                            state->unsupported_operation) < 0)
     619           0 :         goto fail;
     620             : 
     621             :     /* BlockingIOError, for compatibility */
     622           1 :     Py_INCREF(PyExc_BlockingIOError);
     623           1 :     if (PyModule_AddObject(m, "BlockingIOError",
     624             :                            (PyObject *) PyExc_BlockingIOError) < 0)
     625           0 :         goto fail;
     626             : 
     627             :     /* Concrete base types of the IO ABCs.
     628             :        (the ABCs themselves are declared through inheritance in io.py)
     629             :     */
     630           1 :     ADD_TYPE(&PyIOBase_Type, "_IOBase");
     631           1 :     ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
     632           1 :     ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
     633           1 :     ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
     634             : 
     635             :     /* Implementation of concrete IO objects. */
     636             :     /* FileIO */
     637           1 :     PyFileIO_Type.tp_base = &PyRawIOBase_Type;
     638           1 :     ADD_TYPE(&PyFileIO_Type, "FileIO");
     639             : 
     640             :     /* BytesIO */
     641           1 :     PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;
     642           1 :     ADD_TYPE(&PyBytesIO_Type, "BytesIO");
     643           1 :     if (PyType_Ready(&_PyBytesIOBuffer_Type) < 0)
     644           0 :         goto fail;
     645             : 
     646             :     /* StringIO */
     647           1 :     PyStringIO_Type.tp_base = &PyTextIOBase_Type;
     648           1 :     ADD_TYPE(&PyStringIO_Type, "StringIO");
     649             : 
     650             :     /* BufferedReader */
     651           1 :     PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
     652           1 :     ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");
     653             : 
     654             :     /* BufferedWriter */
     655           1 :     PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
     656           1 :     ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");
     657             : 
     658             :     /* BufferedRWPair */
     659           1 :     PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
     660           1 :     ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");
     661             : 
     662             :     /* BufferedRandom */
     663           1 :     PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
     664           1 :     ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");
     665             : 
     666             :     /* TextIOWrapper */
     667           1 :     PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;
     668           1 :     ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");
     669             : 
     670             :     /* IncrementalNewlineDecoder */
     671           1 :     ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");
     672             : 
     673             :     /* Interned strings */
     674             : #define ADD_INTERNED(name) \
     675             :     if (!_PyIO_str_ ## name && \
     676             :         !(_PyIO_str_ ## name = PyUnicode_InternFromString(# name))) \
     677             :         goto fail;
     678             : 
     679           1 :     ADD_INTERNED(close)
     680           1 :     ADD_INTERNED(closed)
     681           1 :     ADD_INTERNED(decode)
     682           1 :     ADD_INTERNED(encode)
     683           1 :     ADD_INTERNED(fileno)
     684           1 :     ADD_INTERNED(flush)
     685           1 :     ADD_INTERNED(getstate)
     686           1 :     ADD_INTERNED(isatty)
     687           1 :     ADD_INTERNED(newlines)
     688           1 :     ADD_INTERNED(read)
     689           1 :     ADD_INTERNED(read1)
     690           1 :     ADD_INTERNED(readable)
     691           1 :     ADD_INTERNED(readall)
     692           1 :     ADD_INTERNED(readinto)
     693           1 :     ADD_INTERNED(readline)
     694           1 :     ADD_INTERNED(reset)
     695           1 :     ADD_INTERNED(seek)
     696           1 :     ADD_INTERNED(seekable)
     697           1 :     ADD_INTERNED(setstate)
     698           1 :     ADD_INTERNED(tell)
     699           1 :     ADD_INTERNED(truncate)
     700           1 :     ADD_INTERNED(write)
     701           1 :     ADD_INTERNED(writable)
     702             : 
     703           2 :     if (!_PyIO_str_nl &&
     704           1 :         !(_PyIO_str_nl = PyUnicode_InternFromString("\n")))
     705           0 :         goto fail;
     706             : 
     707           2 :     if (!_PyIO_empty_str &&
     708           1 :         !(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))
     709           0 :         goto fail;
     710           2 :     if (!_PyIO_empty_bytes &&
     711           1 :         !(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
     712           0 :         goto fail;
     713           2 :     if (!_PyIO_zero &&
     714           1 :         !(_PyIO_zero = PyLong_FromLong(0L)))
     715           0 :         goto fail;
     716             : 
     717           1 :     state->initialized = 1;
     718             : 
     719           1 :     return m;
     720             : 
     721             :   fail:
     722           0 :     Py_XDECREF(state->unsupported_operation);
     723           0 :     Py_DECREF(m);
     724           0 :     return NULL;
     725             : }

Generated by: LCOV version 1.10