diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-07-04 10:24:39 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-07-04 10:24:39 (GMT) |
commit | 1ade82e135d4e815db5b33c9ebd67632b74e5e1d (patch) | |
tree | eafda5b3e4062922ee4f0b64e8f90695bfbde9c3 /plugins/itanium/component.c | |
parent | 8dc83465a6ca2d5b94b983b39f6c06d37e4126a0 (diff) |
Fixed various mistakes in Itanium C++ demangling.
Diffstat (limited to 'plugins/itanium/component.c')
-rw-r--r-- | plugins/itanium/component.c | 63 |
1 files changed, 24 insertions, 39 deletions
diff --git a/plugins/itanium/component.c b/plugins/itanium/component.c index 6e580f6..d890a1b 100644 --- a/plugins/itanium/component.c +++ b/plugins/itanium/component.c @@ -48,9 +48,6 @@ typedef void (* visit_comp_fc) (itanium_component *); -#define reset_comp_hash(c) c->hash = 0 - - /* Crée un composant de contexte Itanium complètement vierge. */ static itanium_component *itd_alloc(void); @@ -191,6 +188,7 @@ static void visit_comp(itanium_component *comp, visit_comp_fc visitor) break; case ICT_TYPE: + case ICT_VENDOR_TYPE: break; case ICT_QUALIFIED_TYPE: @@ -227,7 +225,7 @@ static void visit_comp(itanium_component *comp, visit_comp_fc visitor) break; case ICT_ARRAY: - if (!comp->array.numbered_dim) + if (!comp->array.numbered_dim && comp->array.dim_expr != NULL) visit_comp(comp->array.dim_expr, visitor); visit_comp(comp->array.atype, visitor); break; @@ -237,6 +235,10 @@ static void visit_comp(itanium_component *comp, visit_comp_fc visitor) visit_comp(comp->pmember.member, visitor); break; + case ICT_TEMPLATE_PARAM: + visit_comp(comp->unary, visitor); + break; + case ICT_TEMPLATE_ARGS: visit_comp(comp->unary, visitor); break; @@ -320,7 +322,7 @@ void itd_unref_comp(itanium_component *comp) { if (--comp->refcount == 0) { - if (comp->type == ICT_TYPE || comp->type == ICT_STD_SUBST) + if (comp->type == ICT_TYPE || comp->type == ICT_VENDOR_TYPE || comp->type == ICT_STD_SUBST) g_object_unref(G_OBJECT(comp->dtype)); itd_free(comp); @@ -336,34 +338,6 @@ void itd_unref_comp(itanium_component *comp) /****************************************************************************** * * -* Paramètres : comp = composant à manipuler. * -* * -* Description : Détermine ou fournit l'empreinte d'un composant. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -fnv64_t itd_hash_comp(itanium_component *comp) -{ - char *desc; /* Description du composant */ - - if (comp->hash == 0) - { - desc = itd_translate_component(comp, NULL); - comp->hash = fnv_64a_hash(desc); - free(desc); - } - - return comp->hash; - -} - - -/****************************************************************************** -* * * Paramètres : type = type à définir pour le composant. * * * * Description : Construit un composant dans un contexte Itanium. * @@ -797,7 +771,7 @@ itanium_component *itd_append_right_to_binary(ItaniumComponentType type, itanium if (parent != NULL) { for (iter = parent; iter->binary.right != NULL; iter = iter->binary.right) - reset_comp_hash(iter); + ; iter->binary.right = result; } @@ -854,8 +828,6 @@ void itd_set_type(itanium_component *comp, ItaniumComponentType type) { comp->type = type; - reset_comp_hash(comp); - } @@ -1025,6 +997,7 @@ char *itd_translate_component(const itanium_component *comp, char *base) break; case ICT_TYPE: + case ICT_VENDOR_TYPE: name = g_data_type_to_string(comp->dtype, true); result = stradd(base, name); free(name); @@ -1112,7 +1085,7 @@ char *itd_translate_component(const itanium_component *comp, char *base) free(tmp); } - else + else if (comp->array.dim_expr != NULL) result = itd_translate_component(comp->array.dim_expr, result); result = stradd(result, "]"); @@ -1125,6 +1098,10 @@ char *itd_translate_component(const itanium_component *comp, char *base) result = itd_translate_component(comp->pmember.member, result); break; + case ICT_TEMPLATE_PARAM: + result = itd_translate_component(comp->unary, base); + break; + case ICT_TEMPLATE_ARGS: result = stradd(base, "<"); result = itd_translate_component(comp->unary, result); @@ -1543,6 +1520,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) break; case ICT_TYPE: + case ICT_VENDOR_TYPE: result = g_data_type_dup(comp->dtype); break; @@ -1631,9 +1609,12 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) if (comp->array.numbered_dim) g_array_type_set_dimension_number(G_ARRAY_TYPE(result), comp->array.dim_number); - else + else if (comp->array.dim_expr != NULL) g_array_type_set_dimension_expression(G_ARRAY_TYPE(result), - itd_translate_component(comp, NULL)); + itd_translate_component(comp->array.dim_expr, NULL)); + + else + g_array_type_set_empty_dimension(G_ARRAY_TYPE(result)); } @@ -1660,6 +1641,10 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) break; + case ICT_TEMPLATE_PARAM: + result = itd_translate_component_to_type(comp->unary); + break; + case ICT_TEMPLATE_ARGS: assert(comp->unary->type == ICT_TYPES_LIST); |