[Python-checkins] python/dist/src/Modules cPickle.c,2.142,2.143

jhylton@users.sourceforge.net jhylton@users.sourceforge.net
Wed, 09 Apr 2003 14:05:17 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1:/tmp/cvs-serv10315

Modified Files:
	cPickle.c 
Log Message:
Make Picklers collectable.

Bug fix candidate.


Index: cPickle.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/cPickle.c,v
retrieving revision 2.142
retrieving revision 2.143
diff -C2 -d -r2.142 -r2.143
*** cPickle.c	20 Mar 2003 20:53:30 -0000	2.142
--- cPickle.c	9 Apr 2003 21:05:12 -0000	2.143
***************
*** 2725,2729 ****
  	}
  
! 	self = PyObject_New(Picklerobject, &Picklertype);
  	if (self == NULL)
  		return NULL;
--- 2725,2729 ----
  	}
  
! 	self = PyObject_GC_New(Picklerobject, &Picklertype);
  	if (self == NULL)
  		return NULL;
***************
*** 2808,2811 ****
--- 2808,2812 ----
  		Py_INCREF(dispatch_table);
  	}
+ 	PyObject_GC_Track(self);
  
  	return self;
***************
*** 2843,2846 ****
--- 2844,2848 ----
  Pickler_dealloc(Picklerobject *self)
  {
+ 	PyObject_GC_UnTrack(self);
  	Py_XDECREF(self->write);
  	Py_XDECREF(self->memo);
***************
*** 2852,2856 ****
  	Py_XDECREF(self->dispatch_table);
  	PyMem_Free(self->write_buf);
! 	PyObject_Del(self);
  }
  
--- 2854,2896 ----
  	Py_XDECREF(self->dispatch_table);
  	PyMem_Free(self->write_buf);
! 	PyObject_GC_Del(self);
! }
! 
! static int
! Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
! {
! 	int err;
! #define VISIT(SLOT) \
! 	if (SLOT) { \
! 		err = visit((PyObject *)(SLOT), arg); \
! 		if (err) \
! 			return err; \
! 	}
! 	VISIT(self->write);
! 	VISIT(self->memo);
! 	VISIT(self->fast_memo);
! 	VISIT(self->arg);
! 	VISIT(self->file);
! 	VISIT(self->pers_func);
! 	VISIT(self->inst_pers_func);
! 	VISIT(self->dispatch_table);
! #undef VISIT
! 	return 0;
! }
! 
! static int
! Pickler_clear(Picklerobject *self)
! {
! #define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL;
! 	CLEAR(self->write);
! 	CLEAR(self->memo);
! 	CLEAR(self->fast_memo);
! 	CLEAR(self->arg);
! 	CLEAR(self->file);
! 	CLEAR(self->pers_func);
! 	CLEAR(self->inst_pers_func);
! 	CLEAR(self->dispatch_table);
! #undef CLEAR
! 	return 0;
  }
  
***************
*** 2968,2975 ****
      PyObject_GenericSetAttr,		/* tp_setattro */
      0,					/* tp_as_buffer */
!     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
      Picklertype__doc__,			/* tp_doc */
!     0,					/* tp_traverse */
!     0,					/* tp_clear */
      0,					/* tp_richcompare */
      0,					/* tp_weaklistoffset */
--- 3008,3015 ----
      PyObject_GenericSetAttr,		/* tp_setattro */
      0,					/* tp_as_buffer */
!     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
      Picklertype__doc__,			/* tp_doc */
!     (traverseproc)Pickler_traverse,	/* tp_traverse */
!     (inquiry)Pickler_clear,		/* tp_clear */
      0,					/* tp_richcompare */
      0,					/* tp_weaklistoffset */