Movatterモバイル変換


[0]ホーム

URL:


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

Sign up
Appearance settings

Commit235b827

Browse 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 parentfe694a6 commit235b827

File tree

3 files changed

+80
-42
lines changed

3 files changed

+80
-42
lines changed

‎Modules/_io/_iomodule.h

Lines 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-
externPyObject*_PyIOBase_check_readable(PyObject*self,PyObject*args);
38-
externPyObject*_PyIOBase_check_writable(PyObject*self,PyObject*args);
39-
externPyObject*_PyIOBase_check_seekable(PyObject*self,PyObject*args);
37+
typedefstruct_io_state_PyIO_State;// Forward decl.
38+
externPyObject*_PyIOBase_check_readable(_PyIO_State*state,
39+
PyObject*self,PyObject*args);
40+
externPyObject*_PyIOBase_check_writable(_PyIO_State*state,
41+
PyObject*self,PyObject*args);
42+
externPyObject*_PyIOBase_check_seekable(_PyIO_State*state,
43+
PyObject*self,PyObject*args);
4044
externPyObject*_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
externPyModuleDef_PyIO_Module;
142146

143-
typedefstruct {
147+
struct_io_state {
144148
intinitialized;
145149
PyObject*unsupported_operation;
146150

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

166170
#defineIO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod))
167171
#defineIO_STATE() _PyIO_get_module_state()

‎Modules/_io/bufferedio.c

Lines 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
staticPyObject*
109-
bufferediobase_unsupported(constchar*message)
109+
bufferediobase_unsupported(_PyIO_State*state,constchar*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
returnNULL;
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-
returnbufferediobase_unsupported("detach");
128+
_PyIO_State*state=IO_STATE();
129+
returnbufferediobase_unsupported(state,"detach");
131130
}
132131

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

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

170171
PyDoc_STRVAR(bufferediobase_write_doc,
@@ -179,7 +180,8 @@ PyDoc_STRVAR(bufferediobase_write_doc,
179180
staticPyObject*
180181
bufferediobase_write(PyObject*self,PyObject*args)
181182
{
182-
returnbufferediobase_unsupported("write");
183+
_PyIO_State*state=IO_STATE();
184+
returnbufferediobase_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
returnNULL;
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-
returnbufferediobase_unsupported("truncate");
1305+
_PyIO_State*state=IO_STATE();
1306+
returnbufferediobase_unsupported(state,"truncate");
13021307
}
13031308
if (!ENTER_BUFFERED(self))
13041309
returnNULL;
@@ -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_tbuffer_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

Lines 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
staticPyObject*
74-
iobase_unsupported(constchar*message)
74+
iobase_unsupported(_PyIO_State*state,constchar*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
returnNULL;
8078
}
8179

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

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

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

207+
staticPyObject*
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+
staticPyObject*
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+
staticPyObject*
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
returnNULL;
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
returnNULL;
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
returnNULL;
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
returnNULL;
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
returnNULL;
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
returnNULL;
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-
returniobase_unsupported("fileno");
511+
_PyIO_State*state=IO_STATE();
512+
returniobase_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)

[8]ページ先頭

©2009-2025 Movatter.jp