diff options
Diffstat (limited to 'plugins/itanium')
-rw-r--r-- | plugins/itanium/component.c | 77 |
1 files changed, 68 insertions, 9 deletions
diff --git a/plugins/itanium/component.c b/plugins/itanium/component.c index b8aa9c5..c2bf78a 100644 --- a/plugins/itanium/component.c +++ b/plugins/itanium/component.c @@ -60,6 +60,9 @@ static void visit_comp(itanium_component *, visit_comp_fc); /* Traduit les composants de contexte Itanium en décalage. */ static bool itd_translate_component_to_offset(const itanium_component *, call_offset_t *); +/* Ajoute un espace de noms à un type déjà préparé. */ +static void itd_prepend_namespace_to_type(GDataType *, GDataType *); + /****************************************************************************** @@ -1279,6 +1282,39 @@ static bool itd_translate_component_to_offset(const itanium_component *comp, cal /****************************************************************************** * * +* Paramètres : type = type à traiter. * +* ns = espace à intégrer. * +* * +* Description : Ajoute un espace de noms à un type déjà préparé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void itd_prepend_namespace_to_type(GDataType *type, GDataType *ns) +{ + GDataType *existing; /* Espace en place ? */ + + existing = g_data_type_get_namespace(type); + + if (existing == NULL) + g_data_type_set_namespace(type, ns, "::"); + + else + { + itd_prepend_namespace_to_type(existing, ns); + + g_object_unref(G_OBJECT(existing)); + + } + +} + + +/****************************************************************************** +* * * Paramètres : comp = composant Itanium à traduire en type. * * * * Description : Traduit les composants de contexte Itanium en type. * @@ -1294,6 +1330,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) GDataType *result; /* Type à retourner */ char *name; /* Attribution finale */ GDataType *ns; /* Espace de noms d'un type */ + GDataType *sub; /* Sous-titre à traiter */ call_offset_t off0; /* Décalage #0 */ call_offset_t off1; /* Décalage #1 */ itanium_component *iter; /* Boucle de parcours */ @@ -1316,7 +1353,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) if (result != NULL) { ns = g_class_enum_type_new(CET_NAMESPACE, strdup("std")); - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } break; @@ -1348,7 +1385,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) result = itd_translate_component_to_type(comp->binary.right); if (result != NULL && ns != NULL) - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } @@ -1360,8 +1397,30 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) if (result != NULL) { - name = itd_translate_component(comp->binary.left, NULL); + sub = itd_translate_component_to_type(comp->binary.left); + + if (sub == NULL) + { + name = itd_translate_component(comp->binary.left, NULL); + ns = NULL; + } + + else + { + ns = g_data_type_get_namespace(sub); + g_data_type_set_namespace(sub, NULL, NULL); + + name = g_data_type_to_string(sub, true); + + g_object_unref(G_OBJECT(sub)); + + } + g_template_type_set_name(G_TEMPLATE_TYPE(result), name); + + if (ns != NULL) + itd_prepend_namespace_to_type(result, ns); + } break; @@ -1389,7 +1448,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) result = itd_translate_component_to_type(comp->binary.right); if (result != NULL) - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } @@ -1426,7 +1485,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) if (result != NULL) { if (ns != NULL) - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } else { @@ -1452,7 +1511,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) else { result = g_class_enum_type_new(CET_VIRTUAL_TABLE, NULL); - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } break; @@ -1467,7 +1526,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) else { result = g_class_enum_type_new(CET_VIRTUAL_STRUCT, NULL); - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } break; @@ -1635,7 +1694,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp) g_object_unref(G_OBJECT(ns)); else - g_data_type_set_namespace(result, ns, "::"); + itd_prepend_namespace_to_type(result, ns); } @@ -1773,7 +1832,7 @@ GBinRoutine *itd_translate_component_to_routine(const itanium_component *comp) g_data_type_set_namespace(type, NULL, NULL); if (G_IS_TEMPLATE_TYPE(type)) - g_binary_routine_set_name_from_type(result, type); + g_binary_routine_set_typed_name(result, type); else { |