diff options
Diffstat (limited to 'plugins/itanium/abi.c')
-rw-r--r-- | plugins/itanium/abi.c | 59 |
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; } |