diff options
Diffstat (limited to 'plugins/itanium/context.c')
-rw-r--r-- | plugins/itanium/context.c | 43 |
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) |