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