[Python-checkins] cpython (3.2): Fix error handling in examples of C API use.
antoine.pitrou
python-checkins at python.org
Fri Jan 27 14:10:19 CET 2012
http://hg.python.org/cpython/rev/e21dd3c1ca7e
changeset: 74654:e21dd3c1ca7e
branch: 3.2
parent: 74652:2863d9273abd
user: Antoine Pitrou <solipsis at pitrou.net>
date: Fri Jan 27 14:07:29 2012 +0100
summary:
Fix error handling in examples of C API use.
files:
Doc/c-api/intro.rst | 36 ++++++++++++++++++++++----------
1 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst
--- a/Doc/c-api/intro.rst
+++ b/Doc/c-api/intro.rst
@@ -246,17 +246,19 @@
int
set_all(PyObject *target, PyObject *item)
{
- int i, n;
+ Py_ssize_t i, n;
n = PyObject_Length(target);
if (n < 0)
return -1;
for (i = 0; i < n; i++) {
- PyObject *index = PyLong_FromLong(i);
+ PyObject *index = PyLong_FromSsize_t(i);
if (!index)
return -1;
- if (PyObject_SetItem(target, index, item) < 0)
+ if (PyObject_SetItem(target, index, item) < 0) {
+ Py_DECREF(index);
return -1;
+ }
Py_DECREF(index);
}
return 0;
@@ -292,8 +294,8 @@
long
sum_list(PyObject *list)
{
- int i, n;
- long total = 0;
+ Py_ssize_t i, n;
+ long total = 0, value;
PyObject *item;
n = PyList_Size(list);
@@ -302,7 +304,11 @@
for (i = 0; i < n; i++) {
item = PyList_GetItem(list, i); /* Can't fail */
if (!PyLong_Check(item)) continue; /* Skip non-integers */
- total += PyLong_AsLong(item);
+ value = PyLong_AsLong(item);
+ if (value == -1 && PyErr_Occurred())
+ /* Integer too big to fit in a C long, bail out */
+ return -1;
+ total += value;
}
return total;
}
@@ -314,8 +320,8 @@
long
sum_sequence(PyObject *sequence)
{
- int i, n;
- long total = 0;
+ Py_ssize_t i, n;
+ long total = 0, value;
PyObject *item;
n = PySequence_Length(sequence);
if (n < 0)
@@ -324,9 +330,17 @@
item = PySequence_GetItem(sequence, i);
if (item == NULL)
return -1; /* Not a sequence, or other failure */
- if (PyLong_Check(item))
- total += PyLong_AsLong(item);
- Py_DECREF(item); /* Discard reference ownership */
+ if (PyLong_Check(item)) {
+ value = PyLong_AsLong(item);
+ Py_DECREF(item);
+ if (value == -1 && PyErr_Occurred())
+ /* Integer too big to fit in a C long, bail out */
+ return -1;
+ total += value;
+ }
+ else {
+ Py_DECREF(item); /* Discard reference ownership */
+ }
}
return total;
}
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list