diff options
Diffstat (limited to 'src/arch/register.c')
-rw-r--r-- | src/arch/register.c | 152 |
1 files changed, 151 insertions, 1 deletions
diff --git a/src/arch/register.c b/src/arch/register.c index 0b381a1..ef593b4 100644 --- a/src/arch/register.c +++ b/src/arch/register.c @@ -37,12 +37,30 @@ static void g_arch_register_class_init(GArchRegisterClass *); /* Initialise une instance de registre. */ static void g_arch_register_init(GArchRegister *); +/* Procède à l'initialisation de l'interface de partage. */ +static void g_arch_register_interface_init(GSharedInstanceInterface *); + /* Supprime toutes les références externes. */ static void g_arch_register_dispose(GArchRegister *); /* Procède à la libération totale de la mémoire. */ static void g_arch_register_finalize(GArchRegister *); +/* Initialise un nouvel objet partagé avec des informations. */ +static bool g_arch_register_do_init(GArchRegister *, const void *); + +/* Fournit la valeur du compteur de partage. */ +static unsigned int g_arch_register_get_references(const GArchRegister *); + +/* Incrémente le compteur de partage. */ +static void g_arch_register_inc_references(GArchRegister *); + +/* Décrémente le compteur de partage. */ +static void g_arch_register_dec_references(GArchRegister *); + +/* Indique l'objet partagé correspond à une description donnée. */ +static gboolean g_arch_register_compare_info(const GArchRegister *, const void *); + /* ------------------------- REGISTRE SOUS FORME D'OPERANDE ------------------------- */ @@ -74,7 +92,8 @@ static void g_register_operand_print(const GRegisterOperand *, GBufferLine *, As /* Indique le type défini pour une représentation d'un registre. */ -G_DEFINE_TYPE(GArchRegister, g_arch_register, G_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_CODE(GArchRegister, g_arch_register, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_SHARED_INSTANCE, g_arch_register_interface_init)); /****************************************************************************** @@ -121,6 +140,32 @@ static void g_arch_register_init(GArchRegister *reg) /****************************************************************************** * * +* Paramètres : iface = interface GLib à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de partage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_arch_register_interface_init(GSharedInstanceInterface *iface) +{ + iface->init = (init_shared_fc)g_arch_register_do_init; + + iface->get_ref = (get_shared_ref_fc)g_arch_register_get_references; + iface->inc_ref = (inc_shared_ref_fc)g_arch_register_inc_references; + iface->dec_ref = (dec_shared_ref_fc)g_arch_register_dec_references; + + iface->cmp_info = (compare_shared_info_fc)g_arch_register_compare_info; + iface->is_equal = (is_shared_equal_fc)g_arch_register_equal; + +} + + +/****************************************************************************** +* * * Paramètres : binary = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * @@ -159,6 +204,111 @@ static void g_arch_register_finalize(GArchRegister *reg) /****************************************************************************** * * +* Paramètres : reg = objet partagé à initialiser. * +* info = information à utiliser pour la mise en place. * +* * +* Description : Initialise un nouvel objet partagé avec des informations. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_arch_register_do_init(GArchRegister *reg, const void *info) +{ + bool result; /* Bilan à retourner */ + + result = G_ARCH_REGISTER_GET_CLASS(reg)->init(G_SHARED_INSTANCE(reg), info); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : reg = objet partagé à consulter. * +* * +* Description : Fournit la valeur du compteur de partage. * +* * +* Retour : Nombre de partages courant. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static unsigned int g_arch_register_get_references(const GArchRegister *reg) +{ + return reg->shared_count; + +} + + +/****************************************************************************** +* * +* Paramètres : reg = objet partagé à modifier. * +* * +* Description : Incrémente le compteur de partage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_arch_register_inc_references(GArchRegister *reg) +{ + reg->shared_count++; + +} + + +/****************************************************************************** +* * +* Paramètres : reg = objet partagé à modifier. * +* * +* Description : Décrémente le compteur de partage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_arch_register_dec_references(GArchRegister *reg) +{ + reg->shared_count--; + +} + + +/****************************************************************************** +* * +* Paramètres : reg = objet partagé à consulter. * +* info = compilation de d'information à analyser. * +* * +* Description : Indique l'objet partagé correspond à une description donnée. * +* * +* Retour : true si les détails centraux sont partagés, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean g_arch_register_compare_info(const GArchRegister *reg, const void *info) +{ + bool result; /* Bilan à retourner */ + + result = G_ARCH_REGISTER_GET_CLASS(reg)->cmp_info(G_SHARED_INSTANCE(reg), info); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : reg = opérande à consulter pour le calcul. * * * * Description : Produit une empreinte à partir d'un registre. * |