diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-12-12 17:02:49 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-12-12 17:02:49 (GMT) |
commit | d5b598b14fd4c50847ce536692ded258ba1720ca (patch) | |
tree | bee74e8bcdd642bf67103529991be9d587c6d1da /plugins/pychrysalide/helpers.c | |
parent | edcd7a2e2919ea880f8aaf649cf7ed8f1eabac1a (diff) |
Registered basic Python objects in the features namespace.
Diffstat (limited to 'plugins/pychrysalide/helpers.c')
-rw-r--r-- | plugins/pychrysalide/helpers.c | 135 |
1 files changed, 106 insertions, 29 deletions
diff --git a/plugins/pychrysalide/helpers.c b/plugins/pychrysalide/helpers.c index 5ef10eb..be580a4 100644 --- a/plugins/pychrysalide/helpers.c +++ b/plugins/pychrysalide/helpers.c @@ -35,6 +35,14 @@ +/* ---------------------------- MISE EN PLACE DE MODULES ---------------------------- */ + + +/* Ajoute une classe dans les fonctionnalités globales. */ +static bool include_python_type_into_features(PyObject *, PyTypeObject *); + + + /* ---------------------------------------------------------------------------------- */ /* ACCELERATEURS POUR PYTHON UNIQUEMENT */ /* ---------------------------------------------------------------------------------- */ @@ -297,7 +305,11 @@ PyObject *build_python_module(PyObject *super, PyModuleDef *def) Py_INCREF(result); ret = PyModule_AddObject(super, dot + 1, result); - if (ret != 0) goto bad_exit; + if (ret != 0) + { + Py_DECREF(result); + goto bad_exit; + } register_access_to_python_module(def->m_name, result); @@ -372,6 +384,94 @@ bool register_python_module_methods(PyObject *module, PyMethodDef *defs) } +/****************************************************************************** +* * +* Paramètres : dict = dictionnaire où conserver une référence au type créé. * +* type = type dans sa version Python. * +* * +* Description : Ajoute une classe dans les fonctionnalités globales. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool include_python_type_into_features(PyObject *dict, PyTypeObject *type) +{ + bool result; /* Bilan à retourner */ + PyObject *features; /* Module à recompléter */ + PyObject *features_dict; /* Dictionnaire à compléter */ + char *name; /* Désignation de la classe */ + PyObject *item; /* Nouvel élément à exporter */ + int ret; /* Bilan d'une insertion */ + + features = get_access_to_python_module("pychrysalide.features"); + + features_dict = PyModule_GetDict(features); + + name = strrchr(type->tp_name, '.'); + assert(name != NULL); + + name++; + + item = PyDict_GetItemString(dict, name); + result = (item != NULL); + assert(result); + + ret = PyDict_SetItemString(features_dict, name, item); + result = (ret == 0); + assert(result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* type = type à intégrer dans sa version Python. * +* * +* Description : Met en place un objet au sein d'un module Python. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool register_python_module_object(PyObject *module, PyTypeObject *type) +{ + bool result; /* Bilan à retourner */ + char *name; /* Désignation de la classe */ + int ret; /* Bilan d'un appel */ + PyObject *dict; /* Dictionnaire du module */ + + name = strrchr(type->tp_name, '.'); + assert(name != NULL); + + name++; + + Py_INCREF(type); + ret = PyModule_AddObject(module, name, (PyObject *)type); + + result = (ret == 0); + + if (!result) + Py_DECREF(type); + + else + { + dict = PyModule_GetDict(module); + result = include_python_type_into_features(dict, type); + } + + return result; + +} + + /* ---------------------------------------------------------------------------------- */ /* CONFORTS CIBLANT PYGOBJECT */ @@ -494,10 +594,10 @@ PyTypeObject *define_python_dynamic_type(const PyTypeObject *spec) /****************************************************************************** * * -* Paramètres : module = module 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. * +* 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 correctement une surcouche de conversion GObject. * * * @@ -514,11 +614,6 @@ bool _register_class_for_pygobject(PyObject *dict, GType gtype, PyTypeObject *ty PyObject *static_bases; /* Base(s) de l'objet */ va_list ap; /* Parcours des arguments */ PyTypeObject *static_base; /* Base à rajouter à la liste */ - PyObject *features; /* Module à recompléter */ - PyObject *features_dict; /* Dictionnaire à compléter */ - char *name; /* Désignation de la classe */ - PyObject *item; /* Nouvel élément à exporter */ - int ret; /* Bilan d'une insertion */ /** * pygobject_register_class() définit type->tp_base à partir des arguments fournis, @@ -597,25 +692,7 @@ bool _register_class_for_pygobject(PyObject *dict, GType gtype, PyTypeObject *ty */ if (result) - { - features = get_access_to_python_module("pychrysalide.features"); - - features_dict = PyModule_GetDict(features); - - name = strrchr(type->tp_name, '.'); - assert(name != NULL); - - name++; - - item = PyDict_GetItemString(dict, name); - assert(item != NULL); - - ret = PyDict_SetItemString(features_dict, name, item); - assert(ret == 0); - - result = (ret == 0); - - } + result = include_python_type_into_features(dict, type); return result; |