From 3dada5fbc27777217625603905727364a0cc996d Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 19 Apr 2020 20:36:28 +0200
Subject: Changed the way the key for an architecture is provided.

---
 plugins/arm/v7/processor.c            | 28 ++++++++++++++-
 plugins/dalvik/v35/processor.c        | 29 ++++++++++++++-
 plugins/pychrysalide/arch/processor.c | 66 +++++++++++++++++++++++++++++++++++
 src/arch/processor-int.h              |  7 ++--
 src/arch/processor.c                  | 10 ++++--
 src/arch/processor.h                  |  2 +-
 src/core/processors.c                 | 18 +++++++---
 7 files changed, 147 insertions(+), 13 deletions(-)

diff --git a/plugins/arm/v7/processor.c b/plugins/arm/v7/processor.c
index 61de7b5..078cc2d 100644
--- a/plugins/arm/v7/processor.c
+++ b/plugins/arm/v7/processor.c
@@ -63,6 +63,9 @@ static void g_armv7_processor_dispose(GArmV7Processor *);
 /* Procède à la libération totale de la mémoire. */
 static void g_armv7_processor_finalize(GArmV7Processor *);
 
+/* Fournit la désignation interne du processeur d'architecture. */
+static char *g_armv7_processor_get_key(const GArmV7Processor *);
+
 /* Fournit un contexte pour l'exécution du processeur ARM. */
 static GArmV7Context *g_armv7_processor_get_context(const GArmV7Processor *);
 
@@ -99,7 +102,6 @@ static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass)
 
     proc = G_ARCH_PROCESSOR_CLASS(klass);
 
-    proc->key = "armv7";
     proc->desc = "ARM v7";
 
     proc->endianness = SRE_LITTLE;
@@ -107,6 +109,7 @@ static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass)
     proc->inssize = MDS_32_BITS;
     proc->virt_space = true;
 
+    proc->get_key = (get_processor_key_fc)g_armv7_processor_get_key;
     proc->get_ctx = (get_processor_context_fc)g_armv7_processor_get_context;
 
     proc->disassemble = (disass_instr_fc)g_armv7_processor_disassemble;
@@ -195,6 +198,29 @@ GArmV7Processor *g_armv7_processor_new(void)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : proc = processeur d'architecture à consulter.                *
+*                                                                             *
+*  Description : Fournit la désignation interne du processeur d'architecture. *
+*                                                                             *
+*  Retour      : Simple chaîne de caractères.                                 *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static char *g_armv7_processor_get_key(const GArmV7Processor *proc)
+{
+    char *result;                           /* Désignation à renvoyer      */
+
+    result = strdup("armv7");
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : proc = architecture, spectatrice ici.                        *
 *                                                                             *
 *  Description : Fournit un contexte pour l'exécution du processeur Arm.      *
diff --git a/plugins/dalvik/v35/processor.c b/plugins/dalvik/v35/processor.c
index ad8cb8a..0865ee7 100644
--- a/plugins/dalvik/v35/processor.c
+++ b/plugins/dalvik/v35/processor.c
@@ -64,6 +64,9 @@ static void g_dalvik35_processor_dispose(GDalvik35Processor *);
 /* Procède à la libération totale de la mémoire. */
 static void g_dalvik35_processor_finalize(GDalvik35Processor *);
 
+/* Fournit la désignation interne du processeur d'architecture. */
+static char *g_dalvik35_processor_get_key(const GDalvik35Processor *);
+
 /* Décode une instruction dans un flux de données. */
 static GArchInstruction *g_dalvik35_processor_disassemble(const GArchProcessor *, GDalvikContext *, const GBinContent *, vmpa2t *, GExeFormat *);
 
@@ -97,9 +100,10 @@ static void g_dalvik35_processor_class_init(GDalvik35ProcessorClass *klass)
 
     proc = G_ARCH_PROCESSOR_CLASS(klass);
 
-    proc->key = "dalvik35";
     proc->desc = "Dalvik Virtual Machine v35";
 
+    proc->get_key = (get_processor_key_fc)g_dalvik35_processor_get_key;
+
     proc->disassemble = (disass_instr_fc)g_dalvik35_processor_disassemble;
 
 }
@@ -186,6 +190,29 @@ GArchProcessor *g_dalvik35_processor_new(void)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : proc = processeur d'architecture à consulter.                *
+*                                                                             *
+*  Description : Fournit la désignation interne du processeur d'architecture. *
+*                                                                             *
+*  Retour      : Simple chaîne de caractères.                                 *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static char *g_dalvik35_processor_get_key(const GDalvik35Processor *proc)
+{
+    char *result;                           /* Désignation à renvoyer      */
+
+    result = strdup("dalvik35");
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : proc    = architecture visée par la procédure.               *
 *                ctx     = contexte lié à l'exécution du processeur.          *
 *                content = flux de données à analyser.                        *
diff --git a/plugins/pychrysalide/arch/processor.c b/plugins/pychrysalide/arch/processor.c
index 379df02..f04929e 100644
--- a/plugins/pychrysalide/arch/processor.c
+++ b/plugins/pychrysalide/arch/processor.c
@@ -60,6 +60,9 @@ static void py_arch_processor_init_ginstance(GArchProcessor *, GArchProcessor *)
 /* Initialise une instance sur la base du dérivé de GObject. */
 static int py_arch_processor_init(PyObject *, PyObject *, PyObject *);
 
+/* Fournit la désignation interne du processeur d'architecture. */
+static char *py_arch_processor_get_key_wrapper(const GArchProcessor *);
+
 /* Fournit un contexte propre au processeur d'une architecture. */
 static GProcContext *py_arch_processor_get_context_wrapper(const GArchProcessor *);
 
@@ -225,6 +228,7 @@ static void py_arch_processor_init_gclass(GArchProcessorClass *class, gpointer u
         */
     }
 
+    class->get_key = py_arch_processor_get_key_wrapper;
     class->get_ctx = py_arch_processor_get_context_wrapper;
 
     class->disassemble = py_arch_processor_disassemble_wrapper;
@@ -313,6 +317,68 @@ static int py_arch_processor_init(PyObject *self, PyObject *args, PyObject *kwds
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : proc = processeur d'architecture à consulter.                *
+*                                                                             *
+*  Description : Fournit la désignation interne du processeur d'architecture. *
+*                                                                             *
+*  Retour      : Simple chaîne de caractères.                                 *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static char *py_arch_processor_get_key_wrapper(const GArchProcessor *proc)
+{
+    char *result;                           /* Désignation à renvoyer      */
+    PyGILState_STATE gstate;                /* Sauvegarde d'environnement  */
+    PyObject *pyobj;                        /* Objet Python concerné       */
+    PyObject *pykey;                        /* Clef en objet Python        */
+    int ret;                                /* Bilan d'une conversion      */
+    GArchProcessorClass *class;             /* Classe de l'objet courant   */
+    GArchProcessorClass *parent;            /* Classe parente              */
+
+    result = NULL;
+
+    gstate = PyGILState_Ensure();
+
+    pyobj = pygobject_new(G_OBJECT(proc));
+
+    if (has_python_method(pyobj, "_get_key"))
+    {
+        pykey = run_python_method(pyobj, "_get_key", NULL);
+
+        if (pykey != NULL)
+        {
+            ret = PyUnicode_Check(pykey);
+
+            if (ret)
+                result = strdup(PyUnicode_AsUTF8(pykey));
+
+            Py_DECREF(pykey);
+
+        }
+
+    }
+
+    else
+    {
+        class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+        parent = g_type_class_peek_parent(class);
+
+        if (parent->get_key != NULL)
+            result = parent->get_key(proc);
+
+    }
+
+    PyGILState_Release(gstate);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : proc = architecture visée par la procédure.                  *
 *                                                                             *
 *  Description : Fournit un contexte propre au processeur d'une architecture. *
diff --git a/src/arch/processor-int.h b/src/arch/processor-int.h
index 821ce06..34ba66a 100644
--- a/src/arch/processor-int.h
+++ b/src/arch/processor-int.h
@@ -33,6 +33,9 @@
 #define COV_ALLOC_BLOCK 100
 
 
+/* Fournit la désignation interne du processeur d'architecture. */
+typedef char * (* get_processor_key_fc) (const GArchProcessor *);
+
 /* Fournit un contexte propre au processeur d'une architecture. */
 typedef GProcContext * (* get_processor_context_fc) (const GArchProcessor *);
 
@@ -92,7 +95,6 @@ struct _GArchProcessorClass
 {
     GObjectClass parent;                    /* A laisser en premier        */
 
-    const char *key;                        /* Désignation interne         */
     const char *desc;                       /* Description humaine liée    */
 
     SourceEndian endianness;                /* Boutisme de l'architecture  */
@@ -100,7 +102,8 @@ struct _GArchProcessorClass
     MemoryDataSize inssize;                 /* Taille min. d'encodage      */
     bool virt_space;                        /* Présence d'espace virtuel ? */
 
-    get_processor_context_fc get_ctx;       /* Obtention d'un contexte #1  */
+    get_processor_key_fc get_key;           /* Code représentant la classe */
+    get_processor_context_fc get_ctx;       /* Obtention d'un contexte     */
 
     disass_instr_fc disassemble;            /* Traduction en instructions  */
 
diff --git a/src/arch/processor.c b/src/arch/processor.c
index 777b01e..7dbd8eb 100644
--- a/src/arch/processor.c
+++ b/src/arch/processor.c
@@ -282,14 +282,18 @@ static GProcContext *_g_arch_processor_get_context(const GArchProcessor *proc)
 *                                                                             *
 ******************************************************************************/
 
-const char *g_arch_processor_get_key(const GArchProcessor *proc)
+char *g_arch_processor_get_key(const GArchProcessor *proc)
 {
-    const char *result;                     /* Désignation à renvoyer      */
+    char *result;                           /* Désignation à renvoyer      */
     GArchProcessorClass *class;             /* Classe de l'instance        */
 
     class = G_ARCH_PROCESSOR_GET_CLASS(proc);
 
-    result = class->key;
+    if (class->get_key == NULL)
+        result = NULL;
+
+    else
+        result = class->get_key(proc);
 
     return result;
 
diff --git a/src/arch/processor.h b/src/arch/processor.h
index d3d4623..7edf341 100644
--- a/src/arch/processor.h
+++ b/src/arch/processor.h
@@ -56,7 +56,7 @@ typedef struct _GArchProcessorClass GArchProcessorClass;
 GType g_arch_processor_get_type(void);
 
 /* Fournit la désignation interne du processeur d'architecture. */
-const char *g_arch_processor_get_key(const GArchProcessor *);
+char *g_arch_processor_get_key(const GArchProcessor *);
 
 /* Fournit le nom humain de l'architecture visée. */
 const char *g_arch_processor_get_desc(const GArchProcessor *);
diff --git a/src/core/processors.c b/src/core/processors.c
index 224e9f7..7234365 100644
--- a/src/core/processors.c
+++ b/src/core/processors.c
@@ -98,33 +98,41 @@ bool register_processor_type(GType type)
 {
     bool result;                            /* Bilan à retourner           */
     GArchProcessor *proc;                   /* Instance pour consultation  */
-    const char *key;                        /* Désignation associée        */
+    char *key;                              /* Désignation associée        */
     proc_t *new;                            /* Nouvel élément à définir    */
 
+    result = false;
+
     proc = g_object_new(type, NULL);
 
     key = g_arch_processor_get_key(proc);
+    if (key == NULL) goto done;
+
+    result = (key != NULL);
+
 
     G_LOCK(_pdef_access);
 
     new = find_processor_by_key(key);
 
-    result = (new == NULL);
-
-    if (result)
+    if (new == NULL)
     {
         _processors_definitions = realloc(_processors_definitions,
                                           ++_processors_definitions_count * sizeof(proc_t));
 
         new = &_processors_definitions[_processors_definitions_count - 1];
 
-        new->key = strdup(key);
+        new->key = key;
         new->type = type;
 
+        result = true;
+
     }
 
     G_UNLOCK(_pdef_access);
 
+ done:
+
     g_object_unref(G_OBJECT(proc));
 
     return result;
-- 
cgit v0.11.2-87-g4458