blob: 1ff35648e550f3e9ddb025b247b791b511aa8ec6 [file] [log] [blame]
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001/*
2 An implementation of the I/O abstract base classes hierarchy
3 as defined by PEP 3116 - "New I/O"
Victor Stinnercc024d12013-10-29 02:23:46 +01004
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00005 Classes defined here: IOBase, RawIOBase.
Victor Stinnercc024d12013-10-29 02:23:46 +01006
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00007 Written by Amaury Forgeot d'Arc and Antoine Pitrou
8*/
9
10
11#define PY_SSIZE_T_CLEAN
12#include "Python.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +010013#include "pycore_object.h"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000014#include "structmember.h"
15#include "_iomodule.h"
16
Serhiy Storchakaf24131f2015-04-16 11:19:43 +030017/*[clinic input]
18module _io
19class _io._IOBase "PyObject *" "&PyIOBase_Type"
20class _io._RawIOBase "PyObject *" "&PyRawIOBase_Type"
21[clinic start generated code]*/
22/*[clinic end generated code: output=da39a3ee5e6b4b0d input=d29a4d076c2b211c]*/
23
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000024/*
25 * IOBase class, an abstract class
26 */
27
28typedef struct {
29 PyObject_HEAD
Victor Stinnercc024d12013-10-29 02:23:46 +010030
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000031 PyObject *dict;
32 PyObject *weakreflist;
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000033} iobase;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000034
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000035PyDoc_STRVAR(iobase_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000036 "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"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +000046 "may raise UnsupportedOperation when operations they do not support are\n"
47 "called.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000048 "\n"
49 "The basic type used for binary data read from or written to a file is\n"
Martin Panter6bb91f32016-05-28 00:41:57 +000050 "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"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000053 "\n"
Andrew Kuchling76466202014-04-15 21:11:36 -040054 "Note that calling any method (except additional calls to close(),\n"
55 "which are ignored) on a closed stream should raise a ValueError.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000056 "\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"
Ezio Melotti13925002011-03-16 11:05:33 +020062 "fp is closed after the suite of the with statement is complete:\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000063 "\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
Martin v. Löwis767046a2011-10-14 15:35:36 +020071_Py_IDENTIFIER(__IOBase_closed);
Victor Stinner3f36a572013-11-12 21:39:02 +010072_Py_IDENTIFIER(read);
73
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +020074
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000075/* Internal methods */
76static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000077iobase_unsupported(const char *message)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000078{
Antoine Pitrou712cb732013-12-21 15:51:54 +010079 _PyIO_State *state = IO_STATE();
80 if (state != NULL)
81 PyErr_SetString(state->unsupported_operation, message);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000082 return NULL;
83}
84
Raymond Hettinger15f44ab2016-08-30 10:47:49 -070085/* Positioning */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000086
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000087PyDoc_STRVAR(iobase_seek_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000088 "Change stream position.\n"
89 "\n"
Terry Jan Reedy0158af32013-03-11 17:42:46 -040090 "Change the stream position to the given byte offset. The offset is\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000091 "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
100static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000101iobase_seek(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000102{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000103 return iobase_unsupported("seek");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000104}
105
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300106/*[clinic input]
107_io._IOBase.tell
108
109Return current stream position.
110[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000111
112static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300113_io__IOBase_tell_impl(PyObject *self)
114/*[clinic end generated code: output=89a1c0807935abe2 input=04e615fec128801f]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000115{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200116 _Py_IDENTIFIER(seek);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200117
118 return _PyObject_CallMethodId(self, &PyId_seek, "ii", 0, 1);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000119}
120
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000121PyDoc_STRVAR(iobase_truncate_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000122 "Truncate file to size bytes.\n"
123 "\n"
Antoine Pitrou905a2ff2010-01-31 22:47:27 +0000124 "File pointer is left unchanged. Size defaults to the current IO\n"
125 "position as reported by tell(). Returns the new size.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000126
127static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000128iobase_truncate(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000129{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000130 return iobase_unsupported("truncate");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000131}
132
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200133static int
134iobase_is_closed(PyObject *self)
135{
136 PyObject *res;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200137 int ret;
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200138 /* This gets the derived attribute, which is *not* __IOBase_closed
139 in most cases! */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200140 ret = _PyObject_LookupAttrId(self, &PyId___IOBase_closed, &res);
141 Py_XDECREF(res);
142 return ret;
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200143}
144
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000145/* Flush and close methods */
146
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300147/*[clinic input]
148_io._IOBase.flush
149
150Flush write buffers, if applicable.
151
152This is not implemented for read-only and non-blocking streams.
153[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000154
155static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300156_io__IOBase_flush_impl(PyObject *self)
157/*[clinic end generated code: output=7cef4b4d54656a3b input=773be121abe270aa]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000158{
159 /* XXX Should this return the number of bytes written??? */
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200160 int closed = iobase_is_closed(self);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000161
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200162 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;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000169}
170
171static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000172iobase_closed_get(PyObject *self, void *context)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000173{
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200174 int closed = iobase_is_closed(self);
175 if (closed < 0) {
176 return NULL;
177 }
178 return PyBool_FromLong(closed);
179}
180
181static int
182iobase_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! */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200188 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.");
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200194 return -1;
195 }
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200196 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200197 return closed;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000198}
199
200PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000201_PyIOBase_check_closed(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000202{
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200203 if (iobase_check_closed(self)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000204 return NULL;
205 }
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200206 if (args == Py_True) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000207 return Py_None;
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200208 }
209 Py_RETURN_NONE;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000210}
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
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300216/*[clinic input]
217_io._IOBase.close
218
219Flush and close the IO object.
220
221This method has no effect if the file is already closed.
222[clinic start generated code]*/
223
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000224static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300225_io__IOBase_close_impl(PyObject *self)
226/*[clinic end generated code: output=63c6a6f57d783d6d input=f4494d5c31dbc6b7]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000227{
Zackery Spytz28f07362018-07-17 00:31:44 -0600228 PyObject *res, *exc, *val, *tb;
229 int rc, closed = iobase_is_closed(self);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000230
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200231 if (closed < 0) {
232 return NULL;
233 }
234 if (closed) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000235 Py_RETURN_NONE;
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200236 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000237
Petr Viktorinffd97532020-02-11 17:46:57 +0100238 res = PyObject_CallMethodNoArgs(self, _PyIO_str_flush);
Victor Stinneraa5bbfa2013-11-08 00:29:41 +0100239
Zackery Spytz28f07362018-07-17 00:31:44 -0600240 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);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000245 }
Victor Stinneraa5bbfa2013-11-08 00:29:41 +0100246
247 if (res == NULL)
248 return NULL;
249
250 Py_DECREF(res);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000251 Py_RETURN_NONE;
252}
253
254/* Finalization and garbage collection support */
255
Antoine Pitrou796564c2013-07-30 19:59:21 +0200256static void
257iobase_finalize(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000258{
259 PyObject *res;
Antoine Pitrou796564c2013-07-30 19:59:21 +0200260 PyObject *error_type, *error_value, *error_traceback;
261 int closed;
262 _Py_IDENTIFIER(_finalizing);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000263
Antoine Pitrou796564c2013-07-30 19:59:21 +0200264 /* Save the current exception, if any. */
265 PyErr_Fetch(&error_type, &error_value, &error_traceback);
266
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000267 /* If `closed` doesn't exist or can't be evaluated as bool, then the
268 object is probably in an unusable state, so ignore. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200269 if (_PyObject_LookupAttr(self, _PyIO_str_closed, &res) <= 0) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000270 PyErr_Clear();
Christian Heimes72f455e2013-07-31 01:33:50 +0200271 closed = -1;
272 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000273 else {
274 closed = PyObject_IsTrue(res);
275 Py_DECREF(res);
276 if (closed == -1)
277 PyErr_Clear();
278 }
279 if (closed == 0) {
Antoine Pitrou796564c2013-07-30 19:59:21 +0200280 /* 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();
Petr Viktorinffd97532020-02-11 17:46:57 +0100284 res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_close);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000285 /* Silencing I/O errors is bad, but printing spurious tracebacks is
286 equally as bad, and potentially more frequent (because of
287 shutdown issues). */
Victor Stinner44235042019-04-12 17:06:47 +0200288 if (res == NULL) {
289#ifndef Py_DEBUG
Victor Stinner331a6a52019-05-27 16:39:22 +0200290 const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config;
Victor Stinner44235042019-04-12 17:06:47 +0200291 if (config->dev_mode) {
292 PyErr_WriteUnraisable(self);
293 }
294 else {
295 PyErr_Clear();
296 }
297#else
298 PyErr_WriteUnraisable(self);
299#endif
300 }
301 else {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000302 Py_DECREF(res);
Victor Stinner44235042019-04-12 17:06:47 +0200303 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000304 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200305
306 /* Restore the saved exception. */
307 PyErr_Restore(error_type, error_value, error_traceback);
308}
309
310int
311_PyIOBase_finalize(PyObject *self)
312{
313 int is_zombie;
314
315 /* If _PyIOBase_finalize() is called from a destructor, we need to
316 resurrect the object as calling close() can invoke arbitrary code. */
317 is_zombie = (Py_REFCNT(self) == 0);
318 if (is_zombie)
319 return PyObject_CallFinalizerFromDealloc(self);
320 else {
321 PyObject_CallFinalizer(self);
322 return 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000323 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000324}
325
326static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000327iobase_traverse(iobase *self, visitproc visit, void *arg)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000328{
329 Py_VISIT(self->dict);
330 return 0;
331}
332
333static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000334iobase_clear(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000335{
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000336 Py_CLEAR(self->dict);
337 return 0;
338}
339
340/* Destructor */
341
342static void
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000343iobase_dealloc(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000344{
345 /* NOTE: since IOBaseObject has its own dict, Python-defined attributes
346 are still available here for close() to use.
347 However, if the derived class declares a __slots__, those slots are
348 already gone.
349 */
350 if (_PyIOBase_finalize((PyObject *) self) < 0) {
351 /* When called from a heap type's dealloc, the type will be
352 decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */
353 if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE))
354 Py_INCREF(Py_TYPE(self));
355 return;
356 }
357 _PyObject_GC_UNTRACK(self);
358 if (self->weakreflist != NULL)
359 PyObject_ClearWeakRefs((PyObject *) self);
360 Py_CLEAR(self->dict);
361 Py_TYPE(self)->tp_free((PyObject *) self);
362}
363
364/* Inquiry methods */
365
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300366/*[clinic input]
367_io._IOBase.seekable
368
369Return whether object supports random access.
370
Martin Panter754aab22016-03-31 07:21:56 +0000371If False, seek(), tell() and truncate() will raise OSError.
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300372This method may need to do a test seek().
373[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000374
375static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300376_io__IOBase_seekable_impl(PyObject *self)
Martin Panter754aab22016-03-31 07:21:56 +0000377/*[clinic end generated code: output=4c24c67f5f32a43d input=b976622f7fdf3063]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000378{
379 Py_RETURN_FALSE;
380}
381
382PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000383_PyIOBase_check_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000384{
Petr Viktorinffd97532020-02-11 17:46:57 +0100385 PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_seekable);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000386 if (res == NULL)
387 return NULL;
388 if (res != Py_True) {
389 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000390 iobase_unsupported("File or stream is not seekable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000391 return NULL;
392 }
393 if (args == Py_True) {
394 Py_DECREF(res);
395 }
396 return res;
397}
398
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300399/*[clinic input]
400_io._IOBase.readable
401
402Return whether object was opened for reading.
403
Martin Panter754aab22016-03-31 07:21:56 +0000404If False, read() will raise OSError.
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300405[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000406
407static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300408_io__IOBase_readable_impl(PyObject *self)
Martin Panter754aab22016-03-31 07:21:56 +0000409/*[clinic end generated code: output=e48089250686388b input=285b3b866a0ec35f]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000410{
411 Py_RETURN_FALSE;
412}
413
414/* May be called with any object */
415PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000416_PyIOBase_check_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000417{
Petr Viktorinffd97532020-02-11 17:46:57 +0100418 PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_readable);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000419 if (res == NULL)
420 return NULL;
421 if (res != Py_True) {
422 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000423 iobase_unsupported("File or stream is not readable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000424 return NULL;
425 }
426 if (args == Py_True) {
427 Py_DECREF(res);
428 }
429 return res;
430}
431
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300432/*[clinic input]
433_io._IOBase.writable
434
435Return whether object was opened for writing.
436
Martin Panter754aab22016-03-31 07:21:56 +0000437If False, write() will raise OSError.
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300438[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000439
440static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300441_io__IOBase_writable_impl(PyObject *self)
Martin Panter754aab22016-03-31 07:21:56 +0000442/*[clinic end generated code: output=406001d0985be14f input=9dcac18a013a05b5]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000443{
444 Py_RETURN_FALSE;
445}
446
447/* May be called with any object */
448PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000449_PyIOBase_check_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000450{
Petr Viktorinffd97532020-02-11 17:46:57 +0100451 PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_writable);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000452 if (res == NULL)
453 return NULL;
454 if (res != Py_True) {
455 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000456 iobase_unsupported("File or stream is not writable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000457 return NULL;
458 }
459 if (args == Py_True) {
460 Py_DECREF(res);
461 }
462 return res;
463}
464
465/* Context manager */
466
467static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000468iobase_enter(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000469{
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200470 if (iobase_check_closed(self))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000471 return NULL;
472
473 Py_INCREF(self);
474 return self;
475}
476
477static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000478iobase_exit(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000479{
Petr Viktorinffd97532020-02-11 17:46:57 +0100480 return PyObject_CallMethodNoArgs(self, _PyIO_str_close);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000481}
482
483/* Lower-level APIs */
484
485/* XXX Should these be present even if unimplemented? */
486
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300487/*[clinic input]
488_io._IOBase.fileno
489
490Returns underlying file descriptor if one exists.
491
Martin Panter754aab22016-03-31 07:21:56 +0000492OSError is raised if the IO object does not use a file descriptor.
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300493[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000494
495static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300496_io__IOBase_fileno_impl(PyObject *self)
Martin Panter754aab22016-03-31 07:21:56 +0000497/*[clinic end generated code: output=7cc0973f0f5f3b73 input=4e37028947dc1cc8]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000498{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000499 return iobase_unsupported("fileno");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000500}
501
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300502/*[clinic input]
503_io._IOBase.isatty
504
505Return whether this is an 'interactive' stream.
506
507Return False if it can't be determined.
508[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000509
510static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300511_io__IOBase_isatty_impl(PyObject *self)
512/*[clinic end generated code: output=60cab77cede41cdd input=9ef76530d368458b]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000513{
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200514 if (iobase_check_closed(self))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000515 return NULL;
516 Py_RETURN_FALSE;
517}
518
519/* Readline(s) and writelines */
520
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300521/*[clinic input]
522_io._IOBase.readline
Serhiy Storchaka762bf402017-03-30 09:15:31 +0300523 size as limit: Py_ssize_t(accept={int, NoneType}) = -1
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300524 /
525
526Read and return a line from the stream.
527
528If size is specified, at most size bytes will be read.
529
530The line terminator is always b'\n' for binary files; for text
531files, the newlines argument to open can be used to select the line
532terminator(s) recognized.
533[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000534
535static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300536_io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit)
Serhiy Storchaka762bf402017-03-30 09:15:31 +0300537/*[clinic end generated code: output=4479f79b58187840 input=d0c596794e877bff]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000538{
539 /* For backwards compatibility, a (slowish) readline(). */
540
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200541 PyObject *peek, *buffer, *result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000542 Py_ssize_t old_size = -1;
543
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200544 if (_PyObject_LookupAttr(self, _PyIO_str_peek, &peek) < 0) {
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200545 return NULL;
546 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000547
548 buffer = PyByteArray_FromStringAndSize(NULL, 0);
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200549 if (buffer == NULL) {
550 Py_XDECREF(peek);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000551 return NULL;
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200552 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000553
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200554 while (limit < 0 || PyByteArray_GET_SIZE(buffer) < limit) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000555 Py_ssize_t nreadahead = 1;
556 PyObject *b;
557
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200558 if (peek != NULL) {
Petr Viktorinffd97532020-02-11 17:46:57 +0100559 PyObject *readahead = PyObject_CallOneArg(peek, _PyLong_One);
Gregory P. Smith51359922012-06-23 23:55:39 -0700560 if (readahead == NULL) {
561 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
562 when EINTR occurs so we needn't do it ourselves. */
563 if (_PyIO_trap_eintr()) {
564 continue;
565 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000566 goto fail;
Gregory P. Smith51359922012-06-23 23:55:39 -0700567 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000568 if (!PyBytes_Check(readahead)) {
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300569 PyErr_Format(PyExc_OSError,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000570 "peek() should have returned a bytes object, "
571 "not '%.200s'", Py_TYPE(readahead)->tp_name);
572 Py_DECREF(readahead);
573 goto fail;
574 }
575 if (PyBytes_GET_SIZE(readahead) > 0) {
576 Py_ssize_t n = 0;
577 const char *buf = PyBytes_AS_STRING(readahead);
578 if (limit >= 0) {
579 do {
580 if (n >= PyBytes_GET_SIZE(readahead) || n >= limit)
581 break;
582 if (buf[n++] == '\n')
583 break;
584 } while (1);
585 }
586 else {
587 do {
588 if (n >= PyBytes_GET_SIZE(readahead))
589 break;
590 if (buf[n++] == '\n')
591 break;
592 } while (1);
593 }
594 nreadahead = n;
595 }
596 Py_DECREF(readahead);
597 }
598
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200599 b = _PyObject_CallMethodId(self, &PyId_read, "n", nreadahead);
Gregory P. Smith51359922012-06-23 23:55:39 -0700600 if (b == NULL) {
601 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
602 when EINTR occurs so we needn't do it ourselves. */
603 if (_PyIO_trap_eintr()) {
604 continue;
605 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000606 goto fail;
Gregory P. Smith51359922012-06-23 23:55:39 -0700607 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000608 if (!PyBytes_Check(b)) {
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300609 PyErr_Format(PyExc_OSError,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000610 "read() should have returned a bytes object, "
611 "not '%.200s'", Py_TYPE(b)->tp_name);
612 Py_DECREF(b);
613 goto fail;
614 }
615 if (PyBytes_GET_SIZE(b) == 0) {
616 Py_DECREF(b);
617 break;
618 }
619
620 old_size = PyByteArray_GET_SIZE(buffer);
Victor Stinnercc024d12013-10-29 02:23:46 +0100621 if (PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b)) < 0) {
622 Py_DECREF(b);
623 goto fail;
624 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000625 memcpy(PyByteArray_AS_STRING(buffer) + old_size,
626 PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
627
628 Py_DECREF(b);
629
630 if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == '\n')
631 break;
632 }
633
634 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),
635 PyByteArray_GET_SIZE(buffer));
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200636 Py_XDECREF(peek);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000637 Py_DECREF(buffer);
638 return result;
639 fail:
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200640 Py_XDECREF(peek);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000641 Py_DECREF(buffer);
642 return NULL;
643}
644
645static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000646iobase_iter(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000647{
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200648 if (iobase_check_closed(self))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000649 return NULL;
650
651 Py_INCREF(self);
652 return self;
653}
654
655static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000656iobase_iternext(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000657{
Petr Viktorinffd97532020-02-11 17:46:57 +0100658 PyObject *line = PyObject_CallMethodNoArgs(self, _PyIO_str_readline);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000659
660 if (line == NULL)
661 return NULL;
662
Serhiy Storchakabf623ae2017-04-19 20:03:52 +0300663 if (PyObject_Size(line) <= 0) {
664 /* Error or empty */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000665 Py_DECREF(line);
666 return NULL;
667 }
668
669 return line;
670}
671
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300672/*[clinic input]
673_io._IOBase.readlines
Serhiy Storchaka762bf402017-03-30 09:15:31 +0300674 hint: Py_ssize_t(accept={int, NoneType}) = -1
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300675 /
676
677Return a list of lines from the stream.
678
679hint can be specified to control the number of lines read: no more
680lines will be read if the total size (in bytes/characters) of all
681lines so far exceeds hint.
682[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000683
684static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300685_io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint)
Serhiy Storchaka762bf402017-03-30 09:15:31 +0300686/*[clinic end generated code: output=2f50421677fa3dea input=9400c786ea9dc416]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000687{
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300688 Py_ssize_t length = 0;
Xiang Zhang026435c2017-04-15 12:47:28 +0800689 PyObject *result, *it = NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000690
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000691 result = PyList_New(0);
692 if (result == NULL)
693 return NULL;
694
695 if (hint <= 0) {
696 /* XXX special-casing this made sense in the Python version in order
697 to remove the bytecode interpretation overhead, but it could
698 probably be removed here. */
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200699 _Py_IDENTIFIER(extend);
Victor Stinner61bdb0d2016-12-09 15:39:28 +0100700 PyObject *ret = _PyObject_CallMethodIdObjArgs(result, &PyId_extend,
701 self, NULL);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200702
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000703 if (ret == NULL) {
Xiang Zhang026435c2017-04-15 12:47:28 +0800704 goto error;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000705 }
706 Py_DECREF(ret);
707 return result;
708 }
709
Xiang Zhang026435c2017-04-15 12:47:28 +0800710 it = PyObject_GetIter(self);
711 if (it == NULL) {
712 goto error;
713 }
714
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000715 while (1) {
Serhiy Storchakabf623ae2017-04-19 20:03:52 +0300716 Py_ssize_t line_length;
Xiang Zhang026435c2017-04-15 12:47:28 +0800717 PyObject *line = PyIter_Next(it);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000718 if (line == NULL) {
719 if (PyErr_Occurred()) {
Xiang Zhang026435c2017-04-15 12:47:28 +0800720 goto error;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000721 }
722 else
723 break; /* StopIteration raised */
724 }
725
726 if (PyList_Append(result, line) < 0) {
727 Py_DECREF(line);
Xiang Zhang026435c2017-04-15 12:47:28 +0800728 goto error;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000729 }
Serhiy Storchakabf623ae2017-04-19 20:03:52 +0300730 line_length = PyObject_Size(line);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000731 Py_DECREF(line);
Serhiy Storchakabf623ae2017-04-19 20:03:52 +0300732 if (line_length < 0) {
733 goto error;
734 }
735 if (line_length > hint - length)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000736 break;
Serhiy Storchakabf623ae2017-04-19 20:03:52 +0300737 length += line_length;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000738 }
Xiang Zhang026435c2017-04-15 12:47:28 +0800739
740 Py_DECREF(it);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000741 return result;
Xiang Zhang026435c2017-04-15 12:47:28 +0800742
743 error:
744 Py_XDECREF(it);
745 Py_DECREF(result);
746 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000747}
748
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300749/*[clinic input]
750_io._IOBase.writelines
751 lines: object
752 /
Marcin Niemiraab865212019-04-22 21:13:51 +1000753
754Write a list of lines to stream.
755
756Line separators are not added, so it is usual for each of the
757lines provided to have a line separator at the end.
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300758[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000759
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300760static PyObject *
761_io__IOBase_writelines(PyObject *self, PyObject *lines)
Marcin Niemiraab865212019-04-22 21:13:51 +1000762/*[clinic end generated code: output=976eb0a9b60a6628 input=cac3fc8864183359]*/
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300763{
764 PyObject *iter, *res;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000765
Serhiy Storchaka4d9aec02018-01-16 18:34:21 +0200766 if (iobase_check_closed(self))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000767 return NULL;
768
769 iter = PyObject_GetIter(lines);
770 if (iter == NULL)
771 return NULL;
772
773 while (1) {
774 PyObject *line = PyIter_Next(iter);
775 if (line == NULL) {
776 if (PyErr_Occurred()) {
777 Py_DECREF(iter);
778 return NULL;
779 }
780 else
781 break; /* Stop Iteration */
782 }
783
Gregory P. Smithb9817b02013-02-01 13:03:39 -0800784 res = NULL;
785 do {
786 res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);
787 } while (res == NULL && _PyIO_trap_eintr());
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000788 Py_DECREF(line);
789 if (res == NULL) {
790 Py_DECREF(iter);
791 return NULL;
792 }
793 Py_DECREF(res);
794 }
795 Py_DECREF(iter);
796 Py_RETURN_NONE;
797}
798
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300799#include "clinic/iobase.c.h"
800
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000801static PyMethodDef iobase_methods[] = {
802 {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc},
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300803 _IO__IOBASE_TELL_METHODDEF
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000804 {"truncate", iobase_truncate, METH_VARARGS, iobase_truncate_doc},
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300805 _IO__IOBASE_FLUSH_METHODDEF
806 _IO__IOBASE_CLOSE_METHODDEF
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000807
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300808 _IO__IOBASE_SEEKABLE_METHODDEF
809 _IO__IOBASE_READABLE_METHODDEF
810 _IO__IOBASE_WRITABLE_METHODDEF
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000811
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000812 {"_checkClosed", _PyIOBase_check_closed, METH_NOARGS},
813 {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
814 {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
815 {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000816
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300817 _IO__IOBASE_FILENO_METHODDEF
818 _IO__IOBASE_ISATTY_METHODDEF
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000819
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000820 {"__enter__", iobase_enter, METH_NOARGS},
821 {"__exit__", iobase_exit, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000822
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300823 _IO__IOBASE_READLINE_METHODDEF
824 _IO__IOBASE_READLINES_METHODDEF
825 _IO__IOBASE_WRITELINES_METHODDEF
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000826
827 {NULL, NULL}
828};
829
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000830static PyGetSetDef iobase_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500831 {"__dict__", PyObject_GenericGetDict, NULL, NULL},
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000832 {"closed", (getter)iobase_closed_get, NULL, NULL},
Benjamin Peterson1fea3212009-04-19 03:15:20 +0000833 {NULL}
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000834};
835
836
837PyTypeObject PyIOBase_Type = {
838 PyVarObject_HEAD_INIT(NULL, 0)
839 "_io._IOBase", /*tp_name*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000840 sizeof(iobase), /*tp_basicsize*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000841 0, /*tp_itemsize*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000842 (destructor)iobase_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200843 0, /*tp_vectorcall_offset*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000844 0, /*tp_getattr*/
845 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200846 0, /*tp_as_async*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000847 0, /*tp_repr*/
848 0, /*tp_as_number*/
849 0, /*tp_as_sequence*/
850 0, /*tp_as_mapping*/
851 0, /*tp_hash */
852 0, /*tp_call*/
853 0, /*tp_str*/
854 0, /*tp_getattro*/
855 0, /*tp_setattro*/
856 0, /*tp_as_buffer*/
857 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
Antoine Pitrouada319b2019-05-29 22:12:38 +0200858 | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000859 iobase_doc, /* tp_doc */
860 (traverseproc)iobase_traverse, /* tp_traverse */
861 (inquiry)iobase_clear, /* tp_clear */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000862 0, /* tp_richcompare */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000863 offsetof(iobase, weakreflist), /* tp_weaklistoffset */
864 iobase_iter, /* tp_iter */
865 iobase_iternext, /* tp_iternext */
866 iobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000867 0, /* tp_members */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000868 iobase_getset, /* tp_getset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000869 0, /* tp_base */
870 0, /* tp_dict */
871 0, /* tp_descr_get */
872 0, /* tp_descr_set */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000873 offsetof(iobase, dict), /* tp_dictoffset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000874 0, /* tp_init */
875 0, /* tp_alloc */
876 PyType_GenericNew, /* tp_new */
Antoine Pitrou796564c2013-07-30 19:59:21 +0200877 0, /* tp_free */
878 0, /* tp_is_gc */
879 0, /* tp_bases */
880 0, /* tp_mro */
881 0, /* tp_cache */
882 0, /* tp_subclasses */
883 0, /* tp_weaklist */
884 0, /* tp_del */
885 0, /* tp_version_tag */
Victor Stinner928bff02016-03-19 10:36:36 +0100886 iobase_finalize, /* tp_finalize */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000887};
888
889
890/*
891 * RawIOBase class, Inherits from IOBase.
892 */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000893PyDoc_STRVAR(rawiobase_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000894 "Base class for raw binary I/O.");
895
896/*
897 * The read() method is implemented by calling readinto(); derived classes
898 * that want to support read() only need to implement readinto() as a
899 * primitive operation. In general, readinto() can be more efficient than
900 * read().
901 *
902 * (It would be tempting to also provide an implementation of readinto() in
903 * terms of read(), in case the latter is a more suitable primitive operation,
904 * but that would lead to nasty recursion in case a subclass doesn't implement
905 * either.)
906*/
907
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300908/*[clinic input]
909_io._RawIOBase.read
910 size as n: Py_ssize_t = -1
911 /
912[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000913
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300914static PyObject *
915_io__RawIOBase_read_impl(PyObject *self, Py_ssize_t n)
916/*[clinic end generated code: output=6cdeb731e3c9f13c input=b6d0dcf6417d1374]*/
917{
918 PyObject *b, *res;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000919
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200920 if (n < 0) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200921 _Py_IDENTIFIER(readall);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200922
Jeroen Demeyer762f93f2019-07-08 10:19:25 +0200923 return _PyObject_CallMethodIdNoArgs(self, &PyId_readall);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200924 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000925
926 /* TODO: allocate a bytes object directly instead and manually construct
927 a writable memoryview pointing to it. */
928 b = PyByteArray_FromStringAndSize(NULL, n);
929 if (b == NULL)
930 return NULL;
931
932 res = PyObject_CallMethodObjArgs(self, _PyIO_str_readinto, b, NULL);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000933 if (res == NULL || res == Py_None) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000934 Py_DECREF(b);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000935 return res;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000936 }
937
938 n = PyNumber_AsSsize_t(res, PyExc_ValueError);
939 Py_DECREF(res);
940 if (n == -1 && PyErr_Occurred()) {
941 Py_DECREF(b);
942 return NULL;
943 }
944
945 res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n);
946 Py_DECREF(b);
947 return res;
948}
949
950
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300951/*[clinic input]
952_io._RawIOBase.readall
953
954Read until EOF, using multiple read() call.
955[clinic start generated code]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000956
957static PyObject *
Serhiy Storchakaf24131f2015-04-16 11:19:43 +0300958_io__RawIOBase_readall_impl(PyObject *self)
959/*[clinic end generated code: output=1987b9ce929425a0 input=688874141213622a]*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000960{
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000961 int r;
962 PyObject *chunks = PyList_New(0);
963 PyObject *result;
Victor Stinnercc024d12013-10-29 02:23:46 +0100964
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000965 if (chunks == NULL)
966 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000967
968 while (1) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200969 PyObject *data = _PyObject_CallMethodId(self, &PyId_read,
970 "i", DEFAULT_BUFFER_SIZE);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000971 if (!data) {
Gregory P. Smith51359922012-06-23 23:55:39 -0700972 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
973 when EINTR occurs so we needn't do it ourselves. */
974 if (_PyIO_trap_eintr()) {
975 continue;
976 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000977 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000978 return NULL;
979 }
Victor Stinnera80987f2011-05-25 22:47:16 +0200980 if (data == Py_None) {
981 if (PyList_GET_SIZE(chunks) == 0) {
982 Py_DECREF(chunks);
983 return data;
984 }
985 Py_DECREF(data);
986 break;
987 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000988 if (!PyBytes_Check(data)) {
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000989 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000990 Py_DECREF(data);
991 PyErr_SetString(PyExc_TypeError, "read() should return bytes");
992 return NULL;
993 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000994 if (PyBytes_GET_SIZE(data) == 0) {
995 /* EOF */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000996 Py_DECREF(data);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000997 break;
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000998 }
999 r = PyList_Append(chunks, data);
1000 Py_DECREF(data);
1001 if (r < 0) {
1002 Py_DECREF(chunks);
1003 return NULL;
1004 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001005 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +00001006 result = _PyBytes_Join(_PyIO_empty_bytes, chunks);
1007 Py_DECREF(chunks);
1008 return result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001009}
1010
Antoine Pitrou45d61562015-05-20 21:50:59 +02001011static PyObject *
1012rawiobase_readinto(PyObject *self, PyObject *args)
1013{
1014 PyErr_SetNone(PyExc_NotImplementedError);
1015 return NULL;
1016}
1017
1018static PyObject *
1019rawiobase_write(PyObject *self, PyObject *args)
1020{
1021 PyErr_SetNone(PyExc_NotImplementedError);
1022 return NULL;
1023}
1024
Benjamin Peterson680bf1a2009-06-12 02:07:12 +00001025static PyMethodDef rawiobase_methods[] = {
Serhiy Storchakaf24131f2015-04-16 11:19:43 +03001026 _IO__RAWIOBASE_READ_METHODDEF
1027 _IO__RAWIOBASE_READALL_METHODDEF
Antoine Pitrou45d61562015-05-20 21:50:59 +02001028 {"readinto", rawiobase_readinto, METH_VARARGS},
1029 {"write", rawiobase_write, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001030 {NULL, NULL}
1031};
1032
1033PyTypeObject PyRawIOBase_Type = {
1034 PyVarObject_HEAD_INIT(NULL, 0)
1035 "_io._RawIOBase", /*tp_name*/
1036 0, /*tp_basicsize*/
1037 0, /*tp_itemsize*/
1038 0, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001039 0, /*tp_vectorcall_offset*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001040 0, /*tp_getattr*/
1041 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001042 0, /*tp_as_async*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001043 0, /*tp_repr*/
1044 0, /*tp_as_number*/
1045 0, /*tp_as_sequence*/
1046 0, /*tp_as_mapping*/
1047 0, /*tp_hash */
1048 0, /*tp_call*/
1049 0, /*tp_str*/
1050 0, /*tp_getattro*/
1051 0, /*tp_setattro*/
1052 0, /*tp_as_buffer*/
Antoine Pitrouada319b2019-05-29 22:12:38 +02001053 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +00001054 rawiobase_doc, /* tp_doc */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001055 0, /* tp_traverse */
1056 0, /* tp_clear */
1057 0, /* tp_richcompare */
1058 0, /* tp_weaklistoffset */
1059 0, /* tp_iter */
1060 0, /* tp_iternext */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +00001061 rawiobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001062 0, /* tp_members */
1063 0, /* tp_getset */
1064 &PyIOBase_Type, /* tp_base */
1065 0, /* tp_dict */
1066 0, /* tp_descr_get */
1067 0, /* tp_descr_set */
1068 0, /* tp_dictoffset */
1069 0, /* tp_init */
1070 0, /* tp_alloc */
1071 0, /* tp_new */
Antoine Pitrou796564c2013-07-30 19:59:21 +02001072 0, /* tp_free */
1073 0, /* tp_is_gc */
1074 0, /* tp_bases */
1075 0, /* tp_mro */
1076 0, /* tp_cache */
1077 0, /* tp_subclasses */
1078 0, /* tp_weaklist */
1079 0, /* tp_del */
1080 0, /* tp_version_tag */
1081 0, /* tp_finalize */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001082};