diff options
Diffstat (limited to 'src/analysis/routine.c')
| -rw-r--r-- | src/analysis/routine.c | 95 | 
1 files changed, 93 insertions, 2 deletions
diff --git a/src/analysis/routine.c b/src/analysis/routine.c index 4116044..8b49456 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -81,6 +81,12 @@ static void g_bin_routine_class_init(GBinRoutineClass *);  /* Initialise une instance représentation de routine. */  static void g_bin_routine_init(GBinRoutine *); +/* Procède à la libération totale de la mémoire. */ +static void g_bin_routine_finalize(GBinRoutine *); + +/* Supprime toutes les références externes. */ +static void g_bin_routine_dispose(GBinRoutine *); +  /* Fournit une étiquette pour viser une routine. */  static char *g_binary_routine_get_label(const GBinRoutine *); @@ -104,8 +110,14 @@ G_DEFINE_TYPE(GBinRoutine, g_bin_routine, G_TYPE_BIN_SYMBOL);  static void g_bin_routine_class_init(GBinRoutineClass *klass)  { +    GObjectClass *object;                   /* Version de base de la classe*/      GBinSymbolClass *symbol;                /* Autre version de la classe  */ +    object = G_OBJECT_CLASS(klass); + +    object->dispose = (GObjectFinalizeFunc/* ! */)g_bin_routine_dispose; +    object->finalize = (GObjectFinalizeFunc)g_bin_routine_finalize; +      symbol = G_BIN_SYMBOL_CLASS(klass);      symbol->get_label = (get_symbol_label_fc)g_binary_routine_get_label; @@ -133,6 +145,86 @@ static void g_bin_routine_init(GBinRoutine *routine)      g_binary_symbol_set_target_type(symbol, STP_ROUTINE); +    routine->ret_type = NULL; + +    routine->namespace = NULL; +    routine->ns_sep = NULL; +    routine->name = NULL; +    routine->full_name = NULL; + +    routine->args = NULL; +    routine->args_count = 0; + +    routine->locals = NULL; +    routine->locals_count = 0; + +    routine->blocks = NULL; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : routine = instance d'objet GLib à traiter.                   * +*                                                                             * +*  Description : Supprime toutes les références externes.                     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_bin_routine_dispose(GBinRoutine *routine) +{ +    size_t i;                               /* Boucle de parcours          */ + +    g_clear_object(&routine->ret_type); + +    g_clear_object(&routine->namespace); +    g_clear_object(&routine->full_name); + +    for (i = 0; i < routine->args_count; i++) +        g_clear_object(&routine->args[i]); + +    for (i = 0; i < routine->locals_count; i++) +        g_clear_object(&routine->locals[i]); + +    g_clear_object(&routine->blocks); + +    G_OBJECT_CLASS(g_bin_routine_parent_class)->dispose(G_OBJECT(routine)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : routine = instance d'objet GLib à traiter.                   * +*                                                                             * +*  Description : Procède à la libération totale de la mémoire.                * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_bin_routine_finalize(GBinRoutine *routine) +{ +    if (routine->ns_sep != NULL) +        free(routine->ns_sep); + +    if (routine->name != NULL) +        free(routine->name); + +    if (routine->args != NULL) +        free(routine->args); + +    if (routine->locals != NULL) +        free(routine->locals); + +    G_OBJECT_CLASS(g_bin_routine_parent_class)->finalize(G_OBJECT(routine)); +  } @@ -736,8 +828,7 @@ GBlockList *g_binary_routine_get_basic_blocks(const GBinRoutine *routine)  void g_binary_routine_set_basic_blocks(GBinRoutine *routine, GBlockList *blocks)  { -    if (routine->blocks != NULL) -        g_object_unref(G_OBJECT(routine->blocks)); +    g_clear_object(&routine->blocks);      routine->blocks = blocks;  | 
