[Python-checkins] CVS: python/dist/src/Objects dictobject.c,2.119,2.119.6.1 frameobject.c,2.59,2.59.6.1 listobject.c,2.103,2.103.6.1 tupleobject.c,2.62,2.62.6.1

Guido van Rossum gvanrossum@users.sourceforge.net
Thu, 28 Mar 2002 12:36:52 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv14857/Objects

Modified Files:
      Tag: release22-maint
	dictobject.c frameobject.c listobject.c tupleobject.c 
Log Message:
Backport to 2.2.1:

This is Neil's fix for SF bug 535905 (Evil Trashcan and GC interaction).

The fix makes it possible to call PyObject_GC_UnTrack() more than once
on the same object, and then move the PyObject_GC_UnTrack() call to
*before* the trashcan code is invoked.

BUGFIX CANDIDATE!


Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.119
retrieving revision 2.119.6.1
diff -C2 -d -r2.119 -r2.119.6.1
*** dictobject.c	11 Dec 2001 18:51:08 -0000	2.119
--- dictobject.c	28 Mar 2002 20:36:50 -0000	2.119.6.1
***************
*** 695,700 ****
  	register dictentry *ep;
  	int fill = mp->ma_fill;
  	Py_TRASHCAN_SAFE_BEGIN(mp)
-  	_PyObject_GC_UNTRACK(mp);
  	for (ep = mp->ma_table; fill > 0; ep++) {
  		if (ep->me_key) {
--- 695,700 ----
  	register dictentry *ep;
  	int fill = mp->ma_fill;
+  	PyObject_GC_UnTrack(mp);
  	Py_TRASHCAN_SAFE_BEGIN(mp)
  	for (ep = mp->ma_table; fill > 0; ep++) {
  		if (ep->me_key) {

Index: frameobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/frameobject.c,v
retrieving revision 2.59
retrieving revision 2.59.6.1
diff -C2 -d -r2.59 -r2.59.6.1
*** frameobject.c	6 Dec 2001 15:48:16 -0000	2.59
--- frameobject.c	28 Mar 2002 20:36:50 -0000	2.59.6.1
***************
*** 68,73 ****
  	PyObject **p;
  
  	Py_TRASHCAN_SAFE_BEGIN(f)
- 	_PyObject_GC_UNTRACK(f);
  	/* Kill all local variables */
  	slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
--- 68,73 ----
  	PyObject **p;
  
+  	PyObject_GC_UnTrack(f);
  	Py_TRASHCAN_SAFE_BEGIN(f)
  	/* Kill all local variables */
  	slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;

Index: listobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v
retrieving revision 2.103
retrieving revision 2.103.6.1
diff -C2 -d -r2.103 -r2.103.6.1
*** listobject.c	3 Dec 2001 16:32:18 -0000	2.103
--- listobject.c	28 Mar 2002 20:36:50 -0000	2.103.6.1
***************
*** 196,201 ****
  {
  	int i;
  	Py_TRASHCAN_SAFE_BEGIN(op)
- 	_PyObject_GC_UNTRACK(op);
  	if (op->ob_item != NULL) {
  		/* Do it backwards, for Christian Tismer.
--- 196,201 ----
  {
  	int i;
+ 	PyObject_GC_UnTrack(op);
  	Py_TRASHCAN_SAFE_BEGIN(op)
  	if (op->ob_item != NULL) {
  		/* Do it backwards, for Christian Tismer.

Index: tupleobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/tupleobject.c,v
retrieving revision 2.62
retrieving revision 2.62.6.1
diff -C2 -d -r2.62 -r2.62.6.1
*** tupleobject.c	7 Dec 2001 20:00:04 -0000	2.62
--- tupleobject.c	28 Mar 2002 20:36:50 -0000	2.62.6.1
***************
*** 140,145 ****
  	register int i;
  	register int len =  op->ob_size;
  	Py_TRASHCAN_SAFE_BEGIN(op)
- 	_PyObject_GC_UNTRACK(op);
  	if (len > 0) {
  		i = len;
--- 140,145 ----
  	register int i;
  	register int len =  op->ob_size;
+ 	PyObject_GC_UnTrack(op);
  	Py_TRASHCAN_SAFE_BEGIN(op)
  	if (len > 0) {
  		i = len;