summaryrefslogtreecommitdiff
path: root/plugins/itanium/abi.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/abi.c
parent8dc83465a6ca2d5b94b983b39f6c06d37e4126a0 (diff)
Fixed various mistakes in Itanium C++ demangling.
Diffstat (limited to 'plugins/itanium/abi.c')
-rw-r--r--plugins/itanium/abi.c59
1 files changed, 25 insertions, 34 deletions
diff --git a/plugins/itanium/abi.c b/plugins/itanium/abi.c
index 5f76342..3f6f713 100644
--- a/plugins/itanium/abi.c
+++ b/plugins/itanium/abi.c
@@ -1954,6 +1954,7 @@ static itanium_component *itd_type(GItaniumDemangling *context)
{
builtin = g_class_enum_type_new(CET_UNKNOWN, itd_translate_component(vendor, NULL));
result = itd_make_type(builtin);
+ itd_set_type(result, ICT_VENDOR_TYPE);
itd_unref_comp(vendor);
sub = itd_type(context);
@@ -2483,10 +2484,10 @@ static itanium_component *itd_array_type(GItaniumDemangling *context)
{
itanium_component *result; /* Construction à retourner */
input_buffer *ibuf; /* Tampon de texte manipulé */
- char peek; /* Prochain caractère dispo. */
- itanium_component *dim_expr; /* Dimension via expression */
ssize_t dim_number; /* Dimension par un nombre */
itanium_component *type; /* Type du tableau */
+ itd_state saved; /* Position d'analyse courante */
+ itanium_component *dim_expr; /* Dimension via expression */
/**
* La règle traitée ici est la suivante :
@@ -2501,58 +2502,46 @@ static itanium_component *itd_array_type(GItaniumDemangling *context)
if (!check_input_buffer_char(ibuf, 'A'))
return NULL;
- peek = peek_input_buffer_char(ibuf);
-
- if (peek == '[')
+ if (itd_number(context, &dim_number))
{
- advance_input_buffer(ibuf, 1);
-
- dim_expr = itd_expression(context);
-
- if (dim_expr == NULL)
- return NULL;
-
- if (!check_input_buffer_char(ibuf, ']'))
- return NULL;
-
if (!check_input_buffer_char(ibuf, '_'))
return NULL;
type = itd_type(context);
if (type == NULL)
- {
- itd_unref_comp(dim_expr);
return NULL;
- }
- result = itd_make_array_with_dim_expr(dim_expr, type);
-
- if (result == NULL)
- {
- itd_unref_comp(dim_expr);
- itd_unref_comp(type);
- }
+ result = itd_make_array_with_dim_number(dim_number, type);
}
else
{
- if (!itd_number(context, &dim_number))
- return NULL;
+ g_itanium_demangling_push_state(context, &saved);
+
+ dim_expr = itd_expression(context);
+
+ if (dim_expr == NULL)
+ g_itanium_demangling_pop_state(context, &saved);
if (!check_input_buffer_char(ibuf, '_'))
+ {
+ if (dim_expr != NULL)
+ itd_unref_comp(dim_expr);
return NULL;
+ }
type = itd_type(context);
if (type == NULL)
+ {
+ if (dim_expr != NULL)
+ itd_unref_comp(dim_expr);
return NULL;
+ }
- result = itd_make_array_with_dim_number(dim_number, type);
-
- if (result == NULL)
- itd_unref_comp(type);
+ result = itd_make_array_with_dim_expr(dim_expr, type);
}
@@ -2660,6 +2649,9 @@ static itanium_component *itd_template_param(GItaniumDemangling *context)
result = g_itanium_demangling_get_template_arg(context, id);
+ if (result != NULL)
+ result = itd_make_unary(ICT_TEMPLATE_PARAM, result);
+
}
}
@@ -2761,6 +2753,8 @@ static itanium_component *itd_template_args(GItaniumDemangling *context)
result = itd_make_unary(ICT_TEMPLATE_ARGS, result);
+ g_itanium_demangling_add_template_args(context, result);
+
return result;
}
@@ -2817,9 +2811,6 @@ static itanium_component *itd_template_arg(GItaniumDemangling *context)
else
result = itd_type(context);
- if (result != NULL)
- g_itanium_demangling_add_template_arg(context, result);
-
return result;
}