blob: 14457e80cbe39c2349b2bc5f9882f58ef164cb65 [file] [log] [blame]
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001/*
2 An implementation of the new I/O lib as defined by PEP 3116 - "New I/O"
Brett Cannonefb00c02012-02-29 18:31:31 -05003
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00004 Classes defined here: UnsupportedOperation, BlockingIOError.
5 Functions defined here: open().
Brett Cannonefb00c02012-02-29 18:31:31 -05006
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00007 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
26PyObject *_PyIO_str_close;
27PyObject *_PyIO_str_closed;
28PyObject *_PyIO_str_decode;
29PyObject *_PyIO_str_encode;
30PyObject *_PyIO_str_fileno;
31PyObject *_PyIO_str_flush;
32PyObject *_PyIO_str_getstate;
33PyObject *_PyIO_str_isatty;
34PyObject *_PyIO_str_newlines;
35PyObject *_PyIO_str_nl;
36PyObject *_PyIO_str_read;
37PyObject *_PyIO_str_read1;
38PyObject *_PyIO_str_readable;
Victor Stinnerb57f1082011-05-26 00:19:38 +020039PyObject *_PyIO_str_readall;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000040PyObject *_PyIO_str_readinto;
41PyObject *_PyIO_str_readline;
42PyObject *_PyIO_str_reset;
43PyObject *_PyIO_str_seek;
44PyObject *_PyIO_str_seekable;
Antoine Pitroue4501852009-05-14 18:55:55 +000045PyObject *_PyIO_str_setstate;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000046PyObject *_PyIO_str_tell;
47PyObject *_PyIO_str_truncate;
48PyObject *_PyIO_str_writable;
49PyObject *_PyIO_str_write;
50
51PyObject *_PyIO_empty_str;
52PyObject *_PyIO_empty_bytes;
Antoine Pitroue4501852009-05-14 18:55:55 +000053PyObject *_PyIO_zero;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000054
55
56PyDoc_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"
Éric Araujofab97662012-02-26 02:14:08 +010062"separation between reading and writing to streams; implementations are\n"
Andrew Svetlov737fb892012-12-18 21:14:22 +020063"allowed to raise an IOError if they do not support a given operation.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000064"\n"
65"Extending IOBase is RawIOBase which deals simply with the reading and\n"
Benjamin Peterson8f2b6652009-04-05 00:46:27 +000066"writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000067"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/*
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000094 * The main open() function
95 */
96PyDoc_STRVAR(open_doc,
Georg Brandle40ee502010-07-11 09:33:39 +000097"open(file, mode='r', buffering=-1, encoding=None,\n"
Ross Lagerwall59142db2011-10-31 20:34:46 +020098" errors=None, newline=None, closefd=True, opener=None) -> file object\n"
Georg Brandl5e8f6d12009-12-23 10:30:45 +000099"\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000100"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"
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100111"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"
Victor Stinnerf86a5e82012-06-05 13:43:22 +0200115"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"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000118"\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"
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100124"'x' create a new file and open it for writing\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000125"'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"
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100135"'r+b' opens the file without truncation. The 'x' mode implies 'w' and\n"
136"raises an `FileExistsError` if the file already exists.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000137"\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"
Antoine Pitroud5587bc2009-12-19 21:08:31 +0000146"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"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000160"\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"
Andrew Kuchlingc7b6c502013-06-16 12:58:48 -0400171"See the documentation for codecs.register or run 'help(codecs.Codec)'\n"
172"for a list of the permitted encoding error strings.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000173"\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"
Ezio Melotti16d2b472012-09-18 07:20:18 +0300188" newline is '' or '\\n', no translation takes place. If newline is any\n"
Victor Stinner401e17d2012-08-04 01:18:56 +0200189" of the other legal values, any '\\n' characters written are translated\n"
190" to the given string.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000191"\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"
Ross Lagerwall59142db2011-10-31 20:34:46 +0200196"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"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000202"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
217static PyObject *
218io_open(PyObject *self, PyObject *args, PyObject *kwds)
219{
220 char *kwlist[] = {"file", "mode", "buffering",
221 "encoding", "errors", "newline",
Ross Lagerwall59142db2011-10-31 20:34:46 +0200222 "closefd", "opener", NULL};
223 PyObject *file, *opener = Py_None;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000224 char *mode = "r";
225 int buffering = -1, closefd = 1;
226 char *encoding = NULL, *errors = NULL, *newline = NULL;
227 unsigned i;
228
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100229 int creating = 0, reading = 0, writing = 0, appending = 0, updating = 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000230 int text = 0, binary = 0, universal = 0;
231
Christian Heimes89ff3c72012-09-10 03:50:48 +0200232 char rawmode[6], *m;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000233 int line_buffering, isatty;
234
235 PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL;
236
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200237 _Py_IDENTIFIER(isatty);
238 _Py_IDENTIFIER(fileno);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200239 _Py_IDENTIFIER(mode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200240
Ross Lagerwall59142db2011-10-31 20:34:46 +0200241 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziO:open", kwlist,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000242 &file, &mode, &buffering,
243 &encoding, &errors, &newline,
Ross Lagerwall59142db2011-10-31 20:34:46 +0200244 &closefd, &opener)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000245 return NULL;
246 }
247
248 if (!PyUnicode_Check(file) &&
249 !PyBytes_Check(file) &&
250 !PyNumber_Check(file)) {
251 PyErr_Format(PyExc_TypeError, "invalid file: %R", file);
252 return NULL;
253 }
254
255 /* Decode mode */
256 for (i = 0; i < strlen(mode); i++) {
257 char c = mode[i];
258
259 switch (c) {
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100260 case 'x':
261 creating = 1;
262 break;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000263 case 'r':
264 reading = 1;
265 break;
266 case 'w':
267 writing = 1;
268 break;
269 case 'a':
270 appending = 1;
271 break;
272 case '+':
273 updating = 1;
274 break;
275 case 't':
276 text = 1;
277 break;
278 case 'b':
279 binary = 1;
280 break;
281 case 'U':
282 universal = 1;
283 reading = 1;
284 break;
285 default:
286 goto invalid_mode;
287 }
288
289 /* c must not be duplicated */
290 if (strchr(mode+i+1, c)) {
291 invalid_mode:
292 PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);
293 return NULL;
294 }
295
296 }
297
298 m = rawmode;
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100299 if (creating) *(m++) = 'x';
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000300 if (reading) *(m++) = 'r';
301 if (writing) *(m++) = 'w';
302 if (appending) *(m++) = 'a';
303 if (updating) *(m++) = '+';
304 *m = '\0';
305
306 /* Parameters validation */
307 if (universal) {
308 if (writing || appending) {
309 PyErr_SetString(PyExc_ValueError,
310 "can't use U and writing mode at once");
311 return NULL;
312 }
313 reading = 1;
314 }
315
316 if (text && binary) {
317 PyErr_SetString(PyExc_ValueError,
318 "can't have text and binary mode at once");
319 return NULL;
320 }
321
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100322 if (creating + reading + writing + appending > 1) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000323 PyErr_SetString(PyExc_ValueError,
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100324 "must have exactly one of create/read/write/append mode");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000325 return NULL;
326 }
327
328 if (binary && encoding != NULL) {
329 PyErr_SetString(PyExc_ValueError,
330 "binary mode doesn't take an encoding argument");
331 return NULL;
332 }
333
334 if (binary && errors != NULL) {
335 PyErr_SetString(PyExc_ValueError,
336 "binary mode doesn't take an errors argument");
337 return NULL;
338 }
339
340 if (binary && newline != NULL) {
341 PyErr_SetString(PyExc_ValueError,
342 "binary mode doesn't take a newline argument");
343 return NULL;
344 }
345
346 /* Create the Raw file stream */
347 raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
Ross Lagerwall59142db2011-10-31 20:34:46 +0200348 "OsiO", file, rawmode, closefd, opener);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000349 if (raw == NULL)
350 return NULL;
351
352 modeobj = PyUnicode_FromString(mode);
353 if (modeobj == NULL)
354 goto error;
355
356 /* buffering */
357 {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200358 PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000359 if (res == NULL)
360 goto error;
361 isatty = PyLong_AsLong(res);
362 Py_DECREF(res);
363 if (isatty == -1 && PyErr_Occurred())
364 goto error;
365 }
366
367 if (buffering == 1 || (buffering < 0 && isatty)) {
368 buffering = -1;
369 line_buffering = 1;
370 }
371 else
372 line_buffering = 0;
373
374 if (buffering < 0) {
375 buffering = DEFAULT_BUFFER_SIZE;
376#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
377 {
378 struct stat st;
379 long fileno;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200380 PyObject *res = _PyObject_CallMethodId(raw, &PyId_fileno, NULL);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000381 if (res == NULL)
382 goto error;
383
384 fileno = PyLong_AsLong(res);
385 Py_DECREF(res);
386 if (fileno == -1 && PyErr_Occurred())
387 goto error;
388
Antoine Pitrouea5d17d2010-10-27 19:45:43 +0000389 if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000390 buffering = st.st_blksize;
391 }
392#endif
393 }
394 if (buffering < 0) {
395 PyErr_SetString(PyExc_ValueError,
396 "invalid buffering size");
397 goto error;
398 }
399
400 /* if not buffering, returns the raw file object */
401 if (buffering == 0) {
402 if (!binary) {
403 PyErr_SetString(PyExc_ValueError,
404 "can't have unbuffered text I/O");
405 goto error;
406 }
407
408 Py_DECREF(modeobj);
409 return raw;
410 }
411
412 /* wraps into a buffered file */
413 {
414 PyObject *Buffered_class;
415
416 if (updating)
417 Buffered_class = (PyObject *)&PyBufferedRandom_Type;
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100418 else if (creating || writing || appending)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000419 Buffered_class = (PyObject *)&PyBufferedWriter_Type;
420 else if (reading)
421 Buffered_class = (PyObject *)&PyBufferedReader_Type;
422 else {
423 PyErr_Format(PyExc_ValueError,
424 "unknown mode: '%s'", mode);
425 goto error;
426 }
427
428 buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);
429 }
430 Py_CLEAR(raw);
431 if (buffer == NULL)
432 goto error;
433
434
435 /* if binary, returns the buffered file */
436 if (binary) {
437 Py_DECREF(modeobj);
438 return buffer;
439 }
440
441 /* wraps into a TextIOWrapper */
442 wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
443 "Osssi",
444 buffer,
445 encoding, errors, newline,
446 line_buffering);
447 Py_CLEAR(buffer);
448 if (wrapper == NULL)
449 goto error;
450
Martin v. Löwis767046a2011-10-14 15:35:36 +0200451 if (_PyObject_SetAttrId(wrapper, &PyId_mode, modeobj) < 0)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000452 goto error;
453 Py_DECREF(modeobj);
454 return wrapper;
455
456 error:
457 Py_XDECREF(raw);
458 Py_XDECREF(modeobj);
459 Py_XDECREF(buffer);
460 Py_XDECREF(wrapper);
461 return NULL;
462}
463
464/*
465 * Private helpers for the io module.
466 */
467
468Py_off_t
469PyNumber_AsOff_t(PyObject *item, PyObject *err)
470{
471 Py_off_t result;
472 PyObject *runerr;
473 PyObject *value = PyNumber_Index(item);
474 if (value == NULL)
475 return -1;
476
477 /* We're done if PyLong_AsSsize_t() returns without error. */
478 result = PyLong_AsOff_t(value);
479 if (result != -1 || !(runerr = PyErr_Occurred()))
480 goto finish;
481
482 /* Error handling code -- only manage OverflowError differently */
483 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
484 goto finish;
485
486 PyErr_Clear();
487 /* If no error-handling desired then the default clipping
488 is sufficient.
489 */
490 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 if (_PyLong_Sign(value) < 0)
496 result = PY_OFF_T_MIN;
497 else
498 result = PY_OFF_T_MAX;
499 }
500 else {
501 /* Otherwise replace the error with caller's error object. */
502 PyErr_Format(err,
503 "cannot fit '%.200s' into an offset-sized integer",
504 item->ob_type->tp_name);
505 }
506
507 finish:
508 Py_DECREF(value);
509 return result;
510}
511
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000512
513/* Basically the "n" format code with the ability to turn None into -1. */
Brett Cannonefb00c02012-02-29 18:31:31 -0500514int
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000515_PyIO_ConvertSsize_t(PyObject *obj, void *result) {
516 Py_ssize_t limit;
517 if (obj == Py_None) {
518 limit = -1;
519 }
520 else if (PyNumber_Check(obj)) {
521 limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
522 if (limit == -1 && PyErr_Occurred())
523 return 0;
524 }
525 else {
526 PyErr_Format(PyExc_TypeError,
527 "integer argument expected, got '%.200s'",
528 Py_TYPE(obj)->tp_name);
529 return 0;
530 }
531 *((Py_ssize_t *)result) = limit;
532 return 1;
533}
534
535
Antoine Pitrou932ff832013-08-01 21:04:50 +0200536PyObject *
537_PyIO_get_locale_module(_PyIO_State *state)
538{
539 PyObject *mod;
540 if (state->locale_module != NULL) {
541 assert(PyWeakref_CheckRef(state->locale_module));
542 mod = PyWeakref_GET_OBJECT(state->locale_module);
543 if (mod != Py_None) {
544 Py_INCREF(mod);
545 return mod;
546 }
547 Py_CLEAR(state->locale_module);
548 }
549 mod = PyImport_ImportModule("locale");
550 if (mod == NULL)
551 return NULL;
552 state->locale_module = PyWeakref_NewRef(mod, NULL);
553 if (state->locale_module == NULL) {
554 Py_DECREF(mod);
555 return NULL;
556 }
557 return mod;
558}
559
560
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000561static int
562iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
563 _PyIO_State *state = IO_MOD_STATE(mod);
564 if (!state->initialized)
565 return 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000566 if (state->locale_module != NULL) {
567 Py_VISIT(state->locale_module);
568 }
569 Py_VISIT(state->unsupported_operation);
570 return 0;
571}
572
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000573
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000574static int
575iomodule_clear(PyObject *mod) {
576 _PyIO_State *state = IO_MOD_STATE(mod);
577 if (!state->initialized)
578 return 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000579 if (state->locale_module != NULL)
580 Py_CLEAR(state->locale_module);
581 Py_CLEAR(state->unsupported_operation);
582 return 0;
583}
584
585static void
586iomodule_free(PyObject *mod) {
587 iomodule_clear(mod);
588}
589
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000590
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000591/*
592 * Module definition
593 */
594
595static PyMethodDef module_methods[] = {
596 {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},
597 {NULL, NULL}
598};
599
600struct PyModuleDef _PyIO_Module = {
601 PyModuleDef_HEAD_INIT,
602 "io",
603 module_doc,
604 sizeof(_PyIO_State),
605 module_methods,
606 NULL,
607 iomodule_traverse,
608 iomodule_clear,
609 (freefunc)iomodule_free,
610};
611
612PyMODINIT_FUNC
613PyInit__io(void)
614{
615 PyObject *m = PyModule_Create(&_PyIO_Module);
616 _PyIO_State *state = NULL;
617 if (m == NULL)
618 return NULL;
619 state = IO_MOD_STATE(m);
620 state->initialized = 0;
621
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000622#define ADD_TYPE(type, name) \
623 if (PyType_Ready(type) < 0) \
624 goto fail; \
625 Py_INCREF(type); \
626 if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \
627 Py_DECREF(type); \
628 goto fail; \
629 }
630
631 /* DEFAULT_BUFFER_SIZE */
632 if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
633 goto fail;
634
635 /* UnsupportedOperation inherits from ValueError and IOError */
636 state->unsupported_operation = PyObject_CallFunction(
637 (PyObject *)&PyType_Type, "s(OO){}",
638 "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);
639 if (state->unsupported_operation == NULL)
640 goto fail;
641 Py_INCREF(state->unsupported_operation);
642 if (PyModule_AddObject(m, "UnsupportedOperation",
643 state->unsupported_operation) < 0)
644 goto fail;
645
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200646 /* BlockingIOError, for compatibility */
647 Py_INCREF(PyExc_BlockingIOError);
648 if (PyModule_AddObject(m, "BlockingIOError",
649 (PyObject *) PyExc_BlockingIOError) < 0)
650 goto fail;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000651
652 /* Concrete base types of the IO ABCs.
653 (the ABCs themselves are declared through inheritance in io.py)
654 */
655 ADD_TYPE(&PyIOBase_Type, "_IOBase");
656 ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
657 ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
658 ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
659
660 /* Implementation of concrete IO objects. */
661 /* FileIO */
662 PyFileIO_Type.tp_base = &PyRawIOBase_Type;
663 ADD_TYPE(&PyFileIO_Type, "FileIO");
664
665 /* BytesIO */
666 PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;
667 ADD_TYPE(&PyBytesIO_Type, "BytesIO");
Antoine Pitrou972ee132010-09-06 18:48:21 +0000668 if (PyType_Ready(&_PyBytesIOBuffer_Type) < 0)
669 goto fail;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000670
671 /* StringIO */
672 PyStringIO_Type.tp_base = &PyTextIOBase_Type;
673 ADD_TYPE(&PyStringIO_Type, "StringIO");
674
675 /* BufferedReader */
676 PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
677 ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");
678
679 /* BufferedWriter */
680 PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
681 ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");
682
683 /* BufferedRWPair */
684 PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
685 ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");
686
687 /* BufferedRandom */
688 PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
689 ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");
690
691 /* TextIOWrapper */
692 PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;
693 ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");
694
695 /* IncrementalNewlineDecoder */
696 ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");
697
698 /* Interned strings */
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100699#define ADD_INTERNED(name) \
700 if (!_PyIO_str_ ## name && \
701 !(_PyIO_str_ ## name = PyUnicode_InternFromString(# name))) \
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000702 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100703
704 ADD_INTERNED(close)
705 ADD_INTERNED(closed)
706 ADD_INTERNED(decode)
707 ADD_INTERNED(encode)
708 ADD_INTERNED(fileno)
709 ADD_INTERNED(flush)
710 ADD_INTERNED(getstate)
711 ADD_INTERNED(isatty)
712 ADD_INTERNED(newlines)
713 ADD_INTERNED(read)
714 ADD_INTERNED(read1)
715 ADD_INTERNED(readable)
Antoine Pitroubb5b92d2012-01-18 16:19:19 +0100716 ADD_INTERNED(readall)
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100717 ADD_INTERNED(readinto)
718 ADD_INTERNED(readline)
719 ADD_INTERNED(reset)
720 ADD_INTERNED(seek)
721 ADD_INTERNED(seekable)
722 ADD_INTERNED(setstate)
723 ADD_INTERNED(tell)
724 ADD_INTERNED(truncate)
725 ADD_INTERNED(write)
726 ADD_INTERNED(writable)
727
728 if (!_PyIO_str_nl &&
729 !(_PyIO_str_nl = PyUnicode_InternFromString("\n")))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000730 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100731
732 if (!_PyIO_empty_str &&
733 !(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000734 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100735 if (!_PyIO_empty_bytes &&
736 !(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000737 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100738 if (!_PyIO_zero &&
739 !(_PyIO_zero = PyLong_FromLong(0L)))
Antoine Pitroue4501852009-05-14 18:55:55 +0000740 goto fail;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000741
742 state->initialized = 1;
743
744 return m;
745
746 fail:
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000747 Py_XDECREF(state->unsupported_operation);
748 Py_DECREF(m);
749 return NULL;
750}