gh-101819: Port _io.PyBytesIOBuffer_Type to heap type (#104264)

This commit is contained in:
Erlend E. Aasland 2023-05-07 16:01:27 +02:00 committed by GitHub
parent a05bad3254
commit 7a7eaff95c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 51 deletions

View file

@ -671,9 +671,6 @@ static PyTypeObject* static_types[] = {
&PyBufferedIOBase_Type, &PyBufferedIOBase_Type,
&PyRawIOBase_Type, &PyRawIOBase_Type,
&PyTextIOBase_Type, &PyTextIOBase_Type,
// PyRawIOBase_Type(PyIOBase_Type) subclasses
&_PyBytesIOBuffer_Type,
}; };
@ -753,6 +750,7 @@ PyInit__io(void)
// Base classes // Base classes
ADD_TYPE(m, state->PyIncrementalNewlineDecoder_Type, &nldecoder_spec, NULL); ADD_TYPE(m, state->PyIncrementalNewlineDecoder_Type, &nldecoder_spec, NULL);
ADD_TYPE(m, state->PyBytesIOBuffer_Type, &bytesiobuf_spec, NULL);
// PyIOBase_Type subclasses // PyIOBase_Type subclasses
state->PyRawIOBase_Type = (PyTypeObject *)Py_NewRef(&PyRawIOBase_Type); state->PyRawIOBase_Type = (PyTypeObject *)Py_NewRef(&PyRawIOBase_Type);
@ -771,7 +769,6 @@ PyInit__io(void)
state->PyBufferedIOBase_Type); state->PyBufferedIOBase_Type);
// PyRawIOBase_Type(PyIOBase_Type) subclasses // PyRawIOBase_Type(PyIOBase_Type) subclasses
state->PyBytesIOBuffer_Type = (PyTypeObject *)Py_NewRef(&_PyBytesIOBuffer_Type);
ADD_TYPE(m, state->PyFileIO_Type, &fileio_spec, state->PyRawIOBase_Type); ADD_TYPE(m, state->PyFileIO_Type, &fileio_spec, state->PyRawIOBase_Type);
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
ADD_TYPE(m, state->PyWindowsConsoleIO_Type, &winconsoleio_spec, ADD_TYPE(m, state->PyWindowsConsoleIO_Type, &winconsoleio_spec,

View file

@ -20,6 +20,7 @@ extern PyType_Spec bufferedreader_spec;
extern PyType_Spec bufferedrwpair_spec; extern PyType_Spec bufferedrwpair_spec;
extern PyType_Spec bufferedwriter_spec; extern PyType_Spec bufferedwriter_spec;
extern PyType_Spec bytesio_spec; extern PyType_Spec bytesio_spec;
extern PyType_Spec bytesiobuf_spec;
extern PyType_Spec fileio_spec; extern PyType_Spec fileio_spec;
extern PyType_Spec nldecoder_spec; extern PyType_Spec nldecoder_spec;
extern PyType_Spec stringio_spec; extern PyType_Spec stringio_spec;
@ -194,5 +195,3 @@ extern _PyIO_State *_PyIO_get_module_state(void);
#ifdef HAVE_WINDOWS_CONSOLE_IO #ifdef HAVE_WINDOWS_CONSOLE_IO
extern char _PyIO_get_console_type(PyObject *); extern char _PyIO_get_console_type(PyObject *);
#endif #endif
extern Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type;

View file

@ -1090,9 +1090,17 @@ bytesiobuf_releasebuffer(bytesiobuf *obj, Py_buffer *view)
b->exports--; b->exports--;
} }
static int
bytesiobuf_clear(bytesiobuf *self)
{
Py_CLEAR(self->source);
return 0;
}
static int static int
bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg) bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg)
{ {
Py_VISIT(Py_TYPE(self));
Py_VISIT(self->source); Py_VISIT(self->source);
return 0; return 0;
} }
@ -1100,54 +1108,29 @@ bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg)
static void static void
bytesiobuf_dealloc(bytesiobuf *self) bytesiobuf_dealloc(bytesiobuf *self)
{ {
PyTypeObject *tp = Py_TYPE(self);
/* bpo-31095: UnTrack is needed before calling any callbacks */ /* bpo-31095: UnTrack is needed before calling any callbacks */
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
Py_CLEAR(self->source); (void)bytesiobuf_clear(self);
Py_TYPE(self)->tp_free(self); tp->tp_free(self);
Py_DECREF(tp);
} }
static PyBufferProcs bytesiobuf_as_buffer = { static PyType_Slot bytesiobuf_slots[] = {
(getbufferproc) bytesiobuf_getbuffer, {Py_tp_dealloc, bytesiobuf_dealloc},
(releasebufferproc) bytesiobuf_releasebuffer, {Py_tp_traverse, bytesiobuf_traverse},
{Py_tp_clear, bytesiobuf_clear},
// Buffer protocol
{Py_bf_getbuffer, bytesiobuf_getbuffer},
{Py_bf_releasebuffer, bytesiobuf_releasebuffer},
{0, NULL},
}; };
Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type = { PyType_Spec bytesiobuf_spec = {
PyVarObject_HEAD_INIT(NULL, 0) .name = "_io._BytesIOBuffer",
"_io._BytesIOBuffer", /*tp_name*/ .basicsize = sizeof(bytesiobuf),
sizeof(bytesiobuf), /*tp_basicsize*/ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
0, /*tp_itemsize*/ Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION),
(destructor)bytesiobuf_dealloc, /*tp_dealloc*/ .slots = bytesiobuf_slots,
0, /*tp_vectorcall_offset*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_as_async*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
&bytesiobuf_as_buffer, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
0, /*tp_doc*/
(traverseproc)bytesiobuf_traverse, /*tp_traverse*/
0, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
0, /*tp_iter*/
0, /*tp_iternext*/
0, /*tp_methods*/
0, /*tp_members*/
0, /*tp_getset*/
0, /*tp_base*/
0, /*tp_dict*/
0, /*tp_descr_get*/
0, /*tp_descr_set*/
0, /*tp_dictoffset*/
0, /*tp_init*/
0, /*tp_alloc*/
0, /*tp_new*/
}; };

View file

@ -318,7 +318,6 @@ Python/instrumentation.c - _PyInstrumentation_MISSING -
## static types ## static types
Modules/_io/bufferedio.c - PyBufferedIOBase_Type - Modules/_io/bufferedio.c - PyBufferedIOBase_Type -
Modules/_io/bytesio.c - _PyBytesIOBuffer_Type -
Modules/_io/iobase.c - PyIOBase_Type - Modules/_io/iobase.c - PyIOBase_Type -
Modules/_io/iobase.c - PyRawIOBase_Type - Modules/_io/iobase.c - PyRawIOBase_Type -
Modules/_io/textio.c - PyTextIOBase_Type - Modules/_io/textio.c - PyTextIOBase_Type -

Can't render this file because it has a wrong number of fields in line 4.