diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-11-16 00:36:18 +0000 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-11-16 00:36:18 +0000 |
commit | bdf439321f97c1f78c5b387fcbf5556e56d57fd3 (patch) | |
tree | e3dd0bee7022a43131d8dd034947b1a1ce7ebb8e /Objects/rangeobject.c | |
parent | b830a230c1718f23bccf6e0af9e3d8d32ef57b2c (diff) | |
download | cpython-git-bdf439321f97c1f78c5b387fcbf5556e56d57fd3.tar.gz |
Merged revisions 76319 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r76319 | benjamin.peterson | 2009-11-15 18:34:25 -0600 (Sun, 15 Nov 2009) | 4 lines
fix one visible and several possible refleaks in rangeobject.c
In some cases, the code was just reordered to allow for less decrefing.
........
Diffstat (limited to 'Objects/rangeobject.c')
-rw-r--r-- | Objects/rangeobject.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index c8b10eb6a8..d7c2fb9164 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -476,6 +476,7 @@ int_range_iter(long start, long stop, long step) 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; @@ -527,16 +528,14 @@ longrangeiter_next(longrangeiterobject *r) if (!one) 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); + if (!new_index) + return NULL; + + product = PyNumber_Multiply(r->index, r->step); + if (!product) { + Py_DECREF(new_index); return NULL; } @@ -546,6 +545,9 @@ longrangeiter_next(longrangeiterobject *r) Py_DECREF(r->index); r->index = new_index; } + else { + Py_DECREF(new_index); + } return result; } @@ -724,6 +726,9 @@ long_range: if (!len) goto create_failure; + /* Steal reference to len. */ + it->len = len; + one = PyLong_FromLong(1); if (!one) goto create_failure; @@ -745,24 +750,16 @@ long_range: 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; } |