Mercurial > cpython-lru_cache-weakref
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; }
