diff options
Diffstat (limited to 'plugins/pychrysalide')
| -rw-r--r-- | plugins/pychrysalide/analysis/db/certs.c | 6 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/instriter.c | 7 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/vmpa.c | 12 | ||||
| -rw-r--r-- | plugins/pychrysalide/common/bits.c | 6 | ||||
| -rw-r--r-- | plugins/pychrysalide/common/fnv1a.c | 9 | ||||
| -rw-r--r-- | plugins/pychrysalide/common/pathname.c | 7 | ||||
| -rw-r--r-- | plugins/pychrysalide/format/symiter.c | 7 | ||||
| -rw-r--r-- | plugins/pychrysalide/glibext/configuration.c | 8 | ||||
| -rw-r--r-- | plugins/pychrysalide/gui/core/items.c | 6 | ||||
| -rw-r--r-- | plugins/pychrysalide/helpers.c | 135 | ||||
| -rw-r--r-- | plugins/pychrysalide/helpers.h | 3 | ||||
| -rw-r--r-- | plugins/pychrysalide/struct.c | 11 | 
12 files changed, 129 insertions, 88 deletions
| diff --git a/plugins/pychrysalide/analysis/db/certs.c b/plugins/pychrysalide/analysis/db/certs.c index 385e277..61b5f58 100644 --- a/plugins/pychrysalide/analysis/db/certs.c +++ b/plugins/pychrysalide/analysis/db/certs.c @@ -312,7 +312,6 @@ bool ensure_python_certs_is_registered(void)  {      PyTypeObject *type;                     /* Type Python pour 'certs'    */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_certs_type(); @@ -325,10 +324,7 @@ bool ensure_python_certs_is_registered(void)          module = get_access_to_python_module("pychrysalide.analysis.db"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "certs", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/arch/instriter.c b/plugins/pychrysalide/arch/instriter.c index f665cba..9b149fd 100644 --- a/plugins/pychrysalide/arch/instriter.c +++ b/plugins/pychrysalide/arch/instriter.c @@ -33,6 +33,7 @@  #include "processor.h"  #include "../access.h" +#include "../helpers.h" @@ -263,7 +264,6 @@ bool ensure_python_instr_iterator_is_registered(void)  {      PyTypeObject *type;                     /* Type Python 'InstrIterator' */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_instr_iterator_type(); @@ -274,10 +274,7 @@ bool ensure_python_instr_iterator_is_registered(void)          module = get_access_to_python_module("pychrysalide.arch"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "InstrIterator", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/arch/vmpa.c b/plugins/pychrysalide/arch/vmpa.c index cdf20c9..f2450bb 100644 --- a/plugins/pychrysalide/arch/vmpa.c +++ b/plugins/pychrysalide/arch/vmpa.c @@ -662,7 +662,6 @@ bool ensure_python_vmpa_is_registered(void)  {      PyTypeObject *type;                     /* Type Python pour 'vmpa'     */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_vmpa_type(); @@ -676,10 +675,7 @@ bool ensure_python_vmpa_is_registered(void)          module = get_access_to_python_module("pychrysalide.arch"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "vmpa", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } @@ -1260,7 +1256,6 @@ bool ensure_python_mrange_is_registered(void)  {      PyTypeObject *type;                     /* Type Python pour 'mrange'   */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_mrange_type(); @@ -1271,10 +1266,7 @@ bool ensure_python_mrange_is_registered(void)          module = get_access_to_python_module("pychrysalide.arch"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "mrange", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/common/bits.c b/plugins/pychrysalide/common/bits.c index 62aeb6d..7a6454d 100644 --- a/plugins/pychrysalide/common/bits.c +++ b/plugins/pychrysalide/common/bits.c @@ -762,7 +762,6 @@ bool ensure_python_bitfield_is_registered(void)  {      PyTypeObject *type;                     /* Type Python pour 'bitfield' */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_bitfield_type(); @@ -773,10 +772,7 @@ bool ensure_python_bitfield_is_registered(void)          module = get_access_to_python_module("pychrysalide.common"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "bitfield", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/common/fnv1a.c b/plugins/pychrysalide/common/fnv1a.c index 759c7ea..5caad48 100644 --- a/plugins/pychrysalide/common/fnv1a.c +++ b/plugins/pychrysalide/common/fnv1a.c @@ -32,6 +32,7 @@  #include "../access.h" +#include "../helpers.h" @@ -130,9 +131,8 @@ PyTypeObject *get_python_fnv1a_type(void)  bool ensure_python_fnv1a_is_registered(void)  { -    PyTypeObject *type;                     /* Type Python pour 'fnv1a'   */ +    PyTypeObject *type;                     /* Type Python pour 'fnv1a'    */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_fnv1a_type(); @@ -145,10 +145,7 @@ bool ensure_python_fnv1a_is_registered(void)          module = get_access_to_python_module("pychrysalide.common"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "fnv1a", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/common/pathname.c b/plugins/pychrysalide/common/pathname.c index c2d69c6..e07ebe5 100644 --- a/plugins/pychrysalide/common/pathname.c +++ b/plugins/pychrysalide/common/pathname.c @@ -36,6 +36,7 @@  #include "../access.h" +#include "../helpers.h" @@ -190,7 +191,6 @@ bool ensure_python_pathname_is_registered(void)  {      PyTypeObject *type;                     /* Type Python pour 'pathname' */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_pathname_type(); @@ -203,10 +203,7 @@ bool ensure_python_pathname_is_registered(void)          module = get_access_to_python_module("pychrysalide.common"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "pathname", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/format/symiter.c b/plugins/pychrysalide/format/symiter.c index 74a215d..03a0ec8 100644 --- a/plugins/pychrysalide/format/symiter.c +++ b/plugins/pychrysalide/format/symiter.c @@ -33,6 +33,7 @@  #include "format.h"  #include "../access.h" +#include "../helpers.h" @@ -263,7 +264,6 @@ bool ensure_python_sym_iterator_is_registered(void)  {      PyTypeObject *type;                     /* Type Python 'SymIterator'   */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_sym_iterator_type(); @@ -274,10 +274,7 @@ bool ensure_python_sym_iterator_is_registered(void)          module = get_access_to_python_module("pychrysalide.format"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "SymIterator", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/glibext/configuration.c b/plugins/pychrysalide/glibext/configuration.c index 18d681f..e74f0a4 100644 --- a/plugins/pychrysalide/glibext/configuration.c +++ b/plugins/pychrysalide/glibext/configuration.c @@ -782,9 +782,8 @@ PyTypeObject *get_python_config_param_iterator_type(void)  bool ensure_python_config_param_iterator_is_registered(void)  { -    PyTypeObject *type;                     /* Type Python 'Cnf...Iter'*/ +    PyTypeObject *type;                     /* Type Python 'Cnf...Iter'    */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_config_param_iterator_type(); @@ -797,10 +796,7 @@ bool ensure_python_config_param_iterator_is_registered(void)          if (PyType_Ready(type) != 0)              return false; -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "ConfigParamIterator", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } diff --git a/plugins/pychrysalide/gui/core/items.c b/plugins/pychrysalide/gui/core/items.c index 82c2c1c..0912bc4 100644 --- a/plugins/pychrysalide/gui/core/items.c +++ b/plugins/pychrysalide/gui/core/items.c @@ -258,7 +258,6 @@ bool ensure_python_items_is_registered(void)  {      PyTypeObject *type;                     /* Type Python de 'items'      */      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan d'un appel            */      type = get_python_items_type(); @@ -271,10 +270,7 @@ bool ensure_python_items_is_registered(void)          module = get_access_to_python_module("pychrysalide.gui.core"); -        Py_INCREF(type); -        ret = PyModule_AddObject(module, "items", (PyObject *)type); - -        if (ret != 0) +        if (!register_python_module_object(module, type))              return false;      } 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; diff --git a/plugins/pychrysalide/helpers.h b/plugins/pychrysalide/helpers.h index 486ebdc..9f02daa 100644 --- a/plugins/pychrysalide/helpers.h +++ b/plugins/pychrysalide/helpers.h @@ -67,6 +67,9 @@ PyObject *build_python_module(PyObject *, PyModuleDef *);  /* Met en place une série de méthodes pour un module Python. */  bool register_python_module_methods(PyObject *, PyMethodDef *); +/* Met en place un objet au sein d'un module Python. */ +bool register_python_module_object(PyObject *, PyTypeObject *); +  /* --------------------------- CONFORTS CIBLANT PYGOBJECT --------------------------- */ diff --git a/plugins/pychrysalide/struct.c b/plugins/pychrysalide/struct.c index 98704c0..d4d6a9f 100644 --- a/plugins/pychrysalide/struct.c +++ b/plugins/pychrysalide/struct.c @@ -26,6 +26,7 @@  #include "access.h" +#include "helpers.h" @@ -147,7 +148,6 @@ bool ensure_python_py_struct_is_registered(void)  {      PyTypeObject *type;                     /* Type Python 'PyStructObject'*/      PyObject *module;                       /* Module à recompléter        */ -    int ret;                                /* Bilan des préparatifs       */      type = get_python_py_struct_type(); @@ -155,14 +155,11 @@ bool ensure_python_py_struct_is_registered(void)      {          module = get_access_to_python_module("pychrysalide"); -        ret = PyType_Ready(type); - -        if (ret != 0) +        if (PyType_Ready(type) != 0)              return false; -        Py_INCREF(type); - -        PyModule_AddObject(module, "PyStructObject", (PyObject *)type); +        if (!register_python_module_object(module, type)) +            return false;      } | 
