From 178a4506f4fccd593069e249a52d6ed5458c8f94 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 20 Jan 2018 15:09:52 +0100 Subject: [PATCH] python: Drop Pakfire reference from some objects Signed-off-by: Michael Tremer --- src/_pakfire/package.c | 57 +++++++++++++++--------- src/_pakfire/package.h | 1 - src/_pakfire/pakfire.c | 12 ++++- src/_pakfire/relation.c | 39 +++++----------- src/_pakfire/relation.h | 3 +- src/_pakfire/selector.c | 2 +- src/_pakfire/util.c | 4 +- src/_pakfire/util.h | 2 +- src/libpakfire/include/pakfire/package.h | 1 + src/libpakfire/libpakfire.sym | 1 + src/libpakfire/package.c | 4 ++ 11 files changed, 68 insertions(+), 58 deletions(-) diff --git a/src/_pakfire/package.c b/src/_pakfire/package.c index c53a732d1..a45e89440 100644 --- a/src/_pakfire/package.c +++ b/src/_pakfire/package.c @@ -43,7 +43,6 @@ PyObject* new_package(PyTypeObject* type, PakfirePackage pkg) { static PyObject* Package_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { PackageObject* self = (PackageObject *)type->tp_alloc(type, 0); if (self) { - self->pakfire = NULL; self->package = NULL; } @@ -52,7 +51,6 @@ static PyObject* Package_new(PyTypeObject* type, PyObject* args, PyObject* kwds) static void Package_dealloc(PackageObject* self) { pakfire_package_unref(self->package); - Py_XDECREF(self->pakfire); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -64,10 +62,7 @@ static int Package_init(PackageObject* self, PyObject* args, PyObject* kwds) { if (!PyArg_ParseTuple(args, "O!|i", &PakfireType, &pakfire, &id)) return -1; - self->pakfire = pakfire; - Py_INCREF(self->pakfire); - - self->package = pakfire_package_create(self->pakfire->pakfire, (Id)id); + self->package = pakfire_package_create(pakfire->pakfire, (Id)id); return 0; } @@ -469,7 +464,7 @@ static PyObject* Package_get_location(PackageObject* self) { return str; } -static PyObject* PyList_FromRelationList(PakfireObject* pakfire, PakfireRelationList relationlist) { +static PyObject* PyList_FromRelationList(PakfireRelationList relationlist) { PyObject* list = PyList_New(0); if (list == NULL) return NULL; @@ -478,7 +473,7 @@ static PyObject* PyList_FromRelationList(PakfireObject* pakfire, PakfireRelation for (int i = 0; i < count; i++) { PakfireRelation relation = pakfire_relationlist_get_clone(relationlist, i); - PyObject* relation_obj = new_relation(pakfire, pakfire_relation_get_id(relation)); + PyObject* relation_obj = new_relation(&RelationType, relation); pakfire_relation_unref(relation); if (relation_obj == NULL) @@ -498,14 +493,14 @@ fail: return NULL; } -static PakfireRelationList PyList_AsRelationList(PakfireObject* pakfire, PyObject* value) { +static PakfireRelationList PyList_AsRelationList(Pakfire pakfire, PyObject* value) { if (!PySequence_Check(value)) { PyErr_SetString(PyExc_AttributeError, "Expected a sequence."); return NULL; } const int length = PySequence_Length(value); - PakfireRelationList relationlist = pakfire_relationlist_create(pakfire->pakfire); + PakfireRelationList relationlist = pakfire_relationlist_create(pakfire); for (int i = 0; i < length; i++) { PyObject* item = PySequence_GetItem(value, i); @@ -530,14 +525,17 @@ static PakfireRelationList PyList_AsRelationList(PakfireObject* pakfire, PyObjec static PyObject* Package_get_provides(PackageObject* self) { PakfireRelationList relationlist = pakfire_package_get_provides(self->package); - PyObject* list = PyList_FromRelationList(self->pakfire, relationlist); + PyObject* list = PyList_FromRelationList(relationlist); pakfire_relationlist_unref(relationlist); return list; } static int Package_set_provides(PackageObject* self, PyObject* value) { - PakfireRelationList relationlist = PyList_AsRelationList(self->pakfire, value); + Pakfire pakfire = pakfire_package_get_pakfire(self->package); + + PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); + pakfire_unref(pakfire); if (!relationlist) return -1; @@ -561,14 +559,17 @@ static PyObject* Package_add_provides(PackageObject* self, PyObject* args) { static PyObject* Package_get_requires(PackageObject* self) { PakfireRelationList relationlist = pakfire_package_get_requires(self->package); - PyObject* list = PyList_FromRelationList(self->pakfire, relationlist); + PyObject* list = PyList_FromRelationList(relationlist); pakfire_relationlist_unref(relationlist); return list; } static int Package_set_requires(PackageObject* self, PyObject* value) { - PakfireRelationList relationlist = PyList_AsRelationList(self->pakfire, value); + Pakfire pakfire = pakfire_package_get_pakfire(self->package); + + PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); + pakfire_unref(pakfire); if (!relationlist) return -1; @@ -592,14 +593,17 @@ static PyObject* Package_add_requires(PackageObject* self, PyObject* args) { static PyObject* Package_get_obsoletes(PackageObject* self) { PakfireRelationList relationlist = pakfire_package_get_obsoletes(self->package); - PyObject* list = PyList_FromRelationList(self->pakfire, relationlist); + PyObject* list = PyList_FromRelationList(relationlist); pakfire_relationlist_unref(relationlist); return list; } static int Package_set_obsoletes(PackageObject* self, PyObject* value) { - PakfireRelationList relationlist = PyList_AsRelationList(self->pakfire, value); + Pakfire pakfire = pakfire_package_get_pakfire(self->package); + + PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); + pakfire_unref(pakfire); if (!relationlist) return -1; @@ -623,14 +627,17 @@ static PyObject* Package_add_obsoletes(PackageObject* self, PyObject* args) { static PyObject* Package_get_conflicts(PackageObject* self) { PakfireRelationList relationlist = pakfire_package_get_conflicts(self->package); - PyObject* list = PyList_FromRelationList(self->pakfire, relationlist); + PyObject* list = PyList_FromRelationList(relationlist); pakfire_relationlist_unref(relationlist); return list; } static int Package_set_conflicts(PackageObject* self, PyObject* value) { - PakfireRelationList relationlist = PyList_AsRelationList(self->pakfire, value); + Pakfire pakfire = pakfire_package_get_pakfire(self->package); + + PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); + pakfire_unref(pakfire); if (!relationlist) return -1; @@ -654,14 +661,17 @@ static PyObject* Package_add_conflicts(PackageObject* self, PyObject* args) { static PyObject* Package_get_recommends(PackageObject* self) { PakfireRelationList relationlist = pakfire_package_get_recommends(self->package); - PyObject* list = PyList_FromRelationList(self->pakfire, relationlist); + PyObject* list = PyList_FromRelationList(relationlist); pakfire_relationlist_unref(relationlist); return list; } static int Package_set_recommends(PackageObject* self, PyObject* value) { - PakfireRelationList relationlist = PyList_AsRelationList(self->pakfire, value); + Pakfire pakfire = pakfire_package_get_pakfire(self->package); + + PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); + pakfire_unref(pakfire); if (!relationlist) return -1; @@ -685,14 +695,17 @@ static PyObject* Package_add_recommends(PackageObject* self, PyObject* args) { static PyObject* Package_get_suggests(PackageObject* self) { PakfireRelationList relationlist = pakfire_package_get_suggests(self->package); - PyObject* list = PyList_FromRelationList(self->pakfire, relationlist); + PyObject* list = PyList_FromRelationList(relationlist); pakfire_relationlist_unref(relationlist); return list; } static int Package_set_suggests(PackageObject* self, PyObject* value) { - PakfireRelationList relationlist = PyList_AsRelationList(self->pakfire, value); + Pakfire pakfire = pakfire_package_get_pakfire(self->package); + + PakfireRelationList relationlist = PyList_AsRelationList(pakfire, value); + pakfire_unref(pakfire); if (!relationlist) return -1; diff --git a/src/_pakfire/package.h b/src/_pakfire/package.h index dc2933da7..dd4aa4087 100644 --- a/src/_pakfire/package.h +++ b/src/_pakfire/package.h @@ -30,7 +30,6 @@ typedef struct { PyObject_HEAD - PakfireObject* pakfire; PakfirePackage package; } PackageObject; diff --git a/src/_pakfire/pakfire.c b/src/_pakfire/pakfire.c index e12b5d809..f4bdc2876 100644 --- a/src/_pakfire/pakfire.c +++ b/src/_pakfire/pakfire.c @@ -20,6 +20,7 @@ #include +#include #include #include #include @@ -229,7 +230,10 @@ static PyObject* Pakfire_whatprovides(PakfireObject* self, PyObject* args, PyObj PakfirePackageList list = pakfire_whatprovides(self->pakfire, provides, flags); - return PyList_FromPackageList(self, list); + PyObject* obj = PyList_FromPackageList(list); + pakfire_packagelist_unref(list); + + return obj; } static PyObject* Pakfire_search(PakfireObject* self, PyObject* args) { @@ -239,7 +243,11 @@ static PyObject* Pakfire_search(PakfireObject* self, PyObject* args) { return NULL; PakfirePackageList list = pakfire_search(self->pakfire, what, 0); - return PyList_FromPackageList(self, list); + + PyObject* obj = PyList_FromPackageList(list); + pakfire_packagelist_unref(list); + + return obj; } static PyObject* Pakfire_version_compare(PakfireObject* self, PyObject* args) { diff --git a/src/_pakfire/relation.c b/src/_pakfire/relation.c index 8ec3603ca..5c6cfd4ca 100644 --- a/src/_pakfire/relation.c +++ b/src/_pakfire/relation.c @@ -23,43 +23,33 @@ #include #include #include +#include #include -#include #include "package.h" #include "relation.h" -static RelationObject* Relation_new_core(PyTypeObject* type, PakfireObject* pakfire) { +PyObject* new_relation(PyTypeObject* type, PakfireRelation relation) { RelationObject* self = (RelationObject *)type->tp_alloc(type, 0); - if (!self) - return NULL; - - self->pakfire = pakfire; - if (self->pakfire) - Py_INCREF(self->pakfire); - - self->relation = NULL; - - return self; -} - -PyObject* new_relation(PakfireObject* pakfire, Id id) { - RelationObject* relation = Relation_new_core(&RelationType, pakfire); - relation->relation = pakfire_relation_create_from_id(pakfire->pakfire, id); + if (self) { + self->relation = pakfire_relation_ref(relation); + } - return (PyObject *)relation; + return (PyObject*)self; } static PyObject* Relation_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { - RelationObject* self = Relation_new_core(type, NULL); + RelationObject* self = (RelationObject *)type->tp_alloc(type, 0); + if (self) { + self->relation = NULL; + } - return (PyObject *)self; + return (PyObject*)self; } static void Relation_dealloc(RelationObject* self) { pakfire_relation_unref(self->relation); - Py_XDECREF(self->pakfire); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -72,13 +62,8 @@ static int Relation_init(RelationObject* self, PyObject* args, PyObject* kwds) { if (!PyArg_ParseTuple(args, "O!s|is", &PakfireType, &pakfire, &name, &cmp_type, &evr)) return -1; - self->pakfire = pakfire; - Py_INCREF(self->pakfire); - - self->relation = pakfire_relation_create(self->pakfire->pakfire, name, cmp_type, evr); + self->relation = pakfire_relation_create(pakfire->pakfire, name, cmp_type, evr); if (!self->relation) { - Py_DECREF(self->pakfire); - PyErr_Format(PyExc_ValueError, "No such relation: %s", name); return -1; } diff --git a/src/_pakfire/relation.h b/src/_pakfire/relation.h index ee04992a9..412b5b1be 100644 --- a/src/_pakfire/relation.h +++ b/src/_pakfire/relation.h @@ -29,12 +29,11 @@ typedef struct { PyObject_HEAD - PakfireObject* pakfire; PakfireRelation relation; } RelationObject; extern PyTypeObject RelationType; -PyObject* new_relation(PakfireObject* pakfire, Id id); +PyObject* new_relation(PyTypeObject* type, PakfireRelation relation); #endif /* PYTHON_PAKFIRE_RELATION_H */ diff --git a/src/_pakfire/selector.c b/src/_pakfire/selector.c index 52ee9e723..af6d1f0b9 100644 --- a/src/_pakfire/selector.c +++ b/src/_pakfire/selector.c @@ -84,7 +84,7 @@ static PyObject* Selector_get_providers(SelectorObject* self) { for (unsigned int i = 0; i < pakfire_packagelist_count(packagelist); i++) { PakfirePackage package = pakfire_packagelist_get(packagelist, i); - PyObject* obj = new_package(NULL, pakfire_package_id(package)); + PyObject* obj = new_package(&PackageType, package); PyList_Append(list, obj); pakfire_package_unref(package); diff --git a/src/_pakfire/util.c b/src/_pakfire/util.c index 383da37c2..222c6b87b 100644 --- a/src/_pakfire/util.c +++ b/src/_pakfire/util.c @@ -142,14 +142,14 @@ PyObject* performance_index(PyObject* self, PyObject* args) { return PyLong_FromUnsignedLong(iterations); } -PyObject* PyList_FromPackageList(PakfireObject* pakfire, PakfirePackageList packagelist) { +PyObject* PyList_FromPackageList(PakfirePackageList packagelist) { PyObject* list = PyList_New(0); int count = pakfire_packagelist_count(packagelist); for (int i = 0; i < count; i++) { PakfirePackage package = pakfire_packagelist_get(packagelist, i); - PyObject* item = new_package(pakfire, pakfire_package_id(package)); + PyObject* item = new_package(&PackageType, package); PyList_Append(list, item); pakfire_package_unref(package); diff --git a/src/_pakfire/util.h b/src/_pakfire/util.h index 22c51e689..bb7a814f3 100644 --- a/src/_pakfire/util.h +++ b/src/_pakfire/util.h @@ -34,6 +34,6 @@ extern PyObject *_unshare(PyObject *self, PyObject *args); extern PyObject *version_compare(PyObject *self, PyObject *args); extern PyObject* performance_index(PyObject* self, PyObject* args); -PyObject* PyList_FromPackageList(PakfireObject* pakfire, PakfirePackageList packagelist); +PyObject* PyList_FromPackageList(PakfirePackageList packagelist); #endif /* PYTHON_PAKFIRE_UTIL_H */ diff --git a/src/libpakfire/include/pakfire/package.h b/src/libpakfire/include/pakfire/package.h index f53657291..4fd6c22b7 100644 --- a/src/libpakfire/include/pakfire/package.h +++ b/src/libpakfire/include/pakfire/package.h @@ -32,6 +32,7 @@ PakfirePackage pakfire_package_create2(Pakfire pakfire, PakfireRepo repo, const PakfirePackage pakfire_package_ref(PakfirePackage pkg); PakfirePackage pakfire_package_unref(PakfirePackage pkg); +Pakfire pakfire_package_get_pakfire(PakfirePackage pkg); int pakfire_package_identical(PakfirePackage pkg1, PakfirePackage pkg2); int pakfire_package_cmp(PakfirePackage pkg1, PakfirePackage pkg2); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 0c158ce65..ae9371ebe 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -154,6 +154,7 @@ global: pakfire_package_get_name; pakfire_package_get_nevra; pakfire_package_get_obsoletes; + pakfire_package_get_pakfire; pakfire_package_get_provides; pakfire_package_get_recommends; pakfire_package_get_release; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 4721e77ce..47b304673 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -115,6 +115,10 @@ PAKFIRE_EXPORT PakfirePackage pakfire_package_unref(PakfirePackage pkg) { return NULL; } +PAKFIRE_EXPORT Pakfire pakfire_package_get_pakfire(PakfirePackage pkg) { + return pakfire_ref(pkg->pakfire); +} + static Solvable* get_solvable(PakfirePackage pkg) { Pool* pool = pakfire_package_get_solv_pool(pkg); -- 2.39.5