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/operands/args.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/operands/args.c')
-rw-r--r-- | src/arch/dalvik/operands/args.c | 54 |
1 files changed, 17 insertions, 37 deletions
diff --git a/src/arch/dalvik/operands/args.c b/src/arch/dalvik/operands/args.c index 9e75604..5ba552b 100644 --- a/src/arch/dalvik/operands/args.c +++ b/src/arch/dalvik/operands/args.c @@ -30,6 +30,7 @@ #include "../../operand-int.h" #include "../../sharing/manager.h" +#include "../../../common/sort.h" @@ -70,11 +71,8 @@ static void g_dalvik_args_operand_finalize(GDalvikArgsOperand *); /* Initialise un nouvel objet partagé avec des informations. */ static bool g_dalvik_args_operand_do_init(GDalvikArgsOperand *, const GDalvikArgsOperand *); -/* Indique l'objet partagé correspond à une description donnée. */ -static gboolean g_dalvik_args_operand_compare_info(const GDalvikArgsOperand *, const GDalvikArgsOperand *); - /* Compare un opérande avec un autre. */ -static bool g_dalvik_args_operand_compare(const GDalvikArgsOperand *, const GDalvikArgsOperand *); +static int g_dalvik_args_operand_compare(const GDalvikArgsOperand * const *, const GDalvikArgsOperand * const *); /* Traduit un opérande en version humainement lisible. */ static void g_dalvik_args_operand_print(const GDalvikArgsOperand *, GBufferLine *, AsmSyntax); @@ -122,7 +120,6 @@ static void g_dalvik_args_operand_class_init(GDalvikArgsOperandClass *klass) object->finalize = (GObjectFinalizeFunc)g_dalvik_args_operand_finalize; operand->init = (init_shared_fc)g_dalvik_args_operand_do_init; - operand->cmp_info = (compare_shared_info_fc)g_dalvik_args_operand_compare_info; operand->compare = (operand_compare_fc)g_dalvik_args_operand_compare; operand->print = (operand_print_fc)g_dalvik_args_operand_print; @@ -253,30 +250,6 @@ static bool g_dalvik_args_operand_do_init(GDalvikArgsOperand *operand, const GDa /****************************************************************************** * * -* Paramètres : operand = objet partagé à consulter. * -* fake = coquille vide contenant les infos à comparer. * -* * -* 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_args_operand_compare_info(const GDalvikArgsOperand *operand, const GDalvikArgsOperand *fake) -{ - gboolean result; /* Bilan à retourner */ - - result = g_dalvik_args_operand_compare(operand, fake); - - return result; - -} - - -/****************************************************************************** -* * * Paramètres : a = premier opérande à consulter. * * b = second opérande à consulter. * * * @@ -288,20 +261,26 @@ static gboolean g_dalvik_args_operand_compare_info(const GDalvikArgsOperand *ope * * ******************************************************************************/ -static bool g_dalvik_args_operand_compare(const GDalvikArgsOperand *a, const GDalvikArgsOperand *b) +static int g_dalvik_args_operand_compare(const GDalvikArgsOperand * const *a, const GDalvikArgsOperand * const *b) { - bool result; /* Bilan à renvoyer */ + int result; /* Bilan à renvoyer */ + const GDalvikArgsOperand *_a; /* Accès rapide à l'élément A */ + const GDalvikArgsOperand *_b; /* Accès rapide à l'élément B */ size_t i; /* Boucle de parcours */ - if (b == NULL) - result = (a->count == 0); + _a = *a; + _b = *b; + + if (_b == NULL) + result = sort_unsigned_long(_a->count, 0); else { - result = (a->count == b->count); + result = sort_unsigned_long(_a->count, _b->count); - for (i = 0; i < a->count && result; i++) - result = g_arch_operand_compare(a->args[i], b->args[i]); + for (i = 0; i < _a->count && result == 0; i++) + result = g_arch_operand_compare((const GArchOperand * const *)&_a->args[i], + (const GArchOperand * const *)&_b->args[i]); } @@ -377,7 +356,8 @@ GDalvikArgsOperand *g_dalvik_args_operand_add(GDalvikArgsOperand *operand, GArch fake.args[i] = arg; - result = g_share_manager_update(_dalvik_args_operand_manager, G_SHARED_INSTANCE(operand), &fake, container); + result = g_share_manager_update(_dalvik_args_operand_manager, G_SHARED_INSTANCE(operand), + (GSharedInstance *)&fake, container); free(fake.args); |