* with args=NULL, and return a new reference.
* BUT when args=Py_True is passed, they return a borrowed reference.
*/
-extern PyObject* _PyIOBase_check_readable(PyObject *self, PyObject *args);
-extern PyObject* _PyIOBase_check_writable(PyObject *self, PyObject *args);
-extern PyObject* _PyIOBase_check_seekable(PyObject *self, PyObject *args);
+typedef struct _io_state _PyIO_State; // Forward decl.
+extern PyObject* _PyIOBase_check_readable(_PyIO_State *state,
+ PyObject *self, PyObject *args);
+extern PyObject* _PyIOBase_check_writable(_PyIO_State *state,
+ PyObject *self, PyObject *args);
+extern PyObject* _PyIOBase_check_seekable(_PyIO_State *state,
+ PyObject *self, PyObject *args);
extern PyObject* _PyIOBase_check_closed(PyObject *self, PyObject *args);
/* Helper for finalization.
extern PyModuleDef _PyIO_Module;
-typedef struct {
+struct _io_state {
int initialized;
PyObject *unsupported_operation;
#ifdef MS_WINDOWS
PyTypeObject *PyWindowsConsoleIO_Type;
#endif
-} _PyIO_State;
+};
#define IO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod))
#define IO_STATE() _PyIO_get_module_state()
}
static PyObject *
-bufferediobase_unsupported(const char *message)
+bufferediobase_unsupported(_PyIO_State *state, const char *message)
{
- _PyIO_State *state = IO_STATE();
- if (state != NULL)
- PyErr_SetString(state->unsupported_operation, message);
+ PyErr_SetString(state->unsupported_operation, message);
return NULL;
}
_io__BufferedIOBase_detach_impl(PyObject *self)
/*[clinic end generated code: output=754977c8d10ed88c input=822427fb58fe4169]*/
{
- return bufferediobase_unsupported("detach");
+ _PyIO_State *state = IO_STATE();
+ return bufferediobase_unsupported(state, "detach");
}
PyDoc_STRVAR(bufferediobase_read_doc,
static PyObject *
bufferediobase_read(PyObject *self, PyObject *args)
{
- return bufferediobase_unsupported("read");
+ _PyIO_State *state = IO_STATE();
+ return bufferediobase_unsupported(state, "read");
}
PyDoc_STRVAR(bufferediobase_read1_doc,
static PyObject *
bufferediobase_read1(PyObject *self, PyObject *args)
{
- return bufferediobase_unsupported("read1");
+ _PyIO_State *state = IO_STATE();
+ return bufferediobase_unsupported(state, "read1");
}
PyDoc_STRVAR(bufferediobase_write_doc,
static PyObject *
bufferediobase_write(PyObject *self, PyObject *args)
{
- return bufferediobase_unsupported("write");
+ _PyIO_State *state = IO_STATE();
+ return bufferediobase_unsupported(state, "write");
}
CHECK_CLOSED(self, "seek of closed file")
- if (_PyIOBase_check_seekable(self->raw, Py_True) == NULL)
+ _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
+ if (_PyIOBase_check_seekable(state, self->raw, Py_True) == NULL) {
return NULL;
+ }
target = PyNumber_AsOff_t(targetobj, PyExc_ValueError);
if (target == -1 && PyErr_Occurred())
CHECK_INITIALIZED(self)
CHECK_CLOSED(self, "truncate of closed file")
if (!self->writable) {
- return bufferediobase_unsupported("truncate");
+ _PyIO_State *state = IO_STATE();
+ return bufferediobase_unsupported(state, "truncate");
}
if (!ENTER_BUFFERED(self))
return NULL;
self->ok = 0;
self->detached = 0;
- if (_PyIOBase_check_readable(raw, Py_True) == NULL)
+ _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
+ if (_PyIOBase_check_readable(state, raw, Py_True) == NULL) {
return -1;
+ }
Py_XSETREF(self->raw, Py_NewRef(raw));
self->buffer_size = buffer_size;
return -1;
_bufferedreader_reset_buf(self);
- _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
self->fast_closed_checks = (
Py_IS_TYPE(self, state->PyBufferedReader_Type) &&
Py_IS_TYPE(raw, state->PyFileIO_Type)
self->ok = 0;
self->detached = 0;
- if (_PyIOBase_check_writable(raw, Py_True) == NULL)
+ _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
+ if (_PyIOBase_check_writable(state, raw, Py_True) == NULL) {
return -1;
+ }
Py_INCREF(raw);
Py_XSETREF(self->raw, raw);
_bufferedwriter_reset_buf(self);
self->pos = 0;
- _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
self->fast_closed_checks = (
Py_IS_TYPE(self, state->PyBufferedWriter_Type) &&
Py_IS_TYPE(raw, state->PyFileIO_Type)
PyObject *writer, Py_ssize_t buffer_size)
/*[clinic end generated code: output=327e73d1aee8f984 input=620d42d71f33a031]*/
{
- if (_PyIOBase_check_readable(reader, Py_True) == NULL)
+ _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
+ if (_PyIOBase_check_readable(state, reader, Py_True) == NULL) {
return -1;
- if (_PyIOBase_check_writable(writer, Py_True) == NULL)
+ }
+ if (_PyIOBase_check_writable(state, writer, Py_True) == NULL) {
return -1;
+ }
- _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
self->reader = (buffered *) PyObject_CallFunction(
(PyObject *)state->PyBufferedReader_Type,
"On", reader, buffer_size);
self->ok = 0;
self->detached = 0;
- if (_PyIOBase_check_seekable(raw, Py_True) == NULL)
+ _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
+ if (_PyIOBase_check_seekable(state, raw, Py_True) == NULL) {
return -1;
- if (_PyIOBase_check_readable(raw, Py_True) == NULL)
+ }
+ if (_PyIOBase_check_readable(state, raw, Py_True) == NULL) {
return -1;
- if (_PyIOBase_check_writable(raw, Py_True) == NULL)
+ }
+ if (_PyIOBase_check_writable(state, raw, Py_True) == NULL) {
return -1;
+ }
Py_INCREF(raw);
Py_XSETREF(self->raw, raw);
_bufferedwriter_reset_buf(self);
self->pos = 0;
- _PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
self->fast_closed_checks = (Py_IS_TYPE(self, state->PyBufferedRandom_Type) &&
Py_IS_TYPE(raw, state->PyFileIO_Type));
/* Internal methods */
static PyObject *
-iobase_unsupported(const char *message)
+iobase_unsupported(_PyIO_State *state, const char *message)
{
- _PyIO_State *state = IO_STATE();
- if (state != NULL)
- PyErr_SetString(state->unsupported_operation, message);
+ PyErr_SetString(state->unsupported_operation, message);
return NULL;
}
static PyObject *
iobase_seek(PyObject *self, PyObject *args)
{
- return iobase_unsupported("seek");
+ _PyIO_State *state = IO_STATE();
+ return iobase_unsupported(state, "seek");
}
/*[clinic input]
static PyObject *
iobase_truncate(PyObject *self, PyObject *args)
{
- return iobase_unsupported("truncate");
+ _PyIO_State *state = IO_STATE();
+ return iobase_unsupported(state, "truncate");
}
static int
Py_RETURN_NONE;
}
+static PyObject *
+iobase_check_seekable(PyObject *self, PyObject *args)
+{
+ _PyIO_State *state = IO_STATE();
+ return _PyIOBase_check_seekable(state, self, args);
+}
+
+static PyObject *
+iobase_check_readable(PyObject *self, PyObject *args)
+{
+ _PyIO_State *state = IO_STATE();
+ return _PyIOBase_check_readable(state, self, args);
+}
+
+static PyObject *
+iobase_check_writable(PyObject *self, PyObject *args)
+{
+ _PyIO_State *state = IO_STATE();
+ return _PyIOBase_check_writable(state, self, args);
+}
+
/* XXX: IOBase thinks it has to maintain its own internal state in
`__IOBase_closed` and call flush() by itself, but it is redundant with
whatever behaviour a non-trivial derived class will implement. */
}
PyObject *
-_PyIOBase_check_seekable(PyObject *self, PyObject *args)
+_PyIOBase_check_seekable(_PyIO_State *state, PyObject *self, PyObject *args)
{
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(seekable));
if (res == NULL)
return NULL;
if (res != Py_True) {
Py_CLEAR(res);
- iobase_unsupported("File or stream is not seekable.");
+ iobase_unsupported(state, "File or stream is not seekable.");
return NULL;
}
if (args == Py_True) {
/* May be called with any object */
PyObject *
-_PyIOBase_check_readable(PyObject *self, PyObject *args)
+_PyIOBase_check_readable(_PyIO_State *state, PyObject *self, PyObject *args)
{
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(readable));
if (res == NULL)
return NULL;
if (res != Py_True) {
Py_CLEAR(res);
- iobase_unsupported("File or stream is not readable.");
+ iobase_unsupported(state, "File or stream is not readable.");
return NULL;
}
if (args == Py_True) {
/* May be called with any object */
PyObject *
-_PyIOBase_check_writable(PyObject *self, PyObject *args)
+_PyIOBase_check_writable(_PyIO_State *state, PyObject *self, PyObject *args)
{
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(writable));
if (res == NULL)
return NULL;
if (res != Py_True) {
Py_CLEAR(res);
- iobase_unsupported("File or stream is not writable.");
+ iobase_unsupported(state, "File or stream is not writable.");
return NULL;
}
if (args == Py_True) {
_io__IOBase_fileno_impl(PyObject *self)
/*[clinic end generated code: output=7cc0973f0f5f3b73 input=4e37028947dc1cc8]*/
{
- return iobase_unsupported("fileno");
+ _PyIO_State *state = IO_STATE();
+ return iobase_unsupported(state, "fileno");
}
/*[clinic input]
_IO__IOBASE_WRITABLE_METHODDEF
{"_checkClosed", _PyIOBase_check_closed, METH_NOARGS},
- {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
- {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
- {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
+ {"_checkSeekable", iobase_check_seekable, METH_NOARGS},
+ {"_checkReadable", iobase_check_readable, METH_NOARGS},
+ {"_checkWritable", iobase_check_writable, METH_NOARGS},
_IO__IOBASE_FILENO_METHODDEF
_IO__IOBASE_ISATTY_METHODDEF