diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2013-01-17 22:21:03 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2013-01-17 22:21:03 (GMT) |
commit | a9bbd894bd25f7c2bb72fb7d4064b19377d90c6d (patch) | |
tree | d430c135864caa960c71ed86c5713507de66f708 /src/decomp | |
parent | 2ab78407e9f73b6508afc281400a7c3fc018217f (diff) |
Forked the decompilation context when needed.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@325 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/decomp')
-rw-r--r-- | src/decomp/context-int.h | 12 | ||||
-rw-r--r-- | src/decomp/context.c | 34 | ||||
-rw-r--r-- | src/decomp/context.h | 4 |
3 files changed, 42 insertions, 8 deletions
diff --git a/src/decomp/context-int.h b/src/decomp/context-int.h index 8139077..7e5b1b0 100644 --- a/src/decomp/context-int.h +++ b/src/decomp/context-int.h @@ -33,6 +33,9 @@ +/* Duplique un contexte de compilation. */ +typedef GDecContext * (* dup_dec_context_fc) (GDecContext *); + /* Convertit un registre machine en un pseudo-registre. */ typedef GDecInstruction * (* convert_register_fc) (GDecContext *, gpointer, bool); @@ -42,13 +45,14 @@ struct _GDecContext { GObject parent; /* A laisser en premier */ + dup_dec_context_fc dup; /* Duplication de contexte */ + convert_register_fc convert_reg; /* Traduction des registres */ + GExeFormat *format; /* Format binaire concerné */ GBinRoutine *routine; /* Routine visée par l'opérat° */ GDecInstruction *list; /* Chaîne décompilée */ - convert_register_fc convert_reg; /* Traduction des registres */ - }; @@ -60,5 +64,9 @@ struct _GDecContextClass }; +/* Duplique partiellement un contexte de compilation. */ +void _g_dec_context_dup(GDecContext *, GDecContext *); + + #endif /* _DECOMP_CONTEXT_INT_H */ diff --git a/src/decomp/context.c b/src/decomp/context.c index 6905505..025c0d2 100644 --- a/src/decomp/context.c +++ b/src/decomp/context.c @@ -139,9 +139,35 @@ static void g_dec_context_finalize(GDecContext *ctx) /****************************************************************************** * * -* Paramètres : - * +* Paramètres : dest = contexte de compilation à définir. * +* src = contexte de compilation à copier. * * * -* Description : Met en place un nouveau contexte de décompilation. * +* Description : Duplique partiellement un contexte de compilation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void _g_dec_context_dup(GDecContext *dest, GDecContext *src) +{ + if (src->routine != NULL) + g_object_ref(G_OBJECT(src->routine)); + if (src->format != NULL) + g_object_ref(G_OBJECT(src->format)); + + dest->routine = src->routine; + dest->format = src->format; + +} + + +/****************************************************************************** +* * +* Paramètres : orig = contexte de compilation à copier. * +* * +* Description : Duplique un contexte de compilation. * * * * Retour : Contexte de décompilation prêt à emploi. * * * @@ -149,11 +175,11 @@ static void g_dec_context_finalize(GDecContext *ctx) * * ******************************************************************************/ -GDecContext *g_dec_context_new(void) +GDecContext *g_dec_context_dup(GDecContext *orig) { GDecContext *result; /* Instance à retourner */ - result = g_object_new(G_TYPE_DEC_CONTEXT, NULL); + result = orig->dup(orig); return result; diff --git a/src/decomp/context.h b/src/decomp/context.h index 2daff91..94b3270 100644 --- a/src/decomp/context.h +++ b/src/decomp/context.h @@ -65,8 +65,8 @@ typedef struct _GDecContextClass GDecContextClass; /* Indique le type défini pour un contexte de décompilation. */ GType g_dec_context_get_type(void); -/* Met en place un nouveau contexte de décompilation. */ -GDecContext *g_dec_context_new(void); +/* Duplique un contexte de compilation. */ +GDecContext *g_dec_context_dup(GDecContext *); /* Définit les informations essentielles à la décompilation. */ void g_dec_context_set_info(GDecContext *, GBinRoutine *, GExeFormat *); |