summaryrefslogtreecommitdiff
path: root/plugins/itanium/context.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-04 10:24:39 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-04 10:24:39 (GMT)
commit1ade82e135d4e815db5b33c9ebd67632b74e5e1d (patch)
treeeafda5b3e4062922ee4f0b64e8f90695bfbde9c3 /plugins/itanium/context.c
parent8dc83465a6ca2d5b94b983b39f6c06d37e4126a0 (diff)
Fixed various mistakes in Itanium C++ demangling.
Diffstat (limited to 'plugins/itanium/context.c')
-rw-r--r--plugins/itanium/context.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/plugins/itanium/context.c b/plugins/itanium/context.c
index 1d2c365..c89f823 100644
--- a/plugins/itanium/context.c
+++ b/plugins/itanium/context.c
@@ -411,10 +411,12 @@ void g_itanium_demangling_pop_state(GItaniumDemangling *context, const itd_state
* *
******************************************************************************/
-void g_itanium_demangling_add_template_arg(GItaniumDemangling *context, itanium_component *comp)
+void g_itanium_demangling_add_template_args(GItaniumDemangling *context, itanium_component *comp)
{
assert(comp != NULL);
+ assert(itd_get_component_type(comp) == ICT_TEMPLATE_ARGS);
+
context->template_args[context->targs_count++] = comp;
itd_ref_comp(comp);
@@ -437,14 +439,37 @@ void g_itanium_demangling_add_template_arg(GItaniumDemangling *context, itanium_
itanium_component *g_itanium_demangling_get_template_arg(GItaniumDemangling *context, size_t index)
{
itanium_component *result; /* Composant à retourner */
+ itanium_component *targs; /* Racine des arguments */
+ itanium_component *iter; /* Boucle de parcours #1 */
+
+ if (context->targs_count == 0)
+ result = NULL;
- if (index < context->targs_count)
+ else
{
- result = context->template_args[index];
- itd_ref_comp(result);
+ targs = context->template_args[context->targs_count - 1];
+
+ for (iter = targs->unary; iter != NULL; iter = iter->binary.right)
+ {
+ assert(itd_get_component_type(iter) == ICT_TYPES_LIST);
+
+ if (index == 0)
+ break;
+
+ index--;
+
+ }
+
+ if (iter != NULL)
+ {
+ result = iter->binary.left;
+ itd_ref_comp(result);
+ }
+
+ else
+ result = NULL;
+
}
- else
- result = NULL;
return result;
@@ -466,15 +491,15 @@ itanium_component *g_itanium_demangling_get_template_arg(GItaniumDemangling *con
void g_itanium_demangling_add_substitution(GItaniumDemangling *context, itanium_component *comp)
{
- fnv64_t hash; /* Empreinte du candidat */
size_t i; /* Boucle de parcours */
assert(comp != NULL);
- hash = itd_hash_comp(comp);
+ if (itd_get_component_type(comp) == ICT_STD_SUBST)
+ return;
for (i = 0; i < context->subst_count; i++)
- if (cmp_fnv_64a(itd_hash_comp(context->substitutions[i]), hash) == 0)
+ if (comp == context->substitutions[i])
break;
if (i == context->subst_count)