diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-01-03 23:36:47 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-01-03 23:36:47 (GMT) |
commit | 55ccf25e0c6666436f0ecd222e60208ebf6ab30e (patch) | |
tree | 21c1ecc9e6d6ae50d0cfb0ffa4eaf61bf78a45a2 /plugins/pychrysalide/helpers.c | |
parent | 28bfc34862513acb8fe9fcd02afca493c2411c02 (diff) |
Defined a dynamic type for each plugin.
Diffstat (limited to 'plugins/pychrysalide/helpers.c')
-rw-r--r-- | plugins/pychrysalide/helpers.c | 74 |
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; + +} |