[Python-checkins] CVS: python/dist/src/Objects stringobject.c,2.78,2.79

Barry Warsaw python-dev@python.org
2000年7月10日 21:58:15 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory slayer.i.sourceforge.net:/tmp/cvs-serv31629
Modified Files:
	stringobject.c 
Log Message:
string_join(): Some cleaning up of reference counting. In the
seqlen==1 clause, before returning item, we need to DECREF seq. In
the res=PyString... failure clause, we need to goto finally to also
decref seq (and the DECREF of res in finally is changed to a
XDECREF). Also, we need to DECREF seq just before the
PyUnicode_Join() return.
Index: stringobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.78
retrieving revision 2.79
diff -C2 -r2.78 -r2.79
*** stringobject.c	2000年07月11日 03:28:17	2.78
--- stringobject.c	2000年07月11日 04:58:12	2.79
***************
*** 750,755 ****
 		return NULL;
 
! 	seq = PySequence_Fast(orig, "");
! 	if (seq == NULL) {
 		if (PyErr_ExceptionMatches(PyExc_TypeError))
 			PyErr_Format(PyExc_TypeError,
--- 750,754 ----
 		return NULL;
 
! 	if (!(seq = PySequence_Fast(orig, ""))) {
 		if (PyErr_ExceptionMatches(PyExc_TypeError))
 			PyErr_Format(PyExc_TypeError,
***************
*** 758,771 ****
 		return NULL;
 	}
! 
 	seqlen = PySequence_Length(seq);
 	if (seqlen == 1) {
 		item = PySequence_Fast_GET_ITEM(seq, 0);
 		Py_INCREF(item);
 		return item;
 	}
 
 	if (!(res = PyString_FromStringAndSize((char*)NULL, sz)))
! 		return NULL;
 	p = PyString_AsString(res);
 
--- 757,774 ----
 		return NULL;
 	}
! 	/* From here on out, errors go through finally: for proper
! 	 * reference count manipulations.
! 	 */
 	seqlen = PySequence_Length(seq);
 	if (seqlen == 1) {
 		item = PySequence_Fast_GET_ITEM(seq, 0);
 		Py_INCREF(item);
+ 		Py_DECREF(seq);
 		return item;
 	}
 
 	if (!(res = PyString_FromStringAndSize((char*)NULL, sz)))
! 		goto finally;
! 
 	p = PyString_AsString(res);
 
***************
*** 775,780 ****
 			if (PyUnicode_Check(item)) {
 				Py_DECREF(res);
! 				return PyUnicode_Join((PyObject *)self, 
! 						 seq);
 			}
 			PyErr_Format(PyExc_TypeError,
--- 778,783 ----
 			if (PyUnicode_Check(item)) {
 				Py_DECREF(res);
! 				Py_DECREF(seq);
! 				return PyUnicode_Join((PyObject *)self, seq);
 			}
 			PyErr_Format(PyExc_TypeError,
***************
*** 807,811 ****
 finally:
 	Py_DECREF(seq);
! 	Py_DECREF(res);
 	return NULL;
 }
--- 810,814 ----
 finally:
 	Py_DECREF(seq);
! 	Py_XDECREF(res);
 	return NULL;
 }

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