Skip to content

Commit 97f382f

Browse files
Buffered* types
1 parent 8d96a7a commit 97f382f

File tree

7 files changed

+153
-245
lines changed

7 files changed

+153
-245
lines changed

Modules/_io/_iomodule.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -386,16 +386,20 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode,
386386
return result;
387387
}
388388

389+
_PyIO_State *state = IO_STATE();
389390
/* wraps into a buffered file */
390391
{
391392
PyObject *Buffered_class;
392393

393-
if (updating)
394-
Buffered_class = (PyObject *)&PyBufferedRandom_Type;
395-
else if (creating || writing || appending)
396-
Buffered_class = (PyObject *)&PyBufferedWriter_Type;
397-
else if (reading)
398-
Buffered_class = (PyObject *)&PyBufferedReader_Type;
394+
if (updating) {
395+
Buffered_class = (PyObject *)state->PyBufferedRandom_Type;
396+
}
397+
else if (creating || writing || appending) {
398+
Buffered_class = (PyObject *)state->PyBufferedWriter_Type;
399+
}
400+
else if (reading) {
401+
Buffered_class = (PyObject *)state->PyBufferedReader_Type;
402+
}
399403
else {
400404
PyErr_Format(PyExc_ValueError,
401405
"unknown mode: '%s'", mode);
@@ -417,7 +421,6 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode,
417421
}
418422

419423
/* wraps into a TextIOWrapper */
420-
_PyIO_State *state = IO_STATE();
421424
wrapper = PyObject_CallFunction((PyObject *)state->PyTextIOWrapper_Type,
422425
"OsssO",
423426
buffer,
@@ -641,10 +644,6 @@ static PyTypeObject* static_types[] = {
641644

642645
// PyBufferedIOBase_Type(PyIOBase_Type) subclasses
643646
&PyBytesIO_Type,
644-
&PyBufferedReader_Type,
645-
&PyBufferedWriter_Type,
646-
&PyBufferedRWPair_Type,
647-
&PyBufferedRandom_Type,
648647

649648
// PyRawIOBase_Type(PyIOBase_Type) subclasses
650649
&_PyBytesIOBuffer_Type,
@@ -710,10 +709,6 @@ PyInit__io(void)
710709
#ifdef MS_WINDOWS
711710
PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type;
712711
#endif
713-
PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
714-
PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
715-
PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
716-
PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
717712

718713
// Add types
719714
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
@@ -723,6 +718,16 @@ PyInit__io(void)
723718
}
724719
}
725720

721+
// PyBufferedIOBase_Type(PyIOBase_Type) subclasses
722+
ADD_TYPE(m, state->PyBufferedWriter_Type, &bufferedwriter_spec,
723+
&PyBufferedIOBase_Type);
724+
ADD_TYPE(m, state->PyBufferedReader_Type, &bufferedreader_spec,
725+
&PyBufferedIOBase_Type);
726+
ADD_TYPE(m, state->PyBufferedRWPair_Type, &bufferedrwpair_spec,
727+
&PyBufferedIOBase_Type);
728+
ADD_TYPE(m, state->PyBufferedRandom_Type, &bufferedrandom_spec,
729+
&PyBufferedIOBase_Type);
730+
726731
// PyRawIOBase_Type(PyIOBase_Type) subclasses
727732
ADD_TYPE(m, state->PyFileIO_Type, &fileio_spec, &PyRawIOBase_Type);
728733

Modules/_io/_iomodule.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ extern PyTypeObject PyTextIOBase_Type;
1515

1616
/* Concrete classes */
1717
extern PyTypeObject PyBytesIO_Type;
18-
extern PyTypeObject PyBufferedReader_Type;
19-
extern PyTypeObject PyBufferedWriter_Type;
20-
extern PyTypeObject PyBufferedRWPair_Type;
21-
extern PyTypeObject PyBufferedRandom_Type;
2218
extern PyTypeObject PyIncrementalNewlineDecoder_Type;
2319

2420
/* Type specs */
21+
extern PyType_Spec bufferedrandom_spec;
22+
extern PyType_Spec bufferedreader_spec;
23+
extern PyType_Spec bufferedrwpair_spec;
24+
extern PyType_Spec bufferedwriter_spec;
2525
extern PyType_Spec fileio_spec;
2626
extern PyType_Spec stringio_spec;
2727
extern PyType_Spec textiowrapper_spec;
@@ -147,6 +147,10 @@ typedef struct {
147147
PyObject *unsupported_operation;
148148

149149
/* Types */
150+
PyTypeObject *PyBufferedRWPair_Type;
151+
PyTypeObject *PyBufferedRandom_Type;
152+
PyTypeObject *PyBufferedReader_Type;
153+
PyTypeObject *PyBufferedWriter_Type;
150154
PyTypeObject *PyFileIO_Type;
151155
PyTypeObject *PyStringIO_Type;
152156
PyTypeObject *PyTextIOWrapper_Type;

0 commit comments

Comments
 (0)