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

jhylton@users.sourceforge.net jhylton@users.sourceforge.net
Wed, 09 Apr 2003 14:25:34 -0700


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

Modified Files:
	cPickle.c 
Log Message:
Make Unpickler objects colletable.

Bugfix candidate.


Index: cPickle.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/cPickle.c,v
retrieving revision 2.143
retrieving revision 2.144
diff -C2 -d -r2.143 -r2.144
*** cPickle.c	9 Apr 2003 21:05:12 -0000	2.143
--- cPickle.c	9 Apr 2003 21:25:30 -0000	2.144
***************
*** 5118,5122 ****
  	Unpicklerobject *self;
  
! 	if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
  		return NULL;
  
--- 5118,5122 ----
  	Unpicklerobject *self;
  
! 	if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
  		return NULL;
  
***************
*** 5171,5174 ****
--- 5171,5175 ----
  		}
  	}
+ 	PyObject_GC_Track(self);
  
  	return self;
***************
*** 5194,5197 ****
--- 5195,5199 ----
  Unpickler_dealloc(Unpicklerobject *self)
  {
+ 	PyObject_GC_UnTrack((PyObject *)self);
  	Py_XDECREF(self->readline);
  	Py_XDECREF(self->read);
***************
*** 5211,5217 ****
  	}
  
! 	PyObject_Del(self);
  }
  
  
  static PyObject *
--- 5213,5257 ----
  	}
  
! 	PyObject_GC_Del(self);
! }
! 
! static int
! Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
! {
! 	int err;
! 
! #define VISIT(SLOT) \
! 	if (SLOT) { \
! 		err = visit((PyObject *)(SLOT), arg); \
! 		if (err) \
! 			return err; \
! 	}
! 	VISIT(self->readline);
! 	VISIT(self->read);
! 	VISIT(self->file);
! 	VISIT(self->memo);
! 	VISIT(self->stack);
! 	VISIT(self->pers_func);
! 	VISIT(self->arg);
! 	VISIT(self->last_string);
! #undef VISIT
! 	return 0;
  }
  
+ static int
+ Unpickler_clear(Unpicklerobject *self)
+ {
+ #define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL
+ 	CLEAR(self->readline);
+ 	CLEAR(self->read);
+ 	CLEAR(self->file);
+ 	CLEAR(self->memo);
+ 	CLEAR(self->stack);
+ 	CLEAR(self->pers_func);
+ 	CLEAR(self->arg);
+ 	CLEAR(self->last_string);
+ #undef CLEAR
+ 	return 0;
+ }
  
  static PyObject *
***************
*** 5411,5435 ****
  static PyTypeObject Unpicklertype = {
      PyObject_HEAD_INIT(NULL)
!     0,                            /*ob_size*/
!     "cPickle.Unpickler",                  /*tp_name*/
!     sizeof(Unpicklerobject),              /*tp_basicsize*/
!     0,                            /*tp_itemsize*/
!     /* methods */
!     (destructor)Unpickler_dealloc,        /*tp_dealloc*/
!     (printfunc)0,         /*tp_print*/
!     (getattrfunc)Unpickler_getattr,       /*tp_getattr*/
!     (setattrfunc)Unpickler_setattr,       /*tp_setattr*/
!     (cmpfunc)0,           /*tp_compare*/
!     (reprfunc)0,          /*tp_repr*/
!     0,                    /*tp_as_number*/
!     0,            /*tp_as_sequence*/
!     0,            /*tp_as_mapping*/
!     (hashfunc)0,          /*tp_hash*/
!     (ternaryfunc)0,               /*tp_call*/
!     (reprfunc)0,          /*tp_str*/
! 
!     /* Space for future expansion */
!     0L,0L,0L,0L,
!     Unpicklertype__doc__ /* Documentation string */
  };
  
--- 5451,5477 ----
  static PyTypeObject Unpicklertype = {
      PyObject_HEAD_INIT(NULL)
!     0,                          	 /*ob_size*/
!     "cPickle.Unpickler", 	         /*tp_name*/
!     sizeof(Unpicklerobject),             /*tp_basicsize*/
!     0,
!     (destructor)Unpickler_dealloc,	/* tp_dealloc */
!     0,					/* tp_print */
!     (getattrfunc)Unpickler_getattr,	/* tp_getattr */
!     (setattrfunc)Unpickler_setattr,	/* tp_setattr */
!     0,					/* tp_compare */
!     0,		 			/* tp_repr */
!     0,					/* tp_as_number */
!     0,					/* tp_as_sequence */
!     0,					/* tp_as_mapping */
!     0,					/* tp_hash */
!     0,					/* tp_call */
!     0,					/* tp_str */
!     0,					/* tp_getattro */
!     0,					/* tp_setattro */
!     0,					/* tp_as_buffer */
!     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
!     Unpicklertype__doc__,		/* tp_doc */
!     (traverseproc)Unpickler_traverse,	/* tp_traverse */
!     (inquiry)Unpickler_clear,		/* tp_clear */
  };