Skip to content

Commit 7a7eaff

Browse files
gh-101819: Port _io.PyBytesIOBuffer_Type to heap type (#104264)
1 parent a05bad3 commit 7a7eaff

File tree

4 files changed

+29
-51
lines changed

4 files changed

+29
-51
lines changed

Modules/_io/_iomodule.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -671,9 +671,6 @@ static PyTypeObject* static_types[] = {
671671
&PyBufferedIOBase_Type,
672672
&PyRawIOBase_Type,
673673
&PyTextIOBase_Type,
674-
675-
// PyRawIOBase_Type(PyIOBase_Type) subclasses
676-
&_PyBytesIOBuffer_Type,
677674
};
678675

679676

@@ -753,6 +750,7 @@ PyInit__io(void)
753750

754751
// Base classes
755752
ADD_TYPE(m, state->PyIncrementalNewlineDecoder_Type, &nldecoder_spec, NULL);
753+
ADD_TYPE(m, state->PyBytesIOBuffer_Type, &bytesiobuf_spec, NULL);
756754

757755
// PyIOBase_Type subclasses
758756
state->PyRawIOBase_Type = (PyTypeObject *)Py_NewRef(&PyRawIOBase_Type);
@@ -771,7 +769,6 @@ PyInit__io(void)
771769
state->PyBufferedIOBase_Type);
772770

773771
// PyRawIOBase_Type(PyIOBase_Type) subclasses
774-
state->PyBytesIOBuffer_Type = (PyTypeObject *)Py_NewRef(&_PyBytesIOBuffer_Type);
775772
ADD_TYPE(m, state->PyFileIO_Type, &fileio_spec, state->PyRawIOBase_Type);
776773
#ifdef MS_WINDOWS
777774
ADD_TYPE(m, state->PyWindowsConsoleIO_Type, &winconsoleio_spec,

Modules/_io/_iomodule.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ extern PyType_Spec bufferedreader_spec;
2020
extern PyType_Spec bufferedrwpair_spec;
2121
extern PyType_Spec bufferedwriter_spec;
2222
extern PyType_Spec bytesio_spec;
23+
extern PyType_Spec bytesiobuf_spec;
2324
extern PyType_Spec fileio_spec;
2425
extern PyType_Spec nldecoder_spec;
2526
extern PyType_Spec stringio_spec;
@@ -194,5 +195,3 @@ extern _PyIO_State *_PyIO_get_module_state(void);
194195
#ifdef HAVE_WINDOWS_CONSOLE_IO
195196
extern char _PyIO_get_console_type(PyObject *);
196197
#endif
197-
198-
extern Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type;

Modules/_io/bytesio.c

+27-44
Original file line numberDiff line numberDiff line change
@@ -1090,64 +1090,47 @@ bytesiobuf_releasebuffer(bytesiobuf *obj, Py_buffer *view)
10901090
b->exports--;
10911091
}
10921092

1093+
static int
1094+
bytesiobuf_clear(bytesiobuf *self)
1095+
{
1096+
Py_CLEAR(self->source);
1097+
return 0;
1098+
}
1099+
10931100
static int
10941101
bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg)
10951102
{
1103+
Py_VISIT(Py_TYPE(self));
10961104
Py_VISIT(self->source);
10971105
return 0;
10981106
}
10991107

11001108
static void
11011109
bytesiobuf_dealloc(bytesiobuf *self)
11021110
{
1111+
PyTypeObject *tp = Py_TYPE(self);
11031112
/* bpo-31095: UnTrack is needed before calling any callbacks */
11041113
PyObject_GC_UnTrack(self);
1105-
Py_CLEAR(self->source);
1106-
Py_TYPE(self)->tp_free(self);
1114+
(void)bytesiobuf_clear(self);
1115+
tp->tp_free(self);
1116+
Py_DECREF(tp);
11071117
}
11081118

1109-
static PyBufferProcs bytesiobuf_as_buffer = {
1110-
(getbufferproc) bytesiobuf_getbuffer,
1111-
(releasebufferproc) bytesiobuf_releasebuffer,
1119+
static PyType_Slot bytesiobuf_slots[] = {
1120+
{Py_tp_dealloc, bytesiobuf_dealloc},
1121+
{Py_tp_traverse, bytesiobuf_traverse},
1122+
{Py_tp_clear, bytesiobuf_clear},
1123+
1124+
// Buffer protocol
1125+
{Py_bf_getbuffer, bytesiobuf_getbuffer},
1126+
{Py_bf_releasebuffer, bytesiobuf_releasebuffer},
1127+
{0, NULL},
11121128
};
11131129

1114-
Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type = {
1115-
PyVarObject_HEAD_INIT(NULL, 0)
1116-
"_io._BytesIOBuffer", /*tp_name*/
1117-
sizeof(bytesiobuf), /*tp_basicsize*/
1118-
0, /*tp_itemsize*/
1119-
(destructor)bytesiobuf_dealloc, /*tp_dealloc*/
1120-
0, /*tp_vectorcall_offset*/
1121-
0, /*tp_getattr*/
1122-
0, /*tp_setattr*/
1123-
0, /*tp_as_async*/
1124-
0, /*tp_repr*/
1125-
0, /*tp_as_number*/
1126-
0, /*tp_as_sequence*/
1127-
0, /*tp_as_mapping*/
1128-
0, /*tp_hash*/
1129-
0, /*tp_call*/
1130-
0, /*tp_str*/
1131-
0, /*tp_getattro*/
1132-
0, /*tp_setattro*/
1133-
&bytesiobuf_as_buffer, /*tp_as_buffer*/
1134-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
1135-
0, /*tp_doc*/
1136-
(traverseproc)bytesiobuf_traverse, /*tp_traverse*/
1137-
0, /*tp_clear*/
1138-
0, /*tp_richcompare*/
1139-
0, /*tp_weaklistoffset*/
1140-
0, /*tp_iter*/
1141-
0, /*tp_iternext*/
1142-
0, /*tp_methods*/
1143-
0, /*tp_members*/
1144-
0, /*tp_getset*/
1145-
0, /*tp_base*/
1146-
0, /*tp_dict*/
1147-
0, /*tp_descr_get*/
1148-
0, /*tp_descr_set*/
1149-
0, /*tp_dictoffset*/
1150-
0, /*tp_init*/
1151-
0, /*tp_alloc*/
1152-
0, /*tp_new*/
1130+
PyType_Spec bytesiobuf_spec = {
1131+
.name = "_io._BytesIOBuffer",
1132+
.basicsize = sizeof(bytesiobuf),
1133+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1134+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION),
1135+
.slots = bytesiobuf_slots,
11531136
};

Tools/c-analyzer/cpython/globals-to-fix.tsv

-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ Python/instrumentation.c - _PyInstrumentation_MISSING -
318318
## static types
319319

320320
Modules/_io/bufferedio.c - PyBufferedIOBase_Type -
321-
Modules/_io/bytesio.c - _PyBytesIOBuffer_Type -
322321
Modules/_io/iobase.c - PyIOBase_Type -
323322
Modules/_io/iobase.c - PyRawIOBase_Type -
324323
Modules/_io/textio.c - PyTextIOBase_Type -

0 commit comments

Comments
 (0)