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