summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/helpers.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-01-03 23:36:47 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-01-03 23:36:47 (GMT)
commit55ccf25e0c6666436f0ecd222e60208ebf6ab30e (patch)
tree21c1ecc9e6d6ae50d0cfb0ffa4eaf61bf78a45a2 /plugins/pychrysalide/helpers.c
parent28bfc34862513acb8fe9fcd02afca493c2411c02 (diff)
Defined a dynamic type for each plugin.
Diffstat (limited to 'plugins/pychrysalide/helpers.c')
-rw-r--r--plugins/pychrysalide/helpers.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/plugins/pychrysalide/helpers.c b/plugins/pychrysalide/helpers.c
index ad62de4..a930097 100644
--- a/plugins/pychrysalide/helpers.c
+++ b/plugins/pychrysalide/helpers.c
@@ -701,3 +701,77 @@ bool _register_class_for_pygobject(PyObject *dict, GType gtype, PyTypeObject *ty
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : dict = dictionnaire où conserver une référence au type créé.*
+* gtype = type dans sa version GLib. *
+* type = type dans sa version Python. *
+* base = type de base de l'objet. *
+* *
+* Description : Enregistre un type Python dérivant d'un type GLib dynamique. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_class_for_dynamic_pygobject(GType gtype, PyTypeObject *type, PyTypeObject *base)
+{
+ bool result; /* Bilan à retourner */
+ PyTypeObject *legacy_parent; /* Type parent d'origine */
+ PyObject *sys_mod_dict; /* Dictionnaire des modules */
+ PyObject *modname; /* Nom du module du type */
+ PyObject *module; /* Module à recompléter */
+ PyObject *dict; /* Dictionnaire dudit module */
+
+ /**
+ * Lors de l'appel à pygobject_register_class(), PyGObject remplace systématiquement
+ * le type Python fourni par :
+ *
+ * Py_TYPE(type) = PyGObject_MetaType;
+ *
+ * Ce nouveau type est le suivant (cf. gi/types.py) :
+ *
+ * class _GObjectMetaBase(type):
+ * """Metaclass for automatically registering GObject classes."""
+ *
+ * D'une part, comme les enregistrements sont gérés manuellement dans le cas de
+ * types dérivés dynamiquement d'objets natifs, ce changement est inutile.
+ *
+ * D'autre part, il semble avoir un soucis de références (cf. testGarbageCollecting()
+ * du fichier de test plugins/plugin.py) :
+ *
+ * python3dm: ../Modules/gcmodule.c:379: visit_decref: Assertion `_PyGCHead_REFS(gc) != 0' failed.
+ *
+ * #3 __GI___assert_fail ()
+ * #4 visit_decref ()
+ * #5 subtype_traverse ()
+ * #6 subtract_refs ()
+ * #7 collect ()
+ * #8 collect_with_callback ()
+ * #9 gc_collect ()
+ *
+ * On restaure donc le type d'origine de l'objet Python créé dynamquement pour éviter
+ * ce genre de soucis.
+ */
+
+ legacy_parent = Py_TYPE(type);
+
+ sys_mod_dict = PyImport_GetModuleDict();
+
+ modname = PyDict_GetItemString(type->tp_dict, "__module__");
+
+ module = PyObject_GetItem(sys_mod_dict, modname);
+
+ dict = PyModule_GetDict(module);
+
+ result = _register_class_for_pygobject(dict, gtype, type, &PyGObject_Type, base, NULL);
+
+ Py_TYPE(type) = legacy_parent;
+
+ return result;
+
+}