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