summaryrefslogtreecommitdiff
path: root/src/analysis/routine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/routine.c')
-rw-r--r--src/analysis/routine.c95
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;