summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-04-19 18:36:28 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-04-19 18:36:28 (GMT)
commit3dada5fbc27777217625603905727364a0cc996d (patch)
tree0ff4b94aca92e64a9e01594b4421f86465560395 /src
parentfad679ef8cd654646c9234ff8fd39507adad9b8e (diff)
Changed the way the key for an architecture is provided.
Diffstat (limited to 'src')
-rw-r--r--src/arch/processor-int.h7
-rw-r--r--src/arch/processor.c10
-rw-r--r--src/arch/processor.h2
-rw-r--r--src/core/processors.c18
4 files changed, 26 insertions, 11 deletions
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;