Exception handling in _isl.c
[linpy.git] / pypol / _isl.c
index 828e10d..a62d650 100644 (file)
@@ -12,10 +12,14 @@ typedef struct _isl_constraint_list _isl_constraint_list;
 int _isl_isl_basic_set_add_constraint_list(__isl_take isl_constraint *c,
         void *user) {
     _isl_constraint_list *list;
+    PyObject *value;
 
     list = (_isl_constraint_list *) user;
-    return PyList_SetItem(list->constraints, list->cursor++,
-        PyLong_FromVoidPtr(c));
+    value = PyLong_FromVoidPtr(c);
+    if (value == NULL) {
+        return -1;
+    }
+    return PyList_SetItem(list->constraints, list->cursor++, value);
 }
 
 static PyObject * _isl_isl_basic_set_constraints(PyObject *self,
@@ -30,13 +34,31 @@ static PyObject * _isl_isl_basic_set_constraints(PyObject *self,
         return NULL;
     bset = (isl_basic_set*) ptr;
     n = isl_basic_set_n_constraint(bset);
+    if (n == -1) {
+        PyErr_SetString(PyExc_RuntimeError,
+            "an error occurred in isl_basic_set_n_constraint");
+        return NULL;
+    }
     constraints = PyList_New(n);
+    if (constraints == NULL) {
+        return NULL;
+    }
     list = malloc(sizeof(_isl_constraint_list));
+    if (list == NULL) {
+        Py_DECREF(constraints);
+        return PyErr_NoMemory();
+    }
     list->cursor = 0;
     list->constraints = constraints;
-    isl_basic_set_foreach_constraint(bset,
+    n = isl_basic_set_foreach_constraint(bset,
         _isl_isl_basic_set_add_constraint_list, list);
     free(list);
+    if (n == -1) {
+        PyErr_SetString(PyExc_RuntimeError,
+            "an error occurred in isl_basic_set_foreach_constraint");
+        Py_DECREF(constraints);
+        return NULL;
+    }
     return constraints;
 }
 
@@ -49,17 +71,20 @@ static struct PyModuleDef _islmodule = {
     PyModuleDef_HEAD_INIT,
     "_isl",
     NULL,
-    -1,
+    0,
     _isl_methods
 };
 
 PyMODINIT_FUNC PyInit__isl(void) {
     PyObject *m;
     m = PyModule_Create(&_islmodule);
-    if (m == NULL)
+    if (m == NULL) {
         return NULL;
+    }
 
-    PyModule_AddObject(m, "isl_dim_set", PyLong_FromLong(isl_dim_set));
+    if (PyModule_AddObject(m, "isl_dim_set", PyLong_FromLong(isl_dim_set)) == -1) {
+        return NULL;
+    }
 
     return m;
 }