diff Objects/stringobject.c @ 13528:e848d6ed3eb9 legacy-trunk

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.
author Barry Warsaw <barry@python.org>
date Tue, 11 Jul 2000 04:58:12 +0000
parents 3686d12362b8
children 3cf4f5aee00e
line wrap: on
line diff
--- a/Objects/stringobject.c	Tue Jul 11 03:31:55 2000 +0000
+++ b/Objects/stringobject.c	Tue Jul 11 04:58:12 2000 +0000
@@ -749,24 +749,27 @@
 	if (!PyArg_ParseTuple(args, "O:join", &orig))
 		return NULL;
 
-	seq = PySequence_Fast(orig, "");
-	if (seq == NULL) {
+	if (!(seq = PySequence_Fast(orig, ""))) {
 		if (PyErr_ExceptionMatches(PyExc_TypeError))
 			PyErr_Format(PyExc_TypeError,
 				     "sequence expected, %.80s found",
 				     orig->ob_type->tp_name);
 		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)))
-		return NULL;
+		goto finally;
+
 	p = PyString_AsString(res);
 
 	for (i = 0; i < seqlen; i++) {
@@ -774,8 +777,8 @@
 		if (!PyString_Check(item)){
 			if (PyUnicode_Check(item)) {
 				Py_DECREF(res);
-				return PyUnicode_Join((PyObject *)self, 
-						      seq);
+				Py_DECREF(seq);
+				return PyUnicode_Join((PyObject *)self, seq);
 			}
 			PyErr_Format(PyExc_TypeError,
 			     "sequence item %i: expected string, %.80s found",
@@ -806,7 +809,7 @@
 
   finally:
 	Py_DECREF(seq);
-	Py_DECREF(res);
+	Py_XDECREF(res);
 	return NULL;
 }