summaryrefslogtreecommitdiff
path: root/src/arch/immediate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/immediate.c')
-rw-r--r--src/arch/immediate.c154
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. *