summaryrefslogtreecommitdiff
path: root/Objects/rangeobject.c
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-11-16 00:36:18 +0000
committerBenjamin Peterson <benjamin@python.org>2009-11-16 00:36:18 +0000
commitbdf439321f97c1f78c5b387fcbf5556e56d57fd3 (patch)
treee3dd0bee7022a43131d8dd034947b1a1ce7ebb8e /Objects/rangeobject.c
parentb830a230c1718f23bccf6e0af9e3d8d32ef57b2c (diff)
downloadcpython-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.c37
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;
}