[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