diff options
Diffstat (limited to 'plugins/dalvik/operands/pool.c')
-rw-r--r-- | plugins/dalvik/operands/pool.c | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/plugins/dalvik/operands/pool.c b/plugins/dalvik/operands/pool.c index baab1f6..acec518 100644 --- a/plugins/dalvik/operands/pool.c +++ b/plugins/dalvik/operands/pool.c @@ -75,7 +75,7 @@ static void g_dalvik_pool_operand_dispose(GDalvikPoolOperand *); static void g_dalvik_pool_operand_finalize(GDalvikPoolOperand *); /* Compare un opérande avec un autre. */ -static int g_dalvik_pool_operand_compare(const GDalvikPoolOperand *, const GDalvikPoolOperand *); +static int g_dalvik_pool_operand_compare(const GDalvikPoolOperand *, const GDalvikPoolOperand *, bool); /* Traduit un opérande en version humainement lisible. */ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *, GBufferLine *); @@ -86,7 +86,7 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *, GBufferLine /* Fournit l'empreinte d'un candidat à une centralisation. */ -static guint g_dalvik_pool_operand_hash(const GDalvikPoolOperand *); +static guint g_dalvik_pool_operand_hash(const GDalvikPoolOperand *, bool); @@ -230,8 +230,9 @@ static void g_dalvik_pool_operand_finalize(GDalvikPoolOperand *operand) /****************************************************************************** * * -* Paramètres : a = premier opérande à consulter. * -* b = second opérande à consulter. * +* Paramètres : a = premier opérande à consulter. * +* b = second opérande à consulter. * +* lock = précise le besoin en verrouillage. * * * * Description : Compare un opérande avec un autre. * * * @@ -241,9 +242,21 @@ static void g_dalvik_pool_operand_finalize(GDalvikPoolOperand *operand) * * ******************************************************************************/ -static int g_dalvik_pool_operand_compare(const GDalvikPoolOperand *a, const GDalvikPoolOperand *b) +static int g_dalvik_pool_operand_compare(const GDalvikPoolOperand *a, const GDalvikPoolOperand *b, bool lock) { int result; /* Bilan à renvoyer */ + lockable_obj_extra_t *ea; /* Données insérées à consulter*/ + lockable_obj_extra_t *eb; /* Données insérées à consulter*/ + GArchOperandClass *class; /* Classe parente normalisée */ + + ea = GET_GOBJECT_EXTRA(G_OBJECT(a), lockable_obj_extra_t); + eb = GET_GOBJECT_EXTRA(G_OBJECT(b), lockable_obj_extra_t); + + if (lock) + { + LOCK_GOBJECT_EXTRA(ea); + LOCK_GOBJECT_EXTRA(eb); + } result = sort_unsigned_long((unsigned long)a->format, (unsigned long)b->format); @@ -253,6 +266,18 @@ static int g_dalvik_pool_operand_compare(const GDalvikPoolOperand *a, const GDal if (result == 0) result = sort_unsigned_long(a->index, b->index); + if (result == 0) + { + class = G_ARCH_OPERAND_CLASS(g_dalvik_pool_operand_parent_class); + result = class->compare(G_ARCH_OPERAND(a), G_ARCH_OPERAND(b), false); + } + + if (lock) + { + UNLOCK_GOBJECT_EXTRA(eb); + UNLOCK_GOBJECT_EXTRA(ea); + } + return result; } @@ -547,6 +572,7 @@ uint32_t g_dalvik_pool_operand_get_index(const GDalvikPoolOperand *operand) /****************************************************************************** * * * Paramètres : operand = objet dont l'instance se veut unique. * +* lock = précise le besoin en verrouillage. * * * * Description : Fournit l'empreinte d'un candidat à une centralisation. * * * @@ -556,17 +582,23 @@ uint32_t g_dalvik_pool_operand_get_index(const GDalvikPoolOperand *operand) * * ******************************************************************************/ -static guint g_dalvik_pool_operand_hash(const GDalvikPoolOperand *operand) +static guint g_dalvik_pool_operand_hash(const GDalvikPoolOperand *operand, bool lock) { guint result; /* Valeur à retourner */ + lockable_obj_extra_t *extra; /* Données insérées à consulter*/ + GArchOperandClass *class; /* Classe parente normalisée */ DalvikPoolType type; /* Type porté par l'opérande */ uint32_t index; /* Indice de l'élément */ - result = (unsigned int)(unsigned long)operand->format; + extra = GET_GOBJECT_EXTRA(G_OBJECT(operand), lockable_obj_extra_t); -#if __SIZEOF_INT__ != __SIZEOF_LONG__ - result ^= ((unsigned long)operand->format) >> 32; -#endif + if (lock) + LOCK_GOBJECT_EXTRA(extra); + + class = G_ARCH_OPERAND_CLASS(g_dalvik_pool_operand_parent_class); + result = class->hash(G_ARCH_OPERAND(operand), false); + + result ^= g_direct_hash(operand->format); type = g_dalvik_pool_operand_get_pool_type(operand); @@ -576,6 +608,9 @@ static guint g_dalvik_pool_operand_hash(const GDalvikPoolOperand *operand) result ^= index; + if (lock) + UNLOCK_GOBJECT_EXTRA(extra); + return result; } |