mirror of https://github.com/python/cpython.git
Fix error handling in examples of C API use.
This commit is contained in:
parent
84a0fbf6b0
commit
04707c032e
|
@ -246,17 +246,19 @@ sets all items of a list (actually, any mutable sequence) to a given item::
|
|||
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 @@ using :c:func:`PySequence_GetItem`. ::
|
|||
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 @@ using :c:func:`PySequence_GetItem`. ::
|
|||
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 @@ using :c:func:`PySequence_GetItem`. ::
|
|||
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 @@ using :c:func:`PySequence_GetItem`. ::
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue