mirror of
https://github.com/python/cpython.git
synced 2025-11-01 10:45:30 +00:00
Issue #18112: PEP 442 implementation (safe object finalization).
This commit is contained in:
parent
c5d95b17ac
commit
796564c27b
25 changed files with 1254 additions and 321 deletions
|
|
@ -173,7 +173,8 @@ PyTypeObject PyTextIOBase_Type = {
|
|||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
|
||||
| Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
|
||||
textiobase_doc, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
|
|
@ -192,6 +193,16 @@ PyTypeObject PyTextIOBase_Type = {
|
|||
0, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0, /* tp_free */
|
||||
0, /* tp_is_gc */
|
||||
0, /* tp_bases */
|
||||
0, /* tp_mro */
|
||||
0, /* tp_cache */
|
||||
0, /* tp_subclasses */
|
||||
0, /* tp_weaklist */
|
||||
0, /* tp_del */
|
||||
0, /* tp_version_tag */
|
||||
0, /* tp_finalize */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -691,7 +702,7 @@ typedef struct
|
|||
char seekable;
|
||||
char has_read1;
|
||||
char telling;
|
||||
char deallocating;
|
||||
char finalizing;
|
||||
/* Specialized encoding func (see below) */
|
||||
encodefunc_t encodefunc;
|
||||
/* Whether or not it's the start of the stream */
|
||||
|
|
@ -1112,8 +1123,6 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
|
|||
static int
|
||||
_textiowrapper_clear(textio *self)
|
||||
{
|
||||
if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
|
||||
return -1;
|
||||
self->ok = 0;
|
||||
Py_CLEAR(self->buffer);
|
||||
Py_CLEAR(self->encoding);
|
||||
|
|
@ -1131,9 +1140,10 @@ _textiowrapper_clear(textio *self)
|
|||
static void
|
||||
textiowrapper_dealloc(textio *self)
|
||||
{
|
||||
self->deallocating = 1;
|
||||
if (_textiowrapper_clear(self) < 0)
|
||||
self->finalizing = 1;
|
||||
if (_PyIOBase_finalize((PyObject *) self) < 0)
|
||||
return;
|
||||
_textiowrapper_clear(self);
|
||||
_PyObject_GC_UNTRACK(self);
|
||||
if (self->weakreflist != NULL)
|
||||
PyObject_ClearWeakRefs((PyObject *)self);
|
||||
|
|
@ -2573,7 +2583,7 @@ textiowrapper_close(textio *self, PyObject *args)
|
|||
}
|
||||
else {
|
||||
PyObject *exc = NULL, *val, *tb;
|
||||
if (self->deallocating) {
|
||||
if (self->finalizing) {
|
||||
res = _PyObject_CallMethodId(self->buffer, &PyId__dealloc_warn, "O", self);
|
||||
if (res)
|
||||
Py_DECREF(res);
|
||||
|
|
@ -2734,6 +2744,7 @@ static PyMemberDef textiowrapper_members[] = {
|
|||
{"encoding", T_OBJECT, offsetof(textio, encoding), READONLY},
|
||||
{"buffer", T_OBJECT, offsetof(textio, buffer), READONLY},
|
||||
{"line_buffering", T_BOOL, offsetof(textio, line_buffering), READONLY},
|
||||
{"_finalizing", T_BOOL, offsetof(textio, finalizing), 0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
@ -2770,7 +2781,7 @@ PyTypeObject PyTextIOWrapper_Type = {
|
|||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
|
||||
| Py_TPFLAGS_HAVE_GC, /*tp_flags*/
|
||||
| Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
|
||||
textiowrapper_doc, /* tp_doc */
|
||||
(traverseproc)textiowrapper_traverse, /* tp_traverse */
|
||||
(inquiry)textiowrapper_clear, /* tp_clear */
|
||||
|
|
@ -2789,4 +2800,14 @@ PyTypeObject PyTextIOWrapper_Type = {
|
|||
(initproc)textiowrapper_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
PyType_GenericNew, /* tp_new */
|
||||
0, /* tp_free */
|
||||
0, /* tp_is_gc */
|
||||
0, /* tp_bases */
|
||||
0, /* tp_mro */
|
||||
0, /* tp_cache */
|
||||
0, /* tp_subclasses */
|
||||
0, /* tp_weaklist */
|
||||
0, /* tp_del */
|
||||
0, /* tp_version_tag */
|
||||
0, /* tp_finalize */
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue