[Python-checkins] python/dist/src/Modules _csv.c,1.10,1.11
jhylton@users.sourceforge.net
jhylton@users.sourceforge.net
Sun, 13 Apr 2003 19:20:58 -0700
Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1:/tmp/cvs-serv5179/Modules
Modified Files:
_csv.c
Log Message:
Make readers and writers participate in garbage collection.
Fix memory leak in dialect_init().
Index: _csv.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_csv.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** _csv.c 13 Apr 2003 03:25:15 -0000 1.10
--- _csv.c 14 Apr 2003 02:20:55 -0000 1.11
***************
*** 324,330 ****
if (PyString_Check(dialect)
#ifdef Py_USING_UNICODE
! || PyUnicode_Check(dialect)
#endif
! ) {
PyObject * new_dia;
new_dia = get_dialect_from_registry(dialect);
--- 324,330 ----
if (PyString_Check(dialect)
#ifdef Py_USING_UNICODE
! || PyUnicode_Check(dialect)
#endif
! ) {
PyObject * new_dia;
new_dia = get_dialect_from_registry(dialect);
***************
*** 334,338 ****
dialect = new_dia;
}
! /* A class rather than an instance? Instanciate */
if (PyObject_TypeCheck(dialect, &PyClass_Type)) {
PyObject * new_dia;
--- 334,338 ----
dialect = new_dia;
}
! /* A class rather than an instance? Instantiate */
if (PyObject_TypeCheck(dialect, &PyClass_Type)) {
PyObject * new_dia;
***************
*** 364,368 ****
--- 364,370 ----
if (PyObject_SetAttr((PyObject *)self,
name_obj, value_obj)) {
+ Py_DECREF(value_obj);
Py_DECREF(dir_list);
+ Py_DECREF(dialect);
return -1;
}
***************
*** 443,447 ****
PyType_GenericAlloc, /* tp_alloc */
dialect_new, /* tp_new */
! 0, /* tp_free */
};
--- 445,449 ----
PyType_GenericAlloc, /* tp_alloc */
dialect_new, /* tp_new */
! 0, /* tp_free */
};
***************
*** 738,742 ****
Py_XDECREF(self->input_iter);
Py_XDECREF(self->fields);
! PyMem_DEL(self);
}
--- 740,772 ----
Py_XDECREF(self->input_iter);
Py_XDECREF(self->fields);
! PyObject_GC_Del(self);
! }
!
! static int
! Reader_traverse(ReaderObj *self, visitproc visit, void *arg)
! {
! int err;
! #define VISIT(SLOT) \
! if (SLOT) { \
! err = visit((PyObject *)(SLOT), arg); \
! if (err) \
! return err; \
! }
! VISIT(self->dialect);
! VISIT(self->input_iter);
! VISIT(self->fields);
! return 0;
! }
!
! static int
! Reader_clear(ReaderObj *self)
! {
! Py_XDECREF(self->dialect);
! Py_XDECREF(self->input_iter);
! Py_XDECREF(self->fields);
! self->dialect = NULL;
! self->input_iter = NULL;
! self->fields = NULL;
! return 0;
}
***************
*** 774,781 ****
0, /*tp_setattro*/
0, /*tp_as_buffer*/
! Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
Reader_Type_doc, /*tp_doc*/
! 0, /*tp_traverse*/
! 0, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
--- 804,812 ----
0, /*tp_setattro*/
0, /*tp_as_buffer*/
! Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
! Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Reader_Type_doc, /*tp_doc*/
! (traverseproc)Reader_traverse, /*tp_traverse*/
! (inquiry)Reader_clear, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
***************
*** 792,796 ****
{
PyObject * iterator, * dialect = NULL, *ctor_args;
! ReaderObj * self = PyObject_NEW(ReaderObj, &Reader_Type);
if (!self)
--- 823,827 ----
{
PyObject * iterator, * dialect = NULL, *ctor_args;
! ReaderObj * self = PyObject_GC_New(ReaderObj, &Reader_Type);
if (!self)
***************
*** 1161,1165 ****
Py_XDECREF(self->dialect);
Py_XDECREF(self->writeline);
! PyMem_DEL(self);
}
--- 1192,1221 ----
Py_XDECREF(self->dialect);
Py_XDECREF(self->writeline);
! PyObject_GC_Del(self);
! }
!
! static int
! Writer_traverse(WriterObj *self, visitproc visit, void *arg)
! {
! int err;
! #define VISIT(SLOT) \
! if (SLOT) { \
! err = visit((PyObject *)(SLOT), arg); \
! if (err) \
! return err; \
! }
! VISIT(self->dialect);
! VISIT(self->writeline);
! return 0;
! }
!
! static int
! Writer_clear(WriterObj *self)
! {
! Py_XDECREF(self->dialect);
! Py_XDECREF(self->writeline);
! self->dialect = NULL;
! self->writeline = NULL;
! return 0;
}
***************
*** 1193,1200 ****
0, /*tp_setattro*/
0, /*tp_as_buffer*/
! Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
Writer_Type_doc,
! 0, /*tp_traverse*/
! 0, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
--- 1249,1257 ----
0, /*tp_setattro*/
0, /*tp_as_buffer*/
! Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
! Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Writer_Type_doc,
! (traverseproc)Writer_traverse, /*tp_traverse*/
! (inquiry)Writer_clear, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
***************
*** 1210,1214 ****
{
PyObject * output_file, * dialect = NULL, *ctor_args;
! WriterObj * self = PyObject_NEW(WriterObj, &Writer_Type);
if (!self)
--- 1267,1271 ----
{
PyObject * output_file, * dialect = NULL, *ctor_args;
! WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type);
if (!self)