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