diff options
Diffstat (limited to 'src/decomp/context.c')
-rw-r--r-- | src/decomp/context.c | 54 |
1 files changed, 5 insertions, 49 deletions
diff --git a/src/decomp/context.c b/src/decomp/context.c index 15215eb..9db0bca 100644 --- a/src/decomp/context.c +++ b/src/decomp/context.c @@ -27,39 +27,13 @@ #include <malloc.h> +#include "context-int.h" #include "instruction-int.h" -#include "expr/pseudo.h" #include "../arch/operand.h" -#include "../glibext/gnhash.h" +#include "../format/dex/method.h" -/* Définition d'une context décompilée (instance) */ -struct _GDecContext -{ - GObject parent; /* A laisser en premier */ - - vmpa_t max; /* Première adresse à écarter */ - - GDecInstruction *list; /* Chaîne décompilée */ - - GHashTable *machine; /* Correspondance reg./pseudo */ - GHashTable *ssa; /* Remplacement des pseudos */ - - GDecInstruction **pseudos; /* Liste des pseudos-registre */ - size_t count; /* Taille de cette liste */ - -}; - - -/* Définition d'une context décompilée (classe) */ -struct _GDecContextClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; - - /* Initialise la classe des contextes de décompilation. */ static void g_dec_context_class_init(GDecContextClass *); @@ -216,6 +190,7 @@ void g_dec_context_set_decomp_instrs(GDecContext *ctx, GDecInstruction *instr) * * * Paramètres : ctx = instance à consulter, voire mettre à jour. * * operand = opérande représentant un registre quelconque. * +* assign = précise le sort prochain du registre. * * * * Description : Convertit un registre machine en un pseudo-registre. * * * @@ -225,27 +200,8 @@ void g_dec_context_set_decomp_instrs(GDecContext *ctx, GDecInstruction *instr) * * ******************************************************************************/ -GDecInstruction *g_dec_context_convert_register(GDecContext *ctx, gpointer operand) +GDecInstruction *g_dec_context_convert_register(GDecContext *ctx, gpointer operand, bool assign) { - GDecInstruction *result; /* Instance à retourner */ - gpointer *found; /* Pseudo-registre trouvé */ - - found = g_hash_table_lookup(ctx->machine, operand); - - if (found != NULL) result = G_DEC_INSTRUCTION(found); - else - { - result = g_pseudo_register_new(); - g_pseudo_register_set_index(G_PSEUDO_REGISTER(result), ctx->count); - - g_hash_table_insert(ctx->machine, operand, result); - - ctx->pseudos = (GDecInstruction **)realloc(ctx->pseudos, - ++ctx->count * sizeof(GDecInstruction *)); - ctx->pseudos[ctx->count - 1] = result; - - } - - return result; + return ctx->convert_reg(ctx, operand, assign); } |