summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/helpers.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-12-12 17:02:49 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-12-12 17:02:49 (GMT)
commitd5b598b14fd4c50847ce536692ded258ba1720ca (patch)
treebee74e8bcdd642bf67103529991be9d587c6d1da /plugins/pychrysalide/helpers.c
parentedcd7a2e2919ea880f8aaf649cf7ed8f1eabac1a (diff)
Registered basic Python objects in the features namespace.
Diffstat (limited to 'plugins/pychrysalide/helpers.c')
-rw-r--r--plugins/pychrysalide/helpers.c135
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;