}
PyObject* PyList_FromPackageList(struct pakfire_packagelist* packagelist) {
- PyObject* list = PyList_New(0);
+ struct pakfire_package* package = NULL;
+ PyObject* item = NULL;
+ // Determine the length of the list
const size_t length = pakfire_packagelist_length(packagelist);
- for (size_t i = 0; i < length; i++) {
- struct pakfire_package* package = pakfire_packagelist_get(packagelist, i);
+ // Create a new list
+ PyObject* list = PyList_New(length);
- PyObject* item = new_package(&PackageType, package);
- PyList_Append(list, item);
+ for (size_t i = 0; i < length; i++) {
+ package = pakfire_packagelist_get(packagelist, i);
+ // Make a new package
+ item = new_package(&PackageType, package);
pakfire_package_unref(package);
- Py_DECREF(item);
+
+ // Fail if we could not create a package
+ if (!item)
+ goto ERROR;
+
+ // Add it to the list
+ PyList_SET_ITEM(list, i, item);
}
return list;
+
+ERROR:
+ Py_XDECREF(list);
+ return NULL;
}
PyObject* PyList_FromFileList(struct pakfire_filelist* filelist) {