diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2021-11-30 01:56:58 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2021-11-30 01:56:58 (GMT) |
commit | de06b3ebc7021c20d94013bd39f4ba2c2e5ce3fa (patch) | |
tree | 463af79c1045e4180958d9ef9d0af33d3eebf7b9 /src/core | |
parent | 7101133d0e862d2296d9709dc6ef1e64ebbc2ea0 (diff) |
Access demanglers by key.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/demanglers.c | 31 | ||||
-rw-r--r-- | src/core/demanglers.h | 2 | ||||
-rw-r--r-- | src/core/processors.c | 5 |
3 files changed, 28 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)); |