Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 235b827

Browse filesBrowse files
gh-101819: Refactor _io in preparation for module isolation (#104334)
- Replace query with parameter in bufferediobase_unsupported() - Replace query with parameter in iobase_unsupported() - Hide delegate: Add method wrapper for _PyIOBase_check_seekable - Hide delegate: Add method wraper for _PyIOBase_check_readable - Hide delegate: Add method wraper for _PyIOBase_check_writable - Replace query with parameter in _PyIOBase_check_seekable() - Replace query with parameter in _PyIOBase_check_readable() - Replace query with parameter in _PyIOBase_check_writable()
1 parent fe694a6 commit 235b827
Copy full SHA for 235b827

File tree

3 files changed

+80
-42
lines changed
Filter options

3 files changed

+80
-42
lines changed

‎Modules/_io/_iomodule.h

Copy file name to clipboardExpand all lines: Modules/_io/_iomodule.h
+9-5Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@ extern PyType_Spec winconsoleio_spec;
3434
* with args=NULL, and return a new reference.
3535
* BUT when args=Py_True is passed, they return a borrowed reference.
3636
*/
37-
extern PyObject* _PyIOBase_check_readable(PyObject *self, PyObject *args);
38-
extern PyObject* _PyIOBase_check_writable(PyObject *self, PyObject *args);
39-
extern PyObject* _PyIOBase_check_seekable(PyObject *self, PyObject *args);
37+
typedef struct _io_state _PyIO_State; // Forward decl.
38+
extern PyObject* _PyIOBase_check_readable(_PyIO_State *state,
39+
PyObject *self, PyObject *args);
40+
extern PyObject* _PyIOBase_check_writable(_PyIO_State *state,
41+
PyObject *self, PyObject *args);
42+
extern PyObject* _PyIOBase_check_seekable(_PyIO_State *state,
43+
PyObject *self, PyObject *args);
4044
extern PyObject* _PyIOBase_check_closed(PyObject *self, PyObject *args);
4145

4246
/* Helper for finalization.
@@ -140,7 +144,7 @@ extern Py_off_t PyNumber_AsOff_t(PyObject *item, PyObject *err);
140144

141145
extern PyModuleDef _PyIO_Module;
142146

143-
typedef struct {
147+
struct _io_state {
144148
int initialized;
145149
PyObject *unsupported_operation;
146150

@@ -161,7 +165,7 @@ typedef struct {
161165
#ifdef MS_WINDOWS
162166
PyTypeObject *PyWindowsConsoleIO_Type;
163167
#endif
164-
} _PyIO_State;
168+
};
165169

166170
#define IO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod))
167171
#define IO_STATE() _PyIO_get_module_state()

‎Modules/_io/bufferedio.c

Copy file name to clipboardExpand all lines: Modules/_io/bufferedio.c
+33-21Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,9 @@ _io__BufferedIOBase_readinto1_impl(PyObject *self, Py_buffer *buffer)
106106
}
107107

108108
static PyObject *
109-
bufferediobase_unsupported(const char *message)
109+
bufferediobase_unsupported(_PyIO_State *state, const char *message)
110110
{
111-
_PyIO_State *state = IO_STATE();
112-
if (state != NULL)
113-
PyErr_SetString(state->unsupported_operation, message);
111+
PyErr_SetString(state->unsupported_operation, message);
114112
return NULL;
115113
}
116114

@@ -127,7 +125,8 @@ static PyObject *
127125
_io__BufferedIOBase_detach_impl(PyObject *self)
128126
/*[clinic end generated code: output=754977c8d10ed88c input=822427fb58fe4169]*/
129127
{
130-
return bufferediobase_unsupported("detach");
128+
_PyIO_State *state = IO_STATE();
129+
return bufferediobase_unsupported(state, "detach");
131130
}
132131

133132
PyDoc_STRVAR(bufferediobase_read_doc,
@@ -151,7 +150,8 @@ PyDoc_STRVAR(bufferediobase_read_doc,
151150
static PyObject *
152151
bufferediobase_read(PyObject *self, PyObject *args)
153152
{
154-
return bufferediobase_unsupported("read");
153+
_PyIO_State *state = IO_STATE();
154+
return bufferediobase_unsupported(state, "read");
155155
}
156156

157157
PyDoc_STRVAR(bufferediobase_read1_doc,
@@ -164,7 +164,8 @@ PyDoc_STRVAR(bufferediobase_read1_doc,
164164
static PyObject *
165165
bufferediobase_read1(PyObject *self, PyObject *args)
166166
{
167-
return bufferediobase_unsupported("read1");
167+
_PyIO_State *state = IO_STATE();
168+
return bufferediobase_unsupported(state, "read1");
168169
}
169170

170171
PyDoc_STRVAR(bufferediobase_write_doc,
@@ -179,7 +180,8 @@ PyDoc_STRVAR(bufferediobase_write_doc,
179180
static PyObject *
180181
bufferediobase_write(PyObject *self, PyObject *args)
181182
{
182-
return bufferediobase_unsupported("write");
183+
_PyIO_State *state = IO_STATE();
184+
return bufferediobase_unsupported(state, "write");
183185
}
184186

185187

@@ -1222,8 +1224,10 @@ _io__Buffered_seek_impl(buffered *self, PyObject *targetobj, int whence)
12221224

12231225
CHECK_CLOSED(self, "seek of closed file")
12241226

1225-
if (_PyIOBase_check_seekable(self->raw, Py_True) == NULL)
1227+
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
1228+
if (_PyIOBase_check_seekable(state, self->raw, Py_True) == NULL) {
12261229
return NULL;
1230+
}
12271231

12281232
target = PyNumber_AsOff_t(targetobj, PyExc_ValueError);
12291233
if (target == -1 && PyErr_Occurred())
@@ -1298,7 +1302,8 @@ _io__Buffered_truncate_impl(buffered *self, PyObject *pos)
12981302
CHECK_INITIALIZED(self)
12991303
CHECK_CLOSED(self, "truncate of closed file")
13001304
if (!self->writable) {
1301-
return bufferediobase_unsupported("truncate");
1305+
_PyIO_State *state = IO_STATE();
1306+
return bufferediobase_unsupported(state, "truncate");
13021307
}
13031308
if (!ENTER_BUFFERED(self))
13041309
return NULL;
@@ -1419,8 +1424,10 @@ _io_BufferedReader___init___impl(buffered *self, PyObject *raw,
14191424
self->ok = 0;
14201425
self->detached = 0;
14211426

1422-
if (_PyIOBase_check_readable(raw, Py_True) == NULL)
1427+
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
1428+
if (_PyIOBase_check_readable(state, raw, Py_True) == NULL) {
14231429
return -1;
1430+
}
14241431

14251432
Py_XSETREF(self->raw, Py_NewRef(raw));
14261433
self->buffer_size = buffer_size;
@@ -1431,7 +1438,6 @@ _io_BufferedReader___init___impl(buffered *self, PyObject *raw,
14311438
return -1;
14321439
_bufferedreader_reset_buf(self);
14331440

1434-
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
14351441
self->fast_closed_checks = (
14361442
Py_IS_TYPE(self, state->PyBufferedReader_Type) &&
14371443
Py_IS_TYPE(raw, state->PyFileIO_Type)
@@ -1774,8 +1780,10 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
17741780
self->ok = 0;
17751781
self->detached = 0;
17761782

1777-
if (_PyIOBase_check_writable(raw, Py_True) == NULL)
1783+
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
1784+
if (_PyIOBase_check_writable(state, raw, Py_True) == NULL) {
17781785
return -1;
1786+
}
17791787

17801788
Py_INCREF(raw);
17811789
Py_XSETREF(self->raw, raw);
@@ -1788,7 +1796,6 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
17881796
_bufferedwriter_reset_buf(self);
17891797
self->pos = 0;
17901798

1791-
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
17921799
self->fast_closed_checks = (
17931800
Py_IS_TYPE(self, state->PyBufferedWriter_Type) &&
17941801
Py_IS_TYPE(raw, state->PyFileIO_Type)
@@ -2092,12 +2099,14 @@ _io_BufferedRWPair___init___impl(rwpair *self, PyObject *reader,
20922099
PyObject *writer, Py_ssize_t buffer_size)
20932100
/*[clinic end generated code: output=327e73d1aee8f984 input=620d42d71f33a031]*/
20942101
{
2095-
if (_PyIOBase_check_readable(reader, Py_True) == NULL)
2102+
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
2103+
if (_PyIOBase_check_readable(state, reader, Py_True) == NULL) {
20962104
return -1;
2097-
if (_PyIOBase_check_writable(writer, Py_True) == NULL)
2105+
}
2106+
if (_PyIOBase_check_writable(state, writer, Py_True) == NULL) {
20982107
return -1;
2108+
}
20992109

2100-
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
21012110
self->reader = (buffered *) PyObject_CallFunction(
21022111
(PyObject *)state->PyBufferedReader_Type,
21032112
"On", reader, buffer_size);
@@ -2290,12 +2299,16 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw,
22902299
self->ok = 0;
22912300
self->detached = 0;
22922301

2293-
if (_PyIOBase_check_seekable(raw, Py_True) == NULL)
2302+
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
2303+
if (_PyIOBase_check_seekable(state, raw, Py_True) == NULL) {
22942304
return -1;
2295-
if (_PyIOBase_check_readable(raw, Py_True) == NULL)
2305+
}
2306+
if (_PyIOBase_check_readable(state, raw, Py_True) == NULL) {
22962307
return -1;
2297-
if (_PyIOBase_check_writable(raw, Py_True) == NULL)
2308+
}
2309+
if (_PyIOBase_check_writable(state, raw, Py_True) == NULL) {
22982310
return -1;
2311+
}
22992312

23002313
Py_INCREF(raw);
23012314
Py_XSETREF(self->raw, raw);
@@ -2309,7 +2322,6 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw,
23092322
_bufferedwriter_reset_buf(self);
23102323
self->pos = 0;
23112324

2312-
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
23132325
self->fast_closed_checks = (Py_IS_TYPE(self, state->PyBufferedRandom_Type) &&
23142326
Py_IS_TYPE(raw, state->PyFileIO_Type));
23152327

‎Modules/_io/iobase.c

Copy file name to clipboardExpand all lines: Modules/_io/iobase.c
+38-16Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,9 @@ PyDoc_STRVAR(iobase_doc,
7171

7272
/* Internal methods */
7373
static PyObject *
74-
iobase_unsupported(const char *message)
74+
iobase_unsupported(_PyIO_State *state, const char *message)
7575
{
76-
_PyIO_State *state = IO_STATE();
77-
if (state != NULL)
78-
PyErr_SetString(state->unsupported_operation, message);
76+
PyErr_SetString(state->unsupported_operation, message);
7977
return NULL;
8078
}
8179

@@ -97,7 +95,8 @@ PyDoc_STRVAR(iobase_seek_doc,
9795
static PyObject *
9896
iobase_seek(PyObject *self, PyObject *args)
9997
{
100-
return iobase_unsupported("seek");
98+
_PyIO_State *state = IO_STATE();
99+
return iobase_unsupported(state, "seek");
101100
}
102101

103102
/*[clinic input]
@@ -122,7 +121,8 @@ PyDoc_STRVAR(iobase_truncate_doc,
122121
static PyObject *
123122
iobase_truncate(PyObject *self, PyObject *args)
124123
{
125-
return iobase_unsupported("truncate");
124+
_PyIO_State *state = IO_STATE();
125+
return iobase_unsupported(state, "truncate");
126126
}
127127

128128
static int
@@ -204,6 +204,27 @@ _PyIOBase_check_closed(PyObject *self, PyObject *args)
204204
Py_RETURN_NONE;
205205
}
206206

207+
static PyObject *
208+
iobase_check_seekable(PyObject *self, PyObject *args)
209+
{
210+
_PyIO_State *state = IO_STATE();
211+
return _PyIOBase_check_seekable(state, self, args);
212+
}
213+
214+
static PyObject *
215+
iobase_check_readable(PyObject *self, PyObject *args)
216+
{
217+
_PyIO_State *state = IO_STATE();
218+
return _PyIOBase_check_readable(state, self, args);
219+
}
220+
221+
static PyObject *
222+
iobase_check_writable(PyObject *self, PyObject *args)
223+
{
224+
_PyIO_State *state = IO_STATE();
225+
return _PyIOBase_check_writable(state, self, args);
226+
}
227+
207228
/* XXX: IOBase thinks it has to maintain its own internal state in
208229
`__IOBase_closed` and call flush() by itself, but it is redundant with
209230
whatever behaviour a non-trivial derived class will implement. */
@@ -372,14 +393,14 @@ _io__IOBase_seekable_impl(PyObject *self)
372393
}
373394

374395
PyObject *
375-
_PyIOBase_check_seekable(PyObject *self, PyObject *args)
396+
_PyIOBase_check_seekable(_PyIO_State *state, PyObject *self, PyObject *args)
376397
{
377398
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(seekable));
378399
if (res == NULL)
379400
return NULL;
380401
if (res != Py_True) {
381402
Py_CLEAR(res);
382-
iobase_unsupported("File or stream is not seekable.");
403+
iobase_unsupported(state, "File or stream is not seekable.");
383404
return NULL;
384405
}
385406
if (args == Py_True) {
@@ -405,14 +426,14 @@ _io__IOBase_readable_impl(PyObject *self)
405426

406427
/* May be called with any object */
407428
PyObject *
408-
_PyIOBase_check_readable(PyObject *self, PyObject *args)
429+
_PyIOBase_check_readable(_PyIO_State *state, PyObject *self, PyObject *args)
409430
{
410431
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(readable));
411432
if (res == NULL)
412433
return NULL;
413434
if (res != Py_True) {
414435
Py_CLEAR(res);
415-
iobase_unsupported("File or stream is not readable.");
436+
iobase_unsupported(state, "File or stream is not readable.");
416437
return NULL;
417438
}
418439
if (args == Py_True) {
@@ -438,14 +459,14 @@ _io__IOBase_writable_impl(PyObject *self)
438459

439460
/* May be called with any object */
440461
PyObject *
441-
_PyIOBase_check_writable(PyObject *self, PyObject *args)
462+
_PyIOBase_check_writable(_PyIO_State *state, PyObject *self, PyObject *args)
442463
{
443464
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(writable));
444465
if (res == NULL)
445466
return NULL;
446467
if (res != Py_True) {
447468
Py_CLEAR(res);
448-
iobase_unsupported("File or stream is not writable.");
469+
iobase_unsupported(state, "File or stream is not writable.");
449470
return NULL;
450471
}
451472
if (args == Py_True) {
@@ -487,7 +508,8 @@ static PyObject *
487508
_io__IOBase_fileno_impl(PyObject *self)
488509
/*[clinic end generated code: output=7cc0973f0f5f3b73 input=4e37028947dc1cc8]*/
489510
{
490-
return iobase_unsupported("fileno");
511+
_PyIO_State *state = IO_STATE();
512+
return iobase_unsupported(state, "fileno");
491513
}
492514

493515
/*[clinic input]
@@ -798,9 +820,9 @@ static PyMethodDef iobase_methods[] = {
798820
_IO__IOBASE_WRITABLE_METHODDEF
799821

800822
{"_checkClosed", _PyIOBase_check_closed, METH_NOARGS},
801-
{"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
802-
{"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
803-
{"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
823+
{"_checkSeekable", iobase_check_seekable, METH_NOARGS},
824+
{"_checkReadable", iobase_check_readable, METH_NOARGS},
825+
{"_checkWritable", iobase_check_writable, METH_NOARGS},
804826

805827
_IO__IOBASE_FILENO_METHODDEF
806828
_IO__IOBASE_ISATTY_METHODDEF

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.