[Python-checkins] r68352 - in sandbox/trunk/io-c: _iobase.c _iomodule.h io.c

antoine.pitrou python-checkins at python.org
Tue Jan 6 00:45:23 CET 2009


Author: antoine.pitrou
Date: Tue Jan 6 00:45:23 2009
New Revision: 68352
Log:
fix destructor on raw file IO
This might not be the best way to do it but somehow I fail to make it so
that tp_del gets called, including in subclasses.
Modified:
 sandbox/trunk/io-c/_iobase.c
 sandbox/trunk/io-c/_iomodule.h
 sandbox/trunk/io-c/io.c
Modified: sandbox/trunk/io-c/_iobase.c
==============================================================================
--- sandbox/trunk/io-c/_iobase.c	(original)
+++ sandbox/trunk/io-c/_iobase.c	Tue Jan 6 00:45:23 2009
@@ -149,18 +149,24 @@
 Py_RETURN_NONE;
 }
 
-static void
-IOBase_del(PyObject *self)
+static PyObject *
+IOBase_del(PyObject *self, PyObject *args)
 {
- PyObject *res = PyObject_CallMethod(self, "flush", NULL);
+ PyObject *res = NULL;
+ res = PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
 if (res == NULL) {
 /* At program exit time, it's possible that globals have already been
 * deleted, and then the close() call might fail. Since there's
 * nothing we can do about such failures and they annoy the end
 * users, we suppress the traceback.
+ *
+ * XXX: this function can be called at other times and what if the
+ * error is genuine?
 */
 PyErr_Clear();
 }
+ Py_XDECREF(res);
+ Py_RETURN_NONE;
 }
 
 /* Inquiry methods */
@@ -522,6 +528,7 @@
 {"fileno", IOBase_fileno, METH_NOARGS, IOBase_fileno_doc},
 {"isatty", IOBase_isatty, METH_NOARGS, IOBase_isatty_doc},
 
+ {"__del__", IOBase_del, METH_NOARGS},
 {"__enter__", IOBase_enter, METH_NOARGS},
 {"__exit__", IOBase_exit, METH_VARARGS},
 
@@ -584,7 +591,7 @@
 0, /* tp_cache */
 0, /* tp_subclasses */
 0, /* tp_weaklist */
- IOBase_del, /* tp_del */
+ 0, /* tp_del */
 };
 
 
Modified: sandbox/trunk/io-c/_iomodule.h
==============================================================================
--- sandbox/trunk/io-c/_iomodule.h	(original)
+++ sandbox/trunk/io-c/_iomodule.h	Tue Jan 6 00:45:23 2009
@@ -50,6 +50,7 @@
 
 /* Implementation details */
 
+extern PyObject *_PyIO_str_close;
 extern PyObject *_PyIO_str_closed;
 extern PyObject *_PyIO_str_fileno;
 extern PyObject *_PyIO_str_flush;
Modified: sandbox/trunk/io-c/io.c
==============================================================================
--- sandbox/trunk/io-c/io.c	(original)
+++ sandbox/trunk/io-c/io.c	Tue Jan 6 00:45:23 2009
@@ -14,6 +14,7 @@
 
 /* Various interned strings */
 
+PyObject *_PyIO_str_close;
 PyObject *_PyIO_str_closed;
 PyObject *_PyIO_str_fileno;
 PyObject *_PyIO_str_flush;
@@ -622,6 +623,8 @@
 PyModule_AddObject(m, "IncrementalNewlineDecoder", (PyObject *) &PyIncrementalNewlineDecoder_Type);
 
 /* Interned strings */
+ if (!(_PyIO_str_close = PyUnicode_InternFromString("close")))
+ goto fail;
 if (!(_PyIO_str_closed = PyUnicode_InternFromString("closed")))
 goto fail;
 if (!(_PyIO_str_fileno = PyUnicode_InternFromString("fileno")))


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /