diff options
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 *); | 
