diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-12-18 21:36:14 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-12-18 21:36:14 (GMT) |
commit | d50544a3de540727137f2b13010ca4450f8ea10f (patch) | |
tree | 05e4ad65c25570016d5732f425a9eff2f4117d34 /src/arch/dalvik/register.c | |
parent | b0bcf250999b2242019f137e38f52390a86e71cd (diff) |
Used a fast sorted array to track shared instances instead of a simple hash table.
Diffstat (limited to 'src/arch/dalvik/register.c')
-rw-r--r-- | src/arch/dalvik/register.c | 101 |
1 files changed, 33 insertions, 68 deletions
diff --git a/src/arch/dalvik/register.c b/src/arch/dalvik/register.c index d455eb2..d11b4d0 100644 --- a/src/arch/dalvik/register.c +++ b/src/arch/dalvik/register.c @@ -29,6 +29,7 @@ #include "../register-int.h" #include "../sharing/manager.h" +#include "../../common/sort.h" @@ -69,17 +70,11 @@ static void g_dalvik_register_dispose(GDalvikRegister *); static void g_dalvik_register_finalize(GDalvikRegister *); /* Initialise un nouvel objet partagé avec des informations. */ -static bool g_dalvik_register_do_init(GDalvikRegister *, const uint16_t *); - -/* Indique l'objet partagé correspond à une description donnée. */ -static gboolean g_dalvik_register_compare_info(const GDalvikRegister *, const uint16_t *); +static bool g_dalvik_register_do_init(GDalvikRegister *, const GDalvikRegister *); /* Produit une empreinte à partir d'un registre. */ static guint g_dalvik_register_hash(const GDalvikRegister *); -/* Compare un registre avec un autre. */ -static int g_dalvik_register_compare(const GDalvikRegister *, const GDalvikRegister *); - /* Traduit un registre en version humainement lisible. */ static void g_dalvik_register_print(const GDalvikRegister *, GBufferLine *, AsmSyntax); @@ -127,7 +122,6 @@ static void g_dalvik_register_class_init(GDalvikRegisterClass *klass) register_class = G_ARCH_REGISTER_CLASS(klass); register_class->init = (init_shared_fc)g_dalvik_register_do_init; - register_class->cmp_info = (compare_shared_info_fc)g_dalvik_register_compare_info; register_class->hash = (reg_hash_fc)g_dalvik_register_hash; register_class->compare = (reg_compare_fc)g_dalvik_register_compare; @@ -207,8 +201,11 @@ static void g_dalvik_register_finalize(GDalvikRegister *reg) GDalvikRegister *g_dalvik_register_new(uint16_t index) { GDalvikRegister *result; /* Structure à retourner */ + GDalvikRegister fake; /* Transport d'informations */ + + fake.index = index; - result = G_DALVIK_REGISTER(g_share_manager_get(_dalvik_register_manager, &index)); + result = G_DALVIK_REGISTER(g_share_manager_get(_dalvik_register_manager, (GSharedInstance *)&fake)); return result; @@ -217,8 +214,8 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index) /****************************************************************************** * * -* Paramètres : reg = objet partagé à initialiser. * -* index = indice du registre correspondant. * +* Paramètres : reg = objet partagé à initialiser. * +* fake = coquille vide contenant les infos à enregistrer. * * * * Description : Initialise un nouvel objet partagé avec des informations. * * * @@ -228,9 +225,9 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index) * * ******************************************************************************/ -static bool g_dalvik_register_do_init(GDalvikRegister *reg, const uint16_t *index) +static bool g_dalvik_register_do_init(GDalvikRegister *reg, const GDalvikRegister *fake) { - reg->index = *index; + reg->index = fake->index; return true; @@ -239,30 +236,6 @@ static bool g_dalvik_register_do_init(GDalvikRegister *reg, const uint16_t *inde /****************************************************************************** * * -* Paramètres : reg = objet partagé à consulter. * -* index = indice du registre correspondant. * -* * -* 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_dalvik_register_compare_info(const GDalvikRegister *reg, const uint16_t *index) -{ - gboolean result; /* Bilan à retourner */ - - result = (reg->index == *index); - - return result; - -} - - -/****************************************************************************** -* * * Paramètres : reg = opérande à consulter pour le calcul. * * * * Description : Produit une empreinte à partir d'un registre. * @@ -282,37 +255,6 @@ static guint g_dalvik_register_hash(const GDalvikRegister *reg) /****************************************************************************** * * -* Paramètres : a = premier opérande à consulter. * -* b = second opérande à consulter. * -* * -* Description : Compare un registre avec un autre. * -* * -* Retour : Bilan de la comparaison. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *b) -{ - int result; /* Bilan à retourner */ - - if (a->index < b->index) - result = -1; - - else if (a->index > b->index) - result = 1; - - else - result = 0; - - return result; - -} - - -/****************************************************************************** -* * * Paramètres : reg = registre à transcrire. * * line = ligne tampon où imprimer l'opérande donné. * * syntax = type de représentation demandée. * @@ -370,6 +312,29 @@ uint16_t g_dalvik_register_get_index(const GDalvikRegister *reg) } +/****************************************************************************** +* * +* Paramètres : a = premier opérande à consulter. * +* b = second opérande à consulter. * +* * +* Description : Compare un registre avec un autre. * +* * +* Retour : Bilan de la comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int g_dalvik_register_compare(const GDalvikRegister * const *a, const GDalvikRegister * const *b) +{ + int result; /* Bilan à retourner */ + + result = sort_unsigned_long((*a)->index, (*b)->index); + + return result; + +} + /* ---------------------------------------------------------------------------------- */ /* PARTAGES DE CONTENUS UNIQUES */ |