PyListObject & C Modules
Brian Quinlan
brian at sweetapp.com
Tue Sep 3 16:43:20 EDT 2002
Martin, are you sure that you don't have a ref counting bug in your
example? Since PyList_GetItem borrows a reference and PyList_SetItem
steels one, you need to do an incref in between. Here is my modified
version (not tested or even compiled):
PyObject*
get_first_elem(PyObject *unused, PyObject *args)
{
PyObject *list;
PyObject *first;
PyObject *result;
if(!PyArg_ParseTuple("O", &list))
return NULL;
if(!PyList_Check(list)) {
PyErr_SetString(PyExc_TypeError, "get_first_elem expects a list");
return NULL;
}
if(PyList_Size(list) == 0){
PyErr_SetString(PyExc_ValueError, "empty lists not allowed");
return NULL;
}
first = PyList_GetItem(list, 0);
+ if (first == NULL) return NULL;
result = PyList_New(1);
if (!result) return NULL;
+ Py_ADDREF(first)
- PyList_SetItem(result, 0, first);
+ if (PyList_SetItem(result, 0, first) != 0) {
+ Py_DECREF(first)
+ Py_DECREF(result);
+ result = NULL;
+ }
return result;
}
Cheers,
Brian
More information about the Python-list
mailing list