[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)