summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-03-15 11:05:38 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-03-15 11:05:38 (GMT)
commit0df5bc8635819dcb268cf8ca1f82b9713417a6cb (patch)
treea6deda06eaed7ec361edca3d7e656677a70d98af /plugins
parent9e3dfa57a62aebacd9c14f0ca3b5cbcd3f84097f (diff)
Fixed the substitution order when demangling Itanium prefixes.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/itanium/abi.c89
1 files changed, 33 insertions, 56 deletions
diff --git a/plugins/itanium/abi.c b/plugins/itanium/abi.c
index 34a2a01..300bf59 100644
--- a/plugins/itanium/abi.c
+++ b/plugins/itanium/abi.c
@@ -738,10 +738,9 @@ static itanium_component *itd_prefix(GItaniumDemangling *context)
input_buffer *ibuf; /* Tampon de texte manipulé */
char peek; /* Prochain caractère lu */
itanium_component *targs; /* Composant 'template-args' */
- bool backup; /* Solution de repli existante */
- bool merge_targs; /* Fusion nécessaire ? */
itd_state saved; /* Position d'analyse courante */
itanium_component *further; /* Tentative de progression */
+ itanium_component *backup; /* Solution de repli existante */
/**
* La règle traitée ici est la suivante :
@@ -812,6 +811,9 @@ static itanium_component *itd_prefix(GItaniumDemangling *context)
{
g_itanium_demangling_push_state(context, &saved);
+ /* Ajout de la substitution tirée de <template-prefix> */
+ g_itanium_demangling_add_substitution(context, result);
+
targs = itd_template_args(context);
if (targs != NULL)
@@ -823,14 +825,8 @@ static itanium_component *itd_prefix(GItaniumDemangling *context)
}
else
- {
- /* Ajout de la substitution tirée de <template-prefix> */
- g_itanium_demangling_add_substitution(context, result);
-
result = itd_make_binary(ICT_TEMPLATE_NAME_ARGS, result, targs);
- }
-
}
else
@@ -851,13 +847,7 @@ static itanium_component *itd_prefix(GItaniumDemangling *context)
while (count_input_buffer_remaining(ibuf) > 0)
{
- backup = is_itd_unqualified_name(context);
-
- if (backup)
- g_itanium_demangling_push_state(context, &saved);
-
- merge_targs = false;
- targs = NULL;
+ g_itanium_demangling_push_state(context, &saved);
/**
* Comme <data-member-prefix> commence par une régle <source-name> et
@@ -870,66 +860,53 @@ static itanium_component *itd_prefix(GItaniumDemangling *context)
if (further == NULL)
{
+ g_itanium_demangling_pop_state(context, &saved);
further = itd_unqualified_name(context);
-
- if (further != NULL && is_itd_template_args(context))
- {
- merge_targs = true;
- targs = itd_template_args(context);
-
- /* Si l'ensemble ne se termine pas par la règle finale attendue, on rétro-pédale */
- if (targs != NULL && !is_itd_unqualified_name(context))
- {
- itd_unref_comp(targs);
-
- merge_targs = false;
- targs = NULL;
-
- g_itanium_demangling_pop_state(context, &saved);
-
- break;
-
- }
-
- }
-
}
if (further == NULL)
break;
- if (!is_itd_unqualified_name(context))
- {
- if (backup)
- g_itanium_demangling_pop_state(context, &saved);
-
- itd_unref_comp(further);
-
- break;
-
- }
+ backup = result;
+ itd_ref_comp(backup);
result = itd_make_binary(ICT_PREFIX_BINARY, result, further);
- if (merge_targs)
- {
- if (targs != NULL)
- {
- g_itanium_demangling_add_substitution(context, result);
+ /* Ajout de la substitution tirée de <[template-]prefix> */
+ g_itanium_demangling_add_substitution(context, result);
- result = itd_make_binary(ICT_TEMPLATE_NAME_ARGS, result, targs);
+ if (is_itd_template_args(context))
+ {
+ targs = itd_template_args(context);
- }
- else
+ if (targs == NULL)
{
+ itd_unref_comp(backup);
itd_unref_comp(result);
result = NULL;
goto done;
}
+ result = itd_make_binary(ICT_TEMPLATE_NAME_ARGS, result, targs);
+
+ g_itanium_demangling_add_substitution(context, result);
+
}
- g_itanium_demangling_add_substitution(context, result);
+ /* Si l'ensemble ne se termine pas par la règle finale attendue, on rétropédale */
+ if (!is_itd_unqualified_name(context))
+ {
+ itd_unref_comp(result);
+
+ result = backup;
+
+ g_itanium_demangling_pop_state(context, &saved);
+
+ break;
+
+ }
+
+ itd_unref_comp(backup);
}