diff options
Diffstat (limited to 'src/arch/immediate.c')
-rw-r--r-- | src/arch/immediate.c | 154 |
1 files changed, 75 insertions, 79 deletions
diff --git a/src/arch/immediate.c b/src/arch/immediate.c index 5d3b844..9c807db 100644 --- a/src/arch/immediate.c +++ b/src/arch/immediate.c @@ -96,14 +96,11 @@ static void g_imm_operand_dispose(GImmOperand *); /* Procède à la libération totale de la mémoire. */ static void g_imm_operand_finalize(GImmOperand *); -/* Initialise un nouvel objet partagé avec des informations. */ -static bool g_imm_operand_do_init(GImmOperand *, const GImmOperand *); - /* Réalise une copie minimale d'un contenu partagé. */ -static void g_imm_operand_quickly_copy(const GImmOperand *, GImmOperand *); +static void g_imm_operand_define_template(const GImmOperand *, GImmOperand *); /* Compare un opérande avec un autre. */ -static int g_imm_operand_compare(const GImmOperand * const *, const GImmOperand * const *); +static int g_imm_operand_compare(const GImmOperand *, const GImmOperand *); /* Indique si une valeur est complétée par des zéros. */ static bool g_imm_operand_does_padding_for_display(const GImmOperand *, ImmOperandDisplay); @@ -126,6 +123,10 @@ static char *g_imm_operand_build_tooltip(const GImmOperand *, const GLoadedBinar static GShareManager *_imm_operand_manager = NULL; +/* Fournit le gestionnaire de partages attribué à un type. */ +static GShareManager *get_imm_operand_share_manager(void); + + /* ---------------------------------------------------------------------------------- */ /* MANIPULATION D'OPERANDES DE VALEUR IMMEDIATE */ @@ -160,8 +161,11 @@ static void g_imm_operand_class_init(GImmOperandClass *klass) object->dispose = (GObjectFinalizeFunc/* ! */)g_imm_operand_dispose; object->finalize = (GObjectFinalizeFunc)g_imm_operand_finalize; - operand->init = (operand_do_init_fc)g_imm_operand_do_init; - operand->qck_copy = (operand_qck_copy_fc)g_imm_operand_quickly_copy; + operand->get_manager = (get_operand_manager_fc)get_imm_operand_share_manager; + + operand->apply_template = (apply_operand_template_fc)NULL; + operand->define_template = (define_operand_template_fc)g_imm_operand_define_template; + operand->free_template = (free_operand_template_fc)NULL; operand->compare = (operand_compare_fc)g_imm_operand_compare; operand->print = (operand_print_fc)g_imm_operand_print; @@ -331,7 +335,7 @@ GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize size, const GBinConten } - result = G_ARCH_OPERAND(g_share_manager_get(_imm_operand_manager, (GSharedInstance *)&fake)); + result = G_ARCH_OPERAND(g_share_manager_build(_imm_operand_manager, (GSharedInstance *)&fake)); return result; @@ -370,7 +374,7 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, uint64_t value) fake.size = size; fake.raw = value; - result = G_ARCH_OPERAND(g_share_manager_get(_imm_operand_manager, (GSharedInstance *)&fake)); + result = G_ARCH_OPERAND(g_share_manager_build(_imm_operand_manager, (GSharedInstance *)&fake)); } @@ -381,28 +385,6 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, uint64_t value) /****************************************************************************** * * -* Paramètres : operand = objet partagé à initialiser. * -* template = coquille vide contenant les infos à enregistrer. * -* * -* Description : Initialise un nouvel objet partagé avec des informations. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_imm_operand_do_init(GImmOperand *operand, const GImmOperand *template) -{ - g_imm_operand_quickly_copy(template, operand); - - return true; - -} - - -/****************************************************************************** -* * * Paramètres : operand = objet partagé à consulter. * * template = informations à retrouver intégralement. * * * @@ -414,7 +396,7 @@ static bool g_imm_operand_do_init(GImmOperand *operand, const GImmOperand *templ * * ******************************************************************************/ -static void g_imm_operand_quickly_copy(const GImmOperand *operand, GImmOperand *template) +static void g_imm_operand_define_template(const GImmOperand *operand, GImmOperand *template) { template->raw = operand->raw; template->size = operand->size; @@ -439,85 +421,80 @@ static void g_imm_operand_quickly_copy(const GImmOperand *operand, GImmOperand * * * ******************************************************************************/ -static int g_imm_operand_compare(const GImmOperand * const *a, const GImmOperand * const *b) +static int g_imm_operand_compare(const GImmOperand *a, const GImmOperand *b) { int result; /* Bilan à retourner */ - const GImmOperand *imm_a; /* Accès simplifié à A */ - const GImmOperand *imm_b; /* Accès simplifié à B */ - - imm_a = *a; - imm_b = *b; - if (imm_a->size < imm_b->size) + if (a->size < b->size) { result = -1; goto gioc_done; } - else if (imm_a->size > imm_b->size) + else if (a->size > b->size) { result = 1; goto gioc_done; } - if (imm_a->raw < imm_b->raw) + if (a->raw < b->raw) { result = -1; goto gioc_done; } - else if (imm_a->raw > imm_b->raw) + else if (a->raw > b->raw) { result = 1; goto gioc_done; } - if (imm_a->def_display < imm_b->def_display) + if (a->def_display < b->def_display) { result = -1; goto gioc_done; } - else if (imm_a->def_display > imm_b->def_display) + else if (a->def_display > b->def_display) { result = 1; goto gioc_done; } - if (IMM_HAS_DISPLAY(imm_a) != IMM_HAS_DISPLAY(imm_b)) + if (IMM_HAS_DISPLAY(a) != IMM_HAS_DISPLAY(b)) { - result = (IMM_HAS_DISPLAY(imm_a) ? 1 : -1); + result = (IMM_HAS_DISPLAY(a) ? 1 : -1); goto gioc_done; } - if (IMM_HAS_DISPLAY(imm_a)) + if (IMM_HAS_DISPLAY(a)) { - if (imm_a->display < imm_b->display) + if (a->display < b->display) { result = -1; goto gioc_done; } - else if (imm_a->display > imm_b->display) + else if (a->display > b->display) { result = 1; goto gioc_done; } } - if (IMM_GET_DEF_ZERO_PADDING(imm_a) != IMM_GET_DEF_ZERO_PADDING(imm_b)) + if (IMM_GET_DEF_ZERO_PADDING(a) != IMM_GET_DEF_ZERO_PADDING(b)) { - result = (IMM_GET_DEF_ZERO_PADDING(imm_a) ? 1 : -1); + result = (IMM_GET_DEF_ZERO_PADDING(a) ? 1 : -1); goto gioc_done; } - if (IMM_HAS_ZERO_PADDING(imm_a) != IMM_HAS_ZERO_PADDING(imm_b)) + if (IMM_HAS_ZERO_PADDING(a) != IMM_HAS_ZERO_PADDING(b)) { - result = (IMM_HAS_ZERO_PADDING(imm_a) ? 1 : -1); + result = (IMM_HAS_ZERO_PADDING(a) ? 1 : -1); goto gioc_done; } - if (IMM_HAS_ZERO_PADDING(imm_a)) + if (IMM_HAS_ZERO_PADDING(a)) { - if (IMM_GET_ZERO_PADDING_VALUE(imm_a) != IMM_GET_ZERO_PADDING_VALUE(imm_b)) + if (IMM_GET_ZERO_PADDING_VALUE(a) != IMM_GET_ZERO_PADDING_VALUE(b)) { - result = (IMM_GET_ZERO_PADDING_VALUE(imm_a) ? 1 : -1); + result = (IMM_GET_ZERO_PADDING_VALUE(a) ? 1 : -1); goto gioc_done; } } @@ -668,18 +645,18 @@ uint64_t g_imm_operand_get_raw_value(const GImmOperand *operand) void g_imm_operand_set_value(GImmOperand **operand, MemoryDataSize size, uint64_t value, GShareContainer *container) { GSharedInstance *shared; /* Instace de travail partagée */ - GImmOperand fake; /* Transport d'informations */ + GImmOperand template; /* Transport d'informations */ assert(size != MDS_UNDEFINED); shared = G_SHARED_INSTANCE(*operand); - g_shared_instance_quickly_copy(shared, (GSharedInstance *)&fake); + g_shared_instance_define_template(shared, (GSharedInstance *)&template); - fake.size = size; - fake.raw = value; + template.size = size; + template.raw = value; - shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&fake, container); + shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&template, container); *operand = G_IMM_OPERAND(shared); @@ -703,15 +680,15 @@ void g_imm_operand_set_value(GImmOperand **operand, MemoryDataSize size, uint64_ void g_imm_operand_pad_by_default(GImmOperand **operand, bool state, GShareContainer *container) { GSharedInstance *shared; /* Instace de travail partagée */ - GImmOperand fake; /* Transport d'informations */ + GImmOperand template; /* Transport d'informations */ shared = G_SHARED_INSTANCE(*operand); - g_shared_instance_quickly_copy(shared, (GSharedInstance *)&fake); + g_shared_instance_define_template(shared, (GSharedInstance *)&template); - IMM_SET_DEF_ZERO_PADDING(&fake, state); + IMM_SET_DEF_ZERO_PADDING(&template, state); - shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&fake, container); + shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&template, container); *operand = G_IMM_OPERAND(shared); @@ -757,16 +734,16 @@ bool g_imm_operand_does_padding_by_default(const GImmOperand *operand) void g_imm_operand_pad(GImmOperand **operand, bool state, GShareContainer *container) { GSharedInstance *shared; /* Instace de travail partagée */ - GImmOperand fake; /* Transport d'informations */ + GImmOperand template; /* Transport d'informations */ shared = G_SHARED_INSTANCE(*operand); - g_shared_instance_quickly_copy(shared, (GSharedInstance *)&fake); + g_shared_instance_define_template(shared, (GSharedInstance *)&template); - IMM_SET_ZERO_PADDING(&fake); - IMM_SET_ZERO_PADDING_VALUE(&fake, state); + IMM_SET_ZERO_PADDING(&template); + IMM_SET_ZERO_PADDING_VALUE(&template, state); - shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&fake, container); + shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&template, container); *operand = G_IMM_OPERAND(shared); @@ -849,15 +826,15 @@ static bool g_imm_operand_does_padding_for_display(const GImmOperand *operand, I void g_imm_operand_set_default_display(GImmOperand **operand, ImmOperandDisplay display, GShareContainer *container) { GSharedInstance *shared; /* Instace de travail partagée */ - GImmOperand fake; /* Transport d'informations */ + GImmOperand template; /* Transport d'informations */ shared = G_SHARED_INSTANCE(*operand); - g_shared_instance_quickly_copy(shared, (GSharedInstance *)&fake); + g_shared_instance_define_template(shared, (GSharedInstance *)&template); - fake.def_display = display; + template.def_display = display; - shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&fake, container); + shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&template, container); *operand = G_IMM_OPERAND(shared); @@ -900,16 +877,16 @@ ImmOperandDisplay g_imm_operand_get_default_display(const GImmOperand *operand) void g_imm_operand_set_display(GImmOperand **operand, ImmOperandDisplay display, GShareContainer *container) { GSharedInstance *shared; /* Instace de travail partagée */ - GImmOperand fake; /* Transport d'informations */ + GImmOperand template; /* Transport d'informations */ shared = G_SHARED_INSTANCE(*operand); - g_shared_instance_quickly_copy(shared, (GSharedInstance *)&fake); + g_shared_instance_define_template(shared, (GSharedInstance *)&template); - IMM_SET_DISPLAY(&fake); - fake.display = display; + IMM_SET_DISPLAY(&template); + template.display = display; - shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&fake, container); + shared = g_share_manager_update(_imm_operand_manager, shared, (GSharedInstance *)&template, container); *operand = G_IMM_OPERAND(shared); @@ -1509,6 +1486,25 @@ bool g_imm_operand_to_off_t(const GImmOperand *operand, off_t *value, bool *nega * * * Paramètres : - * * * +* Description : Fournit le gestionnaire de partages attribué à un type. * +* * +* Retour : Gestionnaire de partages en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GShareManager *get_imm_operand_share_manager(void) +{ + return _imm_operand_manager; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * * Description : Initialise les mécanismes de partage d'opérandes immédiates. * * * * Retour : Bilan de l'opération. * |