diff options
Diffstat (limited to 'plugins/pychrysalide/bindings.c')
-rw-r--r-- | plugins/pychrysalide/bindings.c | 125 |
1 files changed, 41 insertions, 84 deletions
diff --git a/plugins/pychrysalide/bindings.c b/plugins/pychrysalide/bindings.c index 02850d1..99491d6 100644 --- a/plugins/pychrysalide/bindings.c +++ b/plugins/pychrysalide/bindings.c @@ -25,16 +25,15 @@ #include "bindings.h" -#ifdef PYTHON_PACKAGE -# include <dlfcn.h> -#endif +#include <assert.h> +#include <dlfcn.h> #include <pygobject.h> #include <stdio.h> -#include <config.h> #include <common/cpp.h> #include <common/extstr.h> +#include <core/core.h> #include <plugins/pglist.h> #include <plugins/self.h> @@ -125,6 +124,8 @@ static void restore_original_pygobject_type(PyTypeObject *); /* ------------------------ FONCTIONS GLOBALES DE CHRYSALIDE ------------------------ */ +/* Assure le plein chargement dans un interpréteur Python. */ +static bool init_python_interpreter_for_standalone_mode(const pyinit_details_t *); /* Point de sortie pour l'initialisation de Python. */ static void PyExit_pychrysalide(void); @@ -915,7 +916,7 @@ PyObject *init_python_pychrysalide_module(const pyinit_details_t *details) PyErr_SetString(PyExc_SystemError, "failed to load all PyChrysalide components."); else if (details->standalone) - status = do_global_init(); + status = init_python_interpreter_for_standalone_mode(details); if (!status) { @@ -1060,13 +1061,11 @@ void log_pychrysalide_exception(const char *prefix, ...) /* ---------------------------------------------------------------------------------- */ - - /****************************************************************************** * * -* Paramètres : py_gobj_def = définition de type actuelle. [OUT] * +* Paramètres : details = précisions de chargement complémentaires. * * * -* Description : Restore une ancienne définition de type GObject au besoin. * +* Description : Assure le plein chargement dans un interpréteur Python. * * * * Retour : Bilan de l'opération. * * * @@ -1074,103 +1073,77 @@ void log_pychrysalide_exception(const char *prefix, ...) * * ******************************************************************************/ -bool do_global_init(void) +static bool init_python_interpreter_for_standalone_mode(const pyinit_details_t *details) { - - return true; - return false; - - -#if 0 - - bool result; /* Bilan à retourner */ int ret; /* Bilan de préparatifs */ -#ifdef PYTHON_PACKAGE Dl_info info; /* Informations dynamiques */ -#endif + GModule *module; /* Structure de chargement GLib*/ GPluginModule *self; /* Représentation interne */ - PluginStatusFlags self_flags; /* Fanions à mettre à jour */ + + result = false; ret = Py_AtExit(PyExit_pychrysalide); if (ret == -1) { PyErr_SetString(PyExc_SystemError, "failed to register a cleanup function."); - goto exit_and_restore; + goto exit; + } + + if (!load_core_components(ACC_ALL_COMPONENTS)) + { + PyErr_SetString(PyExc_SystemError, "unable to load core components."); + goto exit; } /** - * Si cette extension pour Python est chargée depuis un dépôt Python, - * elle ne se trouve pas dans le répertoire classique des extensions et - * n'est donc pas chargée et enregistrée comme attendu. + * Le module chargé par Python n'apparaît pas dans la liste des greffons de + * Chrysalide et ne peut donc pas être référencé comme dépendance par d'autres + * extensions. * - * Cet enregistrement est donc forcé ici. + * Par ailleurs, lors de la recherche d'autres greffons via l'appel à la + * fonction init_all_plugins() ci-après, il faut que le nom du greffon soit + * déjà réservé pour faire échouer le second chargement du greffon courant + * lors du parcours des répertoires conservant les fichiers d'extensions. */ -#ifdef PYTHON_PACKAGE - ret = dladdr(__FUNCTION__, &info); if (ret == 0) { LOG_ERROR_DL_N("dladdr"); - - // err msg - - - Py_DECREF(result); - result = NULL; - - goto exit_and_restore; - } - - self = g_plugin_module_new(info.dli_fname); - assert(self != NULL); - - register_plugin(self); - -#endif - - - if (!load_core_components(ACC_GLOBAL_VARS)) - { - PyErr_SetString(PyExc_SystemError, "unable to load core components."); + PyErr_SetString(PyExc_SystemError, "failed to force bindings registration."); goto exit; - } - init_all_plugins(false); + } - lock_plugin_list_for_reading(); + module = g_module_open(info.dli_fname, G_MODULE_BIND_LAZY); + assert(module != NULL); - self = get_plugin_by_name("PyChrysalide", NULL); - assert(self != NULL); + self = details->create_self(module); - self_flags = g_plugin_module_get_flags(self); - self_flags &= ~(PSF_FAILURE | PSF_LOADED); - self_flags |= (status ? PSF_LOADED : PSF_FAILURE); + /* A ce stade, le greffon a été chargé correctement */ + g_plugin_module_override_flags(self, PSF_LOADED); - g_plugin_module_override_flags(self, self_flags); + register_plugin(self); unref_object(self); - unlock_plugin_list_for_reading(); - - load_remaning_plugins(); - - + /** + * Intégration des fonctionnalités portées par d'autres greffons. + */ + result = true; + init_all_plugins(true); - done: + exit: return result; -#endif - } - /****************************************************************************** * * * Paramètres : - * @@ -1185,24 +1158,8 @@ bool do_global_init(void) static void PyExit_pychrysalide(void) { - //assert(_standalone); - - /* - extern void set_current_project(void *project); - - set_current_project(NULL); - */ - -#ifdef TRACK_GOBJECT_LEAKS - remember_gtypes_for_leaks(); -#endif - exit_all_plugins(); - //unload_all_core_components(true); - -#ifdef TRACK_GOBJECT_LEAKS - dump_remaining_gtypes(); -#endif + unload_core_components(ACC_ALL_COMPONENTS); } |