summaryrefslogtreecommitdiff
path: root/src/arch/dalvik/context.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2013-01-14 22:08:00 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2013-01-14 22:08:00 (GMT)
commit2ab78407e9f73b6508afc281400a7c3fc018217f (patch)
tree437054ef874e9536e15b9254a6a8c4c2396604ff /src/arch/dalvik/context.c
parent35a6cd881528b5f77ce09476eccb39d02d9cc634 (diff)
Cleaned the context used for decompilations.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@324 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/dalvik/context.c')
-rw-r--r--src/arch/dalvik/context.c67
1 files changed, 59 insertions, 8 deletions
diff --git a/src/arch/dalvik/context.c b/src/arch/dalvik/context.c
index e5041cb..f1af7e9 100644
--- a/src/arch/dalvik/context.c
+++ b/src/arch/dalvik/context.c
@@ -114,6 +114,12 @@ static void g_dalvik_dcontext_class_init(GDalvikDContextClass *);
/* Initialise une instance de contexte de décompilation Dalkvik. */
static void g_dalvik_dcontext_init(GDalvikDContext *);
+/* Supprime toutes les références externes. */
+static void g_dalvik_dcontext_dispose(GDalvikDContext *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_dalvik_dcontext_finalize(GDalvikDContext *);
+
/* Convertit un registre machine en un pseudo-registre. */
static GDecInstruction *g_dalvik_dcontext_convert_register(GDalvikDContext *, GDalvikRegisterOperand *, bool);
@@ -282,7 +288,7 @@ G_DEFINE_TYPE(GDalvikDContext, g_dalvik_dcontext, G_TYPE_DEC_CONTEXT);
/******************************************************************************
* *
-* Paramètres : klass = classe à initialiser. *
+* Paramètres : class = classe à initialiser. *
* *
* Description : Initialise la classe des contextes de décompilation Dalkvik. *
* *
@@ -292,8 +298,14 @@ G_DEFINE_TYPE(GDalvikDContext, g_dalvik_dcontext, G_TYPE_DEC_CONTEXT);
* *
******************************************************************************/
-static void g_dalvik_dcontext_class_init(GDalvikDContextClass *klass)
+static void g_dalvik_dcontext_class_init(GDalvikDContextClass *class)
{
+ GObjectClass *object; /* Autre version de la classe */
+
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_dalvik_dcontext_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_dalvik_dcontext_finalize;
}
@@ -326,6 +338,47 @@ static void g_dalvik_dcontext_init(GDalvikDContext *ctx)
/******************************************************************************
* *
+* Paramètres : ctx = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_dcontext_dispose(GDalvikDContext *ctx)
+{
+ if (ctx->this != NULL)
+ g_object_unref(G_OBJECT(ctx->this));
+
+ G_OBJECT_CLASS(g_dalvik_dcontext_parent_class)->dispose(G_OBJECT(ctx));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dalvik_dcontext_finalize(GDalvikDContext *ctx)
+{
+ G_OBJECT_CLASS(g_dalvik_dcontext_parent_class)->finalize(G_OBJECT(ctx));
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : - *
* *
* Description : Crée un contexte pour la décompilation Dalvik. *
@@ -373,8 +426,8 @@ static GDecInstruction *g_dalvik_dcontext_convert_register(GDalvikDContext *ctx,
GBinVariable *this; /* Définition de "this" */
gpointer *found; /* Pseudo-registre trouvé */
- format = G_DEX_FORMAT(g_object_get_data(G_OBJECT(ctx), "format"));
- routine = G_BIN_ROUTINE(g_object_get_data(G_OBJECT(ctx), "routine"));
+ format = G_DEX_FORMAT(G_DEC_CONTEXT(ctx)->format);
+ routine = G_DEC_CONTEXT(ctx)->routine;
method = g_dex_format_find_method_by_address(format, g_binary_routine_get_address(routine));
@@ -386,10 +439,7 @@ static GDecInstruction *g_dalvik_dcontext_convert_register(GDalvikDContext *ctx,
/* Objet "this" */
if (info & DVI_THIS)
{
- if (ctx->this != NULL)
- g_object_ref(G_OBJECT(ctx->this));
-
- else
+ if (ctx->this == NULL)
{
this = g_binary_variable_new(/* FIXME */g_basic_type_new(BTP_OTHER) /* FIXME */);
g_binary_variable_set_name(this, "this");
@@ -399,6 +449,7 @@ static GDecInstruction *g_dalvik_dcontext_convert_register(GDalvikDContext *ctx,
}
+ g_object_ref(G_OBJECT(ctx->this));
result = ctx->this;
}