mirror of
https://github.com/python/cpython.git
synced 2025-11-01 02:38:53 +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
|
|
@ -190,7 +190,8 @@ PyTypeObject PyBufferedIOBase_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*/
|
||||
bufferediobase_doc, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
|
|
@ -209,6 +210,16 @@ PyTypeObject PyBufferedIOBase_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 */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -220,7 +231,7 @@ typedef struct {
|
|||
int detached;
|
||||
int readable;
|
||||
int writable;
|
||||
int deallocating;
|
||||
char finalizing;
|
||||
|
||||
/* True if this is a vanilla Buffered object (rather than a user derived
|
||||
class) *and* the raw stream is a vanilla FileIO object. */
|
||||
|
|
@ -384,8 +395,8 @@ _enter_buffered_busy(buffered *self)
|
|||
static void
|
||||
buffered_dealloc(buffered *self)
|
||||
{
|
||||
self->deallocating = 1;
|
||||
if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
|
||||
self->finalizing = 1;
|
||||
if (_PyIOBase_finalize((PyObject *) self) < 0)
|
||||
return;
|
||||
_PyObject_GC_UNTRACK(self);
|
||||
self->ok = 0;
|
||||
|
|
@ -428,8 +439,6 @@ buffered_traverse(buffered *self, visitproc visit, void *arg)
|
|||
static int
|
||||
buffered_clear(buffered *self)
|
||||
{
|
||||
if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
|
||||
return -1;
|
||||
self->ok = 0;
|
||||
Py_CLEAR(self->raw);
|
||||
Py_CLEAR(self->dict);
|
||||
|
|
@ -508,7 +517,7 @@ buffered_close(buffered *self, PyObject *args)
|
|||
goto end;
|
||||
}
|
||||
|
||||
if (self->deallocating) {
|
||||
if (self->finalizing) {
|
||||
PyObject *r = buffered_dealloc_warn(self, (PyObject *) self);
|
||||
if (r)
|
||||
Py_DECREF(r);
|
||||
|
|
@ -1749,6 +1758,7 @@ static PyMethodDef bufferedreader_methods[] = {
|
|||
|
||||
static PyMemberDef bufferedreader_members[] = {
|
||||
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
|
||||
{"_finalizing", T_BOOL, offsetof(buffered, finalizing), 0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
@ -1781,7 +1791,7 @@ PyTypeObject PyBufferedReader_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*/
|
||||
bufferedreader_doc, /* tp_doc */
|
||||
(traverseproc)buffered_traverse, /* tp_traverse */
|
||||
(inquiry)buffered_clear, /* tp_clear */
|
||||
|
|
@ -1800,6 +1810,16 @@ PyTypeObject PyBufferedReader_Type = {
|
|||
(initproc)bufferedreader_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 */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -2130,6 +2150,7 @@ static PyMethodDef bufferedwriter_methods[] = {
|
|||
|
||||
static PyMemberDef bufferedwriter_members[] = {
|
||||
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
|
||||
{"_finalizing", T_BOOL, offsetof(buffered, finalizing), 0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
@ -2162,7 +2183,7 @@ PyTypeObject PyBufferedWriter_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*/
|
||||
bufferedwriter_doc, /* tp_doc */
|
||||
(traverseproc)buffered_traverse, /* tp_traverse */
|
||||
(inquiry)buffered_clear, /* tp_clear */
|
||||
|
|
@ -2181,6 +2202,16 @@ PyTypeObject PyBufferedWriter_Type = {
|
|||
(initproc)bufferedwriter_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 */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -2416,7 +2447,7 @@ PyTypeObject PyBufferedRWPair_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 */
|
||||
bufferedrwpair_doc, /* tp_doc */
|
||||
(traverseproc)bufferedrwpair_traverse, /* tp_traverse */
|
||||
(inquiry)bufferedrwpair_clear, /* tp_clear */
|
||||
|
|
@ -2435,6 +2466,16 @@ PyTypeObject PyBufferedRWPair_Type = {
|
|||
(initproc)bufferedrwpair_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 */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -2522,6 +2563,7 @@ static PyMethodDef bufferedrandom_methods[] = {
|
|||
|
||||
static PyMemberDef bufferedrandom_members[] = {
|
||||
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
|
||||
{"_finalizing", T_BOOL, offsetof(buffered, finalizing), 0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
@ -2554,7 +2596,7 @@ PyTypeObject PyBufferedRandom_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*/
|
||||
bufferedrandom_doc, /* tp_doc */
|
||||
(traverseproc)buffered_traverse, /* tp_traverse */
|
||||
(inquiry)buffered_clear, /* tp_clear */
|
||||
|
|
@ -2573,4 +2615,14 @@ PyTypeObject PyBufferedRandom_Type = {
|
|||
(initproc)bufferedrandom_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