[Python-checkins] python/dist/src/Objects typeobject.c,2.195,2.196

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
2002年12月07日 13:39:19 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1:/tmp/cvs-serv14618/python/Objects
Modified Files:
	typeobject.c 
Log Message:
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
tests. I found the logic too confusing to follow here, so rewrote more
than was likely absolutely necessary.
Bugfix candidate.
Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.195
retrieving revision 2.196
diff -C2 -d -r2.195 -r2.196
*** typeobject.c	6 Dec 2002 23:38:02 -0000	2.195
--- typeobject.c	7 Dec 2002 21:39:16 -0000	2.196
***************
*** 44,48 ****
 	if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
 		etype* et = (etype*)type;
! 		
 		Py_INCREF(et->name);
 		return et->name;
--- 44,48 ----
 	if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
 		etype* et = (etype*)type;
! 
 		Py_INCREF(et->name);
 		return et->name;
***************
*** 79,83 ****
 		return -1;
 	}
! 	if (strlen(PyString_AS_STRING(value)) 
 	 != (size_t)PyString_GET_SIZE(value)) {
 		PyErr_Format(PyExc_ValueError,
--- 79,83 ----
 		return -1;
 	}
! 	if (strlen(PyString_AS_STRING(value))
 	 != (size_t)PyString_GET_SIZE(value)) {
 		PyErr_Format(PyExc_ValueError,
***************
*** 311,318 ****
 	type->tp_base = old_base;
 	type->tp_mro = old_mro;
! 	
 	Py_DECREF(value);
 	Py_DECREF(new_base);
! 	
 	return -1;
 }
--- 311,318 ----
 	type->tp_base = old_base;
 	type->tp_mro = old_mro;
! 
 	Py_DECREF(value);
 	Py_DECREF(new_base);
! 
 	return -1;
 }
***************
*** 885,903 ****
 }
 
! /* 
 Method resolution order algorithm C3 described in
 "A Monotonic Superclass Linearization for Dylan",
 by Kim Barrett, Bob Cassel, Paul Haahr,
! David A. Moon, Keith Playford, and P. Tucker Withington. 
 (OOPSLA 1996)
 
 Some notes about the rules implied by C3:
 
! No duplicate bases. 
 It isn't legal to repeat a class in a list of base classes.
 
 The next three properties are the 3 constraints in "C3".
 
! Local precendece order. 
 If A precedes B in C's MRO, then A will precede B in the MRO of all
 subclasses of C.
--- 885,903 ----
 }
 
! /*
 Method resolution order algorithm C3 described in
 "A Monotonic Superclass Linearization for Dylan",
 by Kim Barrett, Bob Cassel, Paul Haahr,
! David A. Moon, Keith Playford, and P. Tucker Withington.
 (OOPSLA 1996)
 
 Some notes about the rules implied by C3:
 
! No duplicate bases.
 It isn't legal to repeat a class in a list of base classes.
 
 The next three properties are the 3 constraints in "C3".
 
! Local precendece order.
 If A precedes B in C's MRO, then A will precede B in the MRO of all
 subclasses of C.
***************
*** 913,917 ****
 */
 
! static int 
 tail_contains(PyObject *list, int whence, PyObject *o) {
 	int j, size;
--- 913,917 ----
 */
 
! static int
 tail_contains(PyObject *list, int whence, PyObject *o) {
 	int j, size;
***************
*** 1011,1020 ****
 }
 
! static int 
 pmerge(PyObject *acc, PyObject* to_merge) {
 	int i, j, to_merge_size;
 	int *remain;
 	int ok, empty_cnt;
! 	
 	to_merge_size = PyList_GET_SIZE(to_merge);
 
--- 1011,1020 ----
 }
 
! static int
 pmerge(PyObject *acc, PyObject* to_merge) {
 	int i, j, to_merge_size;
 	int *remain;
 	int ok, empty_cnt;
! 
 	to_merge_size = PyList_GET_SIZE(to_merge);
 
***************
*** 1033,1037 ****
 	for (i = 0; i < to_merge_size; i++) {
 		PyObject *candidate;
! 		
 		PyObject *cur_list = PyList_GET_ITEM(to_merge, i);
 
--- 1033,1037 ----
 	for (i = 0; i < to_merge_size; i++) {
 		PyObject *candidate;
! 
 		PyObject *cur_list = PyList_GET_ITEM(to_merge, i);
 
***************
*** 1093,1097 ****
 	/* Find a superclass linearization that honors the constraints
 	 of the explicit lists of bases and the constraints implied by
! 	 each base class. 
 
 	 to_merge is a list of lists, where each list is a superclass
--- 1093,1097 ----
 	/* Find a superclass linearization that honors the constraints
 	 of the explicit lists of bases and the constraints implied by
! 	 each base class.
 
 	 to_merge is a list of lists, where each list is a superclass
***************
*** 2289,2293 ****
 		return 0;
 	}
! 	
 	return 1;
 }
--- 2289,2293 ----
 		return 0;
 	}
! 
 	return 1;
 }
***************
*** 2356,2360 ****
 
 static PyMethodDef object_methods[] = {
! 	{"__reduce__", object_reduce, METH_NOARGS, 
 	 PyDoc_STR("helper for pickle")},
 	{0}
--- 2356,2360 ----
 
 static PyMethodDef object_methods[] = {
! 	{"__reduce__", object_reduce, METH_NOARGS,
 	 PyDoc_STR("helper for pickle")},
 	{0}
***************
*** 3735,3740 ****
 slot_nb_nonzero(PyObject *self)
 {
! 	PyObject *func, *res, *args;
 	static PyObject *nonzero_str, *len_str;
 
 	func = lookup_maybe(self, "__nonzero__", &nonzero_str);
--- 3735,3741 ----
 slot_nb_nonzero(PyObject *self)
 {
! 	PyObject *func, *args;
 	static PyObject *nonzero_str, *len_str;
+ 	int result = -1;
 
 	func = lookup_maybe(self, "__nonzero__", &nonzero_str);
***************
*** 3743,3762 ****
 			return -1;
 		func = lookup_maybe(self, "__len__", &len_str);
! 		if (func == NULL) {
! 			if (PyErr_Occurred())
! 				return -1;
! 			else
! 				return 1;
! 		}
! 	}
! 	args = res = PyTuple_New(0);
 	if (args != NULL) {
! 		res = PyObject_Call(func, args, NULL);
 		Py_DECREF(args);
 	}
 	Py_DECREF(func);
! 	if (res == NULL)
! 		return -1;
! 	return PyObject_IsTrue(res);
 }
 
--- 3744,3761 ----
 			return -1;
 		func = lookup_maybe(self, "__len__", &len_str);
! 		if (func == NULL)
! 			return PyErr_Occurred() ? -1 : 1;
! 	}
! 	args = PyTuple_New(0);
 	if (args != NULL) {
! 		PyObject *temp = PyObject_Call(func, args, NULL);
 		Py_DECREF(args);
+ 		if (temp != NULL) {
+ 			result = PyObject_IsTrue(temp);
+ 			Py_DECREF(temp);
+ 		}
 	}
 	Py_DECREF(func);
! 	return result;
 }
 

AltStyle によって変換されたページ (->オリジナル) /