summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2021-11-30 01:56:58 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2021-11-30 01:56:58 (GMT)
commitde06b3ebc7021c20d94013bd39f4ba2c2e5ce3fa (patch)
tree463af79c1045e4180958d9ef9d0af33d3eebf7b9 /src
parent7101133d0e862d2296d9709dc6ef1e64ebbc2ea0 (diff)
Access demanglers by key.
Diffstat (limited to 'src')
-rw-r--r--src/core/demanglers.c31
-rw-r--r--src/core/demanglers.h2
-rw-r--r--src/core/processors.c5
-rw-r--r--src/mangling/demangler-int.h4
-rw-r--r--src/mangling/demangler.c36
-rw-r--r--src/mangling/demangler.h3
6 files changed, 71 insertions, 10 deletions
diff --git a/src/core/demanglers.c b/src/core/demanglers.c
index 400fd44..0eb4e36 100644
--- a/src/core/demanglers.c
+++ b/src/core/demanglers.c
@@ -32,7 +32,7 @@
typedef struct _demangler_t
{
char *key; /* Clef pour un accès rapide */
- GType instance; /* Type à manipuler en interne */
+ GType type; /* Type à manipuler en interne */
} demangler_t;
@@ -52,8 +52,7 @@ static demangler_t *find_demangler_by_key(const char *);
/******************************************************************************
* *
-* Paramètres : key = désignation rapide et interne d'un décodeur. *
-* instance = type GLib représentant le type à instancier. *
+* Paramètres : type = type GLib représentant le type à instancier. *
* *
* Description : Enregistre un décodeur répondant à une appellation donnée. *
* *
@@ -63,18 +62,28 @@ static demangler_t *find_demangler_by_key(const char *);
* *
******************************************************************************/
-bool register_demangler_type(const char *key, GType instance)
+bool register_demangler_type(GType type)
{
bool result; /* Bilan à retourner */
+ GCompDemangler *demangler; /* Instance pour consultation */
+ char *key; /* Désignation associée */
demangler_t *new; /* Nouvel élément à définir */
+ result = false;
+
+ demangler = g_object_new(type, NULL);
+
+ key = g_compiler_demangler_get_key(demangler);
+ if (key == NULL) goto done;
+
G_LOCK(_ddef_access);
new = find_demangler_by_key(key);
- result = (new == NULL);
+ if (new != NULL)
+ free(key);
- if (result)
+ else
{
_demanglers_definitions = (demangler_t *)realloc(_demanglers_definitions,
++_demanglers_definitions_count * sizeof(demangler_t));
@@ -82,12 +91,18 @@ bool register_demangler_type(const char *key, GType instance)
new = &_demanglers_definitions[_demanglers_definitions_count - 1];
new->key = strdup(key);
- new->instance = instance;
+ new->type = type;
+
+ result = true;
}
G_UNLOCK(_ddef_access);
+ done:
+
+ g_object_unref(G_OBJECT(demangler));
+
return result;
}
@@ -182,7 +197,7 @@ GCompDemangler *get_compiler_demangler_for_key(const char *key)
if (def == NULL)
result = NULL;
else
- result = g_object_new(def->instance, NULL);
+ result = g_object_new(def->type, NULL);
G_UNLOCK(_ddef_access);
diff --git a/src/core/demanglers.h b/src/core/demanglers.h
index 842f345..883692a 100644
--- a/src/core/demanglers.h
+++ b/src/core/demanglers.h
@@ -33,7 +33,7 @@
/* Enregistre un décodeur répondant à une appellation donnée. */
-bool register_demangler_type(const char *, GType);
+bool register_demangler_type(GType);
/* Décharge toutes les définitions de décodeurs. */
void unload_demanglers_definitions(void);
diff --git a/src/core/processors.c b/src/core/processors.c
index 666ddac..e4a558f 100644
--- a/src/core/processors.c
+++ b/src/core/processors.c
@@ -185,7 +185,10 @@ bool register_processor_type(GType type)
new = find_processor_by_key(key);
- if (new == NULL)
+ if (new != NULL)
+ free(key);
+
+ else
{
_processors_definitions = realloc(_processors_definitions,
++_processors_definitions_count * sizeof(proc_t));
diff --git a/src/mangling/demangler-int.h b/src/mangling/demangler-int.h
index 839a701..daf67fd 100644
--- a/src/mangling/demangler-int.h
+++ b/src/mangling/demangler-int.h
@@ -30,6 +30,9 @@
+/* Fournit la désignation interne du décodeur de désignations. */
+typedef char *(* get_demangler_key_fc) (const GCompDemangler *);
+
/* Indique si une chaîne peut être traitée par le décodeur. */
typedef bool (* can_be_demangled_fc) (const char *);
@@ -46,6 +49,7 @@ struct _GCompDemanglerClass
{
GObjectClass parent; /* A laisser en premier */
+ get_demangler_key_fc get_key; /* Code représentant la classe */
can_be_demangled_fc can_demangle; /* Possibilité de traitement */
const char *ns_sep; /* Motif de séparation */
diff --git a/src/mangling/demangler.c b/src/mangling/demangler.c
index 4137baf..619d76d 100644
--- a/src/mangling/demangler.c
+++ b/src/mangling/demangler.c
@@ -24,6 +24,9 @@
#include "demangler.h"
+#include <assert.h>
+
+
#include "demangler-int.h"
@@ -128,6 +131,39 @@ static void g_compiler_demangler_finalize(GCompDemangler *demangler)
/******************************************************************************
* *
+* Paramètres : demangler = décodeur à consulter. *
+* *
+* Description : Fournit la désignation interne du décodeur de désignations. *
+* *
+* Retour : Simple chaîne de caractères. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *g_compiler_demangler_get_key(const GCompDemangler *demangler)
+{
+ char *result; /* Désignation à renvoyer */
+ GCompDemanglerClass *class; /* Classe de l'instance */
+
+ class = G_COMP_DEMANGLER_GET_CLASS(demangler);
+
+ if (class->get_key == NULL)
+ {
+ assert(false);
+ result = NULL;
+ }
+
+ else
+ result = class->get_key(demangler);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : demangler = décodeur à consulter pour le résultat. *
* *
* Description : Indique le motif de séparation des espaces de noms. *
diff --git a/src/mangling/demangler.h b/src/mangling/demangler.h
index 490c6c4..629dfde 100644
--- a/src/mangling/demangler.h
+++ b/src/mangling/demangler.h
@@ -47,6 +47,9 @@ typedef struct _GCompDemanglerClass GCompDemanglerClass;
/* Indique le type défini pour un décodeur de désignations. */
GType g_compiler_demangler_get_type(void);
+/* Fournit la désignation interne du décodeur de désignations. */
+char *g_compiler_demangler_get_key(const GCompDemangler *);
+
/* Indique le motif de séparation des espaces de noms. */
const char *g_compiler_demangler_get_ns_separator(const GCompDemangler *);