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