From 00e93226e72bdb18853580f553e32df111422936 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 13 May 2019 00:09:53 +0200
Subject: Simplified the way processors are registered.

---
 plugins/arm/v7/core.c                    |  2 +-
 plugins/arm/v7/processor.c               | 21 ++++----
 plugins/dalvik/processor.c               | 13 ++---
 plugins/dalvik/v35/core.c                |  2 +-
 plugins/dalvik/v35/processor.c           |  3 ++
 plugins/pychrysalide/arch/processor.c    | 33 +++++++-----
 plugins/pychrysalide/core/processors.c   | 63 +++--------------------
 plugins/pychrysalide/format/executable.c |  2 +-
 plugins/ropgadgets/finder.c              |  2 +-
 src/analysis/binary.c                    | 15 +++---
 src/arch/processor-int.h                 | 13 +++--
 src/arch/processor.c                     | 88 ++++++++++++++++++++++++++++++--
 src/arch/processor.h                     |  6 +++
 src/core/processors.c                    | 84 ++++++++++--------------------
 src/core/processors.h                    |  7 +--
 15 files changed, 183 insertions(+), 171 deletions(-)

diff --git a/plugins/arm/v7/core.c b/plugins/arm/v7/core.c
index 5fd355c..6849171 100644
--- a/plugins/arm/v7/core.c
+++ b/plugins/arm/v7/core.c
@@ -106,7 +106,7 @@ bool init_armv7_core(void)
 
     register_armv7_gtypes();
 
-    result = register_processor_type("armv7", "ARM v7", G_TYPE_ARMV7_PROCESSOR);
+    result = register_processor_type(G_TYPE_ARMV7_PROCESSOR);
 
     return result;
 
diff --git a/plugins/arm/v7/processor.c b/plugins/arm/v7/processor.c
index b7a73f4..fca1415 100644
--- a/plugins/arm/v7/processor.c
+++ b/plugins/arm/v7/processor.c
@@ -96,11 +96,20 @@ static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass)
     GArchProcessorClass *proc;              /* Encore une autre vision...  */
 
     object_class = G_OBJECT_CLASS(klass);
-    proc = G_ARCH_PROCESSOR_CLASS(klass);
 
     object_class->dispose = (GObjectFinalizeFunc/* ! */)g_armv7_processor_dispose;
     object_class->finalize = (GObjectFinalizeFunc)g_armv7_processor_finalize;
 
+    proc = G_ARCH_PROCESSOR_CLASS(klass);
+
+    proc->key = "armv7";
+    proc->desc = "ARM v7";
+
+    proc->endianness = SRE_LITTLE;
+    proc->memsize = MDS_32_BITS;
+    proc->inssize = MDS_32_BITS;
+    proc->virt_space = true;
+
     proc->get_ctx = (get_processor_context_fc)g_armv7_processor_get_context;
 
     proc->disassemble = (disass_instr_fc)g_armv7_processor_disassemble;
@@ -122,14 +131,6 @@ static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass)
 
 static void g_armv7_processor_init(GArmV7Processor *proc)
 {
-    GArchProcessor *parent;                 /* Instance parente            */
-
-    parent = G_ARCH_PROCESSOR(proc);
-
-    parent->endianness = SRE_LITTLE;
-    parent->memsize = MDS_32_BITS;
-    parent->inssize = MDS_32_BITS;
-    parent->virt_space = true;
 
 }
 
@@ -238,7 +239,7 @@ static GArchInstruction *g_armv7_processor_disassemble(const GArmV7Processor *pr
     uint32_t raw32;                         /* Donnée 32 bits à analyser   */
     ArmV7InstrSet iset;                     /* Type de jeu d'instructions  */
 
-    endian = G_ARCH_PROCESSOR(proc)->endianness;
+    endian = G_ARCH_PROCESSOR_GET_CLASS(proc)->endianness;
 
     iset = g_armv7_context_find_encoding(ctx, get_virt_addr(pos));
 
diff --git a/plugins/dalvik/processor.c b/plugins/dalvik/processor.c
index 5c5ecb6..429c431 100644
--- a/plugins/dalvik/processor.c
+++ b/plugins/dalvik/processor.c
@@ -83,6 +83,11 @@ static void g_dalvik_processor_class_init(GDalvikProcessorClass *klass)
 
     proc = G_ARCH_PROCESSOR_CLASS(klass);
 
+    proc->endianness = SRE_LITTLE;
+    proc->memsize = MDS_32_BITS;
+    proc->inssize = MDS_16_BITS;
+    proc->virt_space = false;
+
     proc->get_ctx = (get_processor_context_fc)g_dalvik_processor_get_context;
 
 }
@@ -102,14 +107,6 @@ static void g_dalvik_processor_class_init(GDalvikProcessorClass *klass)
 
 static void g_dalvik_processor_init(GDalvikProcessor *proc)
 {
-    GArchProcessor *parent;                 /* Instance parente            */
-
-    parent = G_ARCH_PROCESSOR(proc);
-
-    parent->endianness = SRE_LITTLE;
-    parent->memsize = MDS_32_BITS;
-    parent->inssize = MDS_16_BITS;
-    parent->virt_space = false;
 
 }
 
diff --git a/plugins/dalvik/v35/core.c b/plugins/dalvik/v35/core.c
index 7e36691..1ecaf82 100644
--- a/plugins/dalvik/v35/core.c
+++ b/plugins/dalvik/v35/core.c
@@ -74,7 +74,7 @@ bool init_dalvik35_core(void)
 
     register_dalvik35_gtypes();
 
-    result = register_processor_type("dalvik35", "Dalvik Virtual Machine v35", G_TYPE_DALVIK35_PROCESSOR);
+    result = register_processor_type(G_TYPE_DALVIK35_PROCESSOR);
 
     return result;
 
diff --git a/plugins/dalvik/v35/processor.c b/plugins/dalvik/v35/processor.c
index b1c13d2..507373b 100644
--- a/plugins/dalvik/v35/processor.c
+++ b/plugins/dalvik/v35/processor.c
@@ -97,6 +97,9 @@ 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->disassemble = (disass_instr_fc)g_dalvik35_processor_disassemble;
 
 }
diff --git a/plugins/pychrysalide/arch/processor.c b/plugins/pychrysalide/arch/processor.c
index 94ba7df..f356a91 100644
--- a/plugins/pychrysalide/arch/processor.c
+++ b/plugins/pychrysalide/arch/processor.c
@@ -208,6 +208,23 @@ static PyObject *py_arch_processor_new(PyTypeObject *type, PyObject *args, PyObj
 
 static void py_arch_processor_init_gclass(GArchProcessorClass *class, gpointer unused)
 {
+    GType type;                             /* Type d'instances concerné   */
+    GArchProcessor *pattern;                /* Patron de données à copier  */
+
+    type = G_TYPE_FROM_CLASS(class);
+
+    pattern = get_dynamic_type_pattern(type);
+
+    if (pattern != NULL)
+    {
+        /*
+        class->endianness = pattern->endianness;
+        class->memsize = pattern->memsize;
+        class->inssize = pattern->inssize;
+        class->virt_space = pattern->virt_space;
+        */
+    }
+
     class->get_ctx = py_arch_processor_get_context_wrapper;
 
     class->disassemble = py_arch_processor_disassemble_wrapper;
@@ -230,20 +247,6 @@ static void py_arch_processor_init_gclass(GArchProcessorClass *class, gpointer u
 
 static void py_arch_processor_init_ginstance(GArchProcessor *proc, GArchProcessor *class)
 {
-    GType type;                             /* Type d'instances concerné   */
-    GArchProcessor *pattern;                /* Patron de données à copier  */
-
-    type = G_TYPE_FROM_INSTANCE(proc);
-
-    pattern = get_dynamic_type_pattern(type);
-
-    if (pattern != NULL)
-    {
-        proc->endianness = pattern->endianness;
-        proc->memsize = pattern->memsize;
-        proc->inssize = pattern->inssize;
-        proc->virt_space = pattern->virt_space;
-    }
 
 }
 
@@ -294,10 +297,12 @@ static int py_arch_processor_init(PyObject *self, PyObject *args, PyObject *kwds
 
     proc = G_ARCH_PROCESSOR(pygobject_get(self));
 
+    /*
     proc->endianness = endianness;
     proc->memsize = mem_size;
     proc->inssize = ins_min_size;
     proc->virt_space = vspace;
+    */
 
     register_dynamic_type_pattern(G_OBJECT(proc));
 
diff --git a/plugins/pychrysalide/core/processors.c b/plugins/pychrysalide/core/processors.c
index 56498f3..47e4643 100644
--- a/plugins/pychrysalide/core/processors.c
+++ b/plugins/pychrysalide/core/processors.c
@@ -43,11 +43,8 @@
 /* Enregistre un processeur pour une architecture donnée. */
 static PyObject *py_processors_register_type(PyObject *, PyObject *);
 
-/* Fournit le nom humain de l'architecture visée. */
-static PyObject *py_processors_get_description(PyObject *, PyObject *);
-
 /* Fournit le processeur d'architecture correspondant à un nom. */
-static PyObject *py_processors_get_for_name(PyObject *, PyObject *);
+static PyObject *py_processors_get_for_key(PyObject *, PyObject *);
 
 
 
@@ -67,8 +64,6 @@ static PyObject *py_processors_get_for_name(PyObject *, PyObject *);
 static PyObject *py_processors_register_type(PyObject *self, PyObject *args)
 {
     PyObject *result;                       /* Bilan à retourner           */
-    const char *name;                       /* Nom technique de processeur */
-    const char *desc;                       /* description humaine liée    */
     PyObject *type;                         /* Type d'une instance future  */
     int ret;                                /* Bilan de lecture des args.  */
     PyObject *new_args;                     /* Nouveaux arguments épurés   */
@@ -77,7 +72,7 @@ static PyObject *py_processors_register_type(PyObject *self, PyObject *args)
     GType instance;                         /* Type pour futures instances */
     bool status;                            /* Bilan d'un enregistrement   */
 
-    ret = PyArg_ParseTuple(args, "ssO!", &name, &desc, &PyType_Type, &type);
+    ret = PyArg_ParseTuple(args, "O!", &PyType_Type, &type);
     if (!ret) return NULL;
 
     ret = PyObject_IsSubclass(type, (PyObject *)get_python_arch_processor_type());;
@@ -112,7 +107,7 @@ static PyObject *py_processors_register_type(PyObject *self, PyObject *args)
 
     Py_DECREF(dummy);
 
-    status = register_processor_type(name, desc, instance);
+    status = register_processor_type(instance);
 
     result = status ? Py_True : Py_False;
     Py_INCREF(result);
@@ -127,45 +122,6 @@ static PyObject *py_processors_register_type(PyObject *self, PyObject *args)
 *  Paramètres  : self = objet Python concerné par l'appel.                    *
 *                args = arguments fournis à l'appel.                          *
 *                                                                             *
-*  Description : Fournit le nom humain de l'architecture visée.               *
-*                                                                             *
-*  Retour      : Désignation humaine trouvée ou NULL.                         *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static PyObject *py_processors_get_description(PyObject *self, PyObject *args)
-{
-    PyObject *result;                       /* Bilan à retourner           */
-    const char *name;                       /* Nom technique de processeur */
-    int ret;                                /* Bilan de lecture des args.  */
-    const char *desc;                       /* Description humaine obtenue */
-
-    ret = PyArg_ParseTuple(args, "s", &name);
-    if (!ret) return NULL;
-
-    desc = get_arch_processor_description(name);
-
-    if (desc != NULL)
-        result = PyUnicode_FromString(desc);
-
-    else
-    {
-        result = Py_None;
-        Py_INCREF(result);
-    }
-
-    return result;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : self = objet Python concerné par l'appel.                    *
-*                args = arguments fournis à l'appel.                          *
-*                                                                             *
 *  Description : Fournit le processeur d'architecture correspondant à un nom. *
 *                                                                             *
 *  Retour      : Processeur d'architecture trouvé.                            *
@@ -174,7 +130,7 @@ static PyObject *py_processors_get_description(PyObject *self, PyObject *args)
 *                                                                             *
 ******************************************************************************/
 
-static PyObject *py_processors_get_for_name(PyObject *self, PyObject *args)
+static PyObject *py_processors_get_for_key(PyObject *self, PyObject *args)
 {
     PyObject *result;                       /* Bilan à retourner           */
     const char *name;                       /* Nom technique de processeur */
@@ -184,7 +140,7 @@ static PyObject *py_processors_get_for_name(PyObject *self, PyObject *args)
     ret = PyArg_ParseTuple(args, "s", &name);
     if (!ret) return NULL;
 
-    proc = get_arch_processor_for_name(name);
+    proc = get_arch_processor_for_key(name);
 
     if (proc != NULL)
     {
@@ -226,14 +182,9 @@ bool populate_core_module_with_processors(void)
             "register_processor(name, desc, cls, /)\n--\n\nRegister an an architecture processor by its name, description and class type."
         },
         {
-            "get_processor_description", py_processors_get_description,
-            METH_VARARGS,
-            "get_processor_description(name, /)\n--\n\nProvide the description of a given architecture processor."
-        },
-        {
-            "get_processor_for_name", py_processors_get_for_name,
+            "get_processor_for_key", py_processors_get_for_key,
             METH_VARARGS,
-            "get_processor_for_name(name, /)\n--\n\nProvide an instance of an architecture processor for a given name."
+            "get_processor_for_key(name, /)\n--\n\nProvide an instance of an architecture processor for a given name."
         },
         { NULL }
 
diff --git a/plugins/pychrysalide/format/executable.c b/plugins/pychrysalide/format/executable.c
index 5621d26..f49a459 100644
--- a/plugins/pychrysalide/format/executable.c
+++ b/plugins/pychrysalide/format/executable.c
@@ -361,7 +361,7 @@ int convert_to_vmpa_using_executable(PyObject *obj, exe_cv_info_t *info)
     {
         arch = g_exe_format_get_target_machine(info->format);
 
-        conv.proc = get_arch_processor_for_name(arch);
+        conv.proc = get_arch_processor_for_key(arch);
 
         if (conv.proc != NULL)
         {
diff --git a/plugins/ropgadgets/finder.c b/plugins/ropgadgets/finder.c
index b9a4500..5d0e9c2 100644
--- a/plugins/ropgadgets/finder.c
+++ b/plugins/ropgadgets/finder.c
@@ -387,7 +387,7 @@ found_rop_list *list_all_gadgets(GExeFormat *format, unsigned int max_depth, upd
     domain.content = g_binary_format_get_content(G_BIN_FORMAT(format));
 
     target = g_exe_format_get_target_machine(format);
-    domain.proc = get_arch_processor_for_name(target);
+    domain.proc = get_arch_processor_for_key(target);
 
     bool collect_x_ranges(GBinPortion *portion, GBinPortion *parent, BinaryPortionVisit visit, void *unused)
     {
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index 2bcc88d..cfb4ea0 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -1701,8 +1701,8 @@ static bool g_loaded_binary_analyze(GLoadedBinary *binary, bool cache, wgroup_id
 {
     bool result;                            /* Bilan à retourner           */
     GBinFormat *format;                     /* Format lié au binaire       */
-    const char *desc;                       /* Description humaine associée*/
     const char *arch;                       /* Architecture d'exécution    */
+    const char *desc;                       /* Description humaine associée*/
     bool has_virt;                          /* Présence de virtuel ?       */
     GProcContext *context;                  /* Contexte de suivi dédié     */
     GWidthTracker *tracker;                 /* Gestionnaire de largeur     */
@@ -1724,26 +1724,27 @@ static bool g_loaded_binary_analyze(GLoadedBinary *binary, bool cache, wgroup_id
     /* Architecture visée */
 
     arch = g_exe_format_get_target_machine(binary->format);
-    desc = get_arch_processor_description(arch);
 
-    if (desc == NULL)
+    if (arch == NULL)
     {
         log_simple_message(LMT_INFO, _("Unknown architecture"));
         result = false;
         goto glba_exit;
     }
-    else
-        log_variadic_message(LMT_INFO, _("Detected architecture: %s"), desc);
 
-    binary->proc = get_arch_processor_for_name(arch);
+    binary->proc = get_arch_processor_for_key(arch);
 
     if (binary->proc == NULL)
     {
-        log_simple_message(LMT_ERROR, _("Unable to load the required processor"));
+        log_variadic_message(LMT_ERROR, _("Unable to load the required processor (%s)"), arch);
         result = false;
         goto glba_exit;
     }
 
+    desc = g_arch_processor_get_desc(binary->proc);
+
+    log_variadic_message(LMT_INFO, _("Detected architecture: %s"), desc);
+
     g_signal_connect(binary->proc, "changed", G_CALLBACK(on_binary_processor_changed), binary);
 
     has_virt = g_arch_processor_has_virtual_space(binary->proc);
diff --git a/src/arch/processor-int.h b/src/arch/processor-int.h
index 475fadc..d29539b 100644
--- a/src/arch/processor-int.h
+++ b/src/arch/processor-int.h
@@ -66,11 +66,6 @@ struct _GArchProcessor
 {
     GObject parent;                         /* A laisser en premier        */
 
-    SourceEndian endianness;                /* Boutisme de l'architecture  */
-    MemoryDataSize memsize;                 /* Taille de l'espace mémoire  */
-    MemoryDataSize inssize;                 /* Taille min. d'encodage      */
-    bool virt_space;                        /* Présence d'espace virtuel ? */
-
     GArchInstruction **instructions;        /* Instructions désassemblées  */
     size_t instr_count;                     /* Taille de la liste aplatie  */
     unsigned int stamp;                     /* Marque de suivi des modifs  */
@@ -97,6 +92,14 @@ 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  */
+    MemoryDataSize memsize;                 /* Taille de l'espace mémoire  */
+    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  */
 
     disass_instr_fc disassemble;            /* Traduction en instructions  */
diff --git a/src/arch/processor.c b/src/arch/processor.c
index dccd12e..644a1ca 100644
--- a/src/arch/processor.c
+++ b/src/arch/processor.c
@@ -275,6 +275,58 @@ static GProcContext *_g_arch_processor_get_context(const GArchProcessor *proc)
 *                                                                             *
 *  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   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+const char *g_arch_processor_get_key(const GArchProcessor *proc)
+{
+    const char *result;                     /* Désignation à renvoyer      */
+    GArchProcessorClass *class;             /* Classe de l'instance        */
+
+    class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+
+    result = class->key;
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : proc = processeur d'architecture à consulter.                *
+*                                                                             *
+*  Description : Fournit le nom humain de l'architecture visée.               *
+*                                                                             *
+*  Retour      : Désignation humaine associée au processeur.                  *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+const char *g_arch_processor_get_desc(const GArchProcessor *proc)
+{
+    const char *result;                     /* Désignation à renvoyer      */
+    GArchProcessorClass *class;             /* Classe de l'instance        */
+
+    class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+
+    result = class->desc;
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : proc = processeur d'architecture à consulter.                *
+*                                                                             *
 *  Description : Fournit le boustime du processeur d'une architecture.        *
 *                                                                             *
 *  Retour      : Boutisme associé au processeur.                              *
@@ -285,7 +337,14 @@ static GProcContext *_g_arch_processor_get_context(const GArchProcessor *proc)
 
 SourceEndian g_arch_processor_get_endianness(const GArchProcessor *proc)
 {
-    return proc->endianness;
+    SourceEndian result;                    /* Boutisme à retourner        */
+    GArchProcessorClass *class;             /* Classe de l'instance        */
+
+    class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+
+    result = class->endianness;
+
+    return result;
 
 }
 
@@ -304,7 +363,14 @@ SourceEndian g_arch_processor_get_endianness(const GArchProcessor *proc)
 
 MemoryDataSize g_arch_processor_get_memory_size(const GArchProcessor *proc)
 {
-    return proc->memsize;
+    MemoryDataSize result;                  /* Taille  à retourner         */
+    GArchProcessorClass *class;             /* Classe de l'instance        */
+
+    class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+
+    result = class->memsize;
+
+    return result;
 
 }
 
@@ -323,7 +389,14 @@ MemoryDataSize g_arch_processor_get_memory_size(const GArchProcessor *proc)
 
 MemoryDataSize g_arch_processor_get_instruction_min_size(const GArchProcessor *proc)
 {
-    return proc->inssize;
+    MemoryDataSize result;                  /* Taille  à retourner         */
+    GArchProcessorClass *class;             /* Classe de l'instance        */
+
+    class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+
+    result = class->inssize;
+
+    return result;
 
 }
 
@@ -342,7 +415,14 @@ MemoryDataSize g_arch_processor_get_instruction_min_size(const GArchProcessor *p
 
 bool g_arch_processor_has_virtual_space(const GArchProcessor *proc)
 {
-    return proc->virt_space;
+    bool result;                            /* Indication à retourner      */
+    GArchProcessorClass *class;             /* Classe de l'instance        */
+
+    class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+
+    result = class->virt_space;
+
+    return result;
 
 }
 
diff --git a/src/arch/processor.h b/src/arch/processor.h
index 26eddb1..0b33a50 100644
--- a/src/arch/processor.h
+++ b/src/arch/processor.h
@@ -55,6 +55,12 @@ typedef struct _GArchProcessorClass GArchProcessorClass;
 /* Indique le type défini pour un processeur d'architecture. */
 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 *);
+
+/* Fournit le nom humain de l'architecture visée. */
+const char *g_arch_processor_get_desc(const GArchProcessor *);
+
 /* Fournit le boustime du processeur d'une architecture. */
 SourceEndian g_arch_processor_get_endianness(const GArchProcessor *);
 
diff --git a/src/core/processors.c b/src/core/processors.c
index 631e819..42d4e4b 100644
--- a/src/core/processors.c
+++ b/src/core/processors.c
@@ -40,9 +40,8 @@
 /* Caractéristiques d'un processeur */
 typedef struct _proc_t
 {
-    char *name;                             /* Clef pour un accès rapide   */
-    char *desc;                             /* Désignation humaine         */
-    GType instance;                         /* Type à manipuler en interne */
+    char *key;                              /* Clef pour un accès rapide   */
+    GType type;                             /* Type à manipuler en interne */
 
 } proc_t;
 
@@ -85,9 +84,7 @@ void register_arch_gtypes(void)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : name     = désignation rapide et interne d'un processeur.    *
-*                desc     = désignation humaine de l'architecture.            *
-*                instance = type GLib représentant le type à instancier.      *
+*  Paramètres  : type = type GLib représentant le type à instancier.          *
 *                                                                             *
 *  Description : Enregistre un processeur pour une architecture donnée.       *
 *                                                                             *
@@ -97,32 +94,39 @@ void register_arch_gtypes(void)
 *                                                                             *
 ******************************************************************************/
 
-bool register_processor_type(const char *name, const char *desc, GType instance)
+bool register_processor_type(GType type)
 {
     bool result;                            /* Bilan à retourner           */
+    GArchProcessor *proc;                   /* Instance pour consultation  */
+    const char *key;                        /* Désignation associée        */
     proc_t *new;                            /* Nouvel élément à définir    */
 
+    proc = g_object_new(type, NULL);
+
+    key = g_arch_processor_get_key(proc);
+
     G_LOCK(_pdef_access);
 
-    new = find_processor_by_key(name);
+    new = find_processor_by_key(key);
 
     result = (new == NULL);
 
     if (result)
     {
-        _processors_definitions = (proc_t *)realloc(_processors_definitions,
-                                                    ++_processors_definitions_count * sizeof(proc_t));
+        _processors_definitions = realloc(_processors_definitions,
+                                          ++_processors_definitions_count * sizeof(proc_t));
 
         new = &_processors_definitions[_processors_definitions_count - 1];
 
-        new->name = strdup(name);
-        new->desc = strdup(desc);
-        new->instance = instance;
+        new->key = strdup(key);
+        new->type = type;
 
     }
 
     G_UNLOCK(_pdef_access);
 
+    g_object_unref(G_OBJECT(proc));
+
     return result;
 
 }
@@ -147,10 +151,7 @@ void unload_processors_definitions(void)
     G_LOCK(_pdef_access);
 
     for (i = 0; i < _processors_definitions_count; i++)
-    {
-        free(_processors_definitions[i].name);
-        free(_processors_definitions[i].desc);
-    }
+        free(_processors_definitions[i].key);
 
     if (_processors_definitions != NULL)
         free(_processors_definitions);
@@ -165,7 +166,7 @@ void unload_processors_definitions(void)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : name = nom technique du processeur recherché.                *
+*  Paramètres  : key = nom technique du processeur recherché.                 *
 *                                                                             *
 *  Description : Retrouve l'enregistrement correspondant à une architecture.  *
 *                                                                             *
@@ -175,7 +176,7 @@ void unload_processors_definitions(void)
 *                                                                             *
 ******************************************************************************/
 
-static proc_t *find_processor_by_key(const char *name)
+static proc_t *find_processor_by_key(const char *key)
 {
     proc_t *result;                         /* Trouvaille à retourner      */
     size_t i;                               /* Boucle de parcours          */
@@ -186,9 +187,9 @@ static proc_t *find_processor_by_key(const char *name)
 
     result = NULL;
 
-    if (name != NULL)
+    if (key != NULL)
         for (i = 0; i < _processors_definitions_count; i++)
-            if (strcmp(_processors_definitions[i].name, name) == 0)
+            if (strcmp(_processors_definitions[i].key, key) == 0)
                 result = &_processors_definitions[i];
 
     return result;
@@ -198,40 +199,7 @@ static proc_t *find_processor_by_key(const char *name)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : name = nom technique du processeur recherché.                *
-*                                                                             *
-*  Description : Fournit le nom humain de l'architecture visée.               *
-*                                                                             *
-*  Retour      : Désignation humaine trouvée ou NULL.                         *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-const char *get_arch_processor_description(const char *name)
-{
-    const char *result;                     /* Description à retourner     */
-    proc_t *def;                            /* Définition d'architecture   */
-
-    G_LOCK(_pdef_access);
-
-    def = find_processor_by_key(name);
-
-    if (def == NULL)
-        result = NULL;
-    else
-        result = def->desc;
-
-    G_UNLOCK(_pdef_access);
-
-    return result;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : name = nom technique du processeur recherché.                *
+*  Paramètres  : key = nom technique du processeur recherché.                 *
 *                                                                             *
 *  Description : Fournit le processeur d'architecture correspondant à un nom. *
 *                                                                             *
@@ -241,19 +209,19 @@ const char *get_arch_processor_description(const char *name)
 *                                                                             *
 ******************************************************************************/
 
-GArchProcessor *get_arch_processor_for_name(const char *name)
+GArchProcessor *get_arch_processor_for_key(const char *key)
 {
     GArchProcessor *result;                 /* Instance à retourner        */
     proc_t *def;                            /* Définition d'architecture   */
 
     G_LOCK(_pdef_access);
 
-    def = find_processor_by_key(name);
+    def = find_processor_by_key(key);
 
     if (def == NULL)
         result = NULL;
     else
-        result = g_object_new(def->instance, NULL);
+        result = g_object_new(def->type, NULL);
 
     G_UNLOCK(_pdef_access);
 
diff --git a/src/core/processors.h b/src/core/processors.h
index 975c716..034f219 100644
--- a/src/core/processors.h
+++ b/src/core/processors.h
@@ -36,16 +36,13 @@
 void register_arch_gtypes(void);
 
 /* Enregistre un processeur pour une architecture donnée. */
-bool register_processor_type(const char *, const char *, GType);
+bool register_processor_type(GType);
 
 /* Décharge toutes les définitions de processeurs. */
 void unload_processors_definitions(void);
 
-/* Fournit le nom humain de l'architecture visée. */
-const char *get_arch_processor_description(const char *);
-
 /* Fournit le processeur d'architecture correspondant à un nom. */
-GArchProcessor *get_arch_processor_for_name(const char *);
+GArchProcessor *get_arch_processor_for_key(const char *);
 
 
 
-- 
cgit v0.11.2-87-g4458