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