Mercurial > cpython-lru_cache-weakref
diff Objects/rangeobject.c @ 57286:eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
In some cases, the code was just reordered to allow for less decrefing.
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Mon, 16 Nov 2009 00:34:25 +0000 |
| parents | 3ebf907db028 |
| children | cab14be0ada1 |
line wrap: on
line diff
--- a/Objects/rangeobject.c Mon Nov 16 00:25:02 2009 +0000 +++ b/Objects/rangeobject.c Mon Nov 16 00:34:25 2009 +0000 @@ -533,6 +533,7 @@ it->step = step; ulen = get_len_of_range(start, stop, step); if (ulen > (unsigned long)LONG_MAX) { + Py_DECREF(it); PyErr_SetString(PyExc_OverflowError, "range too large to represent as a range_iterator"); return NULL; @@ -584,16 +585,14 @@ if (!one) return NULL; + new_index = PyNumber_Add(r->index, one); + Py_DECREF(one); + if (!new_index) + return NULL; + product = PyNumber_Multiply(r->index, r->step); if (!product) { - Py_DECREF(one); - return NULL; - } - - new_index = PyNumber_Add(r->index, one); - Py_DECREF(one); - if (!new_index) { - Py_DECREF(product); + Py_DECREF(new_index); return NULL; } @@ -603,6 +602,9 @@ Py_DECREF(r->index); r->index = new_index; } + else { + Py_DECREF(new_index); + } return result; } @@ -781,6 +783,9 @@ if (!len) goto create_failure; + /* Steal reference to len. */ + it->len = len; + one = PyLong_FromLong(1); if (!one) goto create_failure; @@ -802,24 +807,16 @@ goto create_failure; it->step = PyNumber_Negative(range->step); - if (!it->step) { - Py_DECREF(it->start); + if (!it->step) goto create_failure; - } - - /* Steal reference to len. */ - it->len = len; it->index = PyLong_FromLong(0); - if (!it->index) { - Py_DECREF(it); - return NULL; - } + if (!it->index) + goto create_failure; return (PyObject *)it; create_failure: - Py_XDECREF(len); - PyObject_Del(it); + Py_DECREF(it); return NULL; }
