diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-10-25 19:39:15 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-10-25 19:39:15 (GMT) |
commit | 8a4274cb6a99184ff4d9203c784ffd1e78550002 (patch) | |
tree | ff3a3a5091b90e1cb1958924acf5119b115d656e /plugins/dalvik/register.c | |
parent | e6180b353a5177238b4e77946ff44505854e12f8 (diff) |
Created a cache for Dalvik registers.
Diffstat (limited to 'plugins/dalvik/register.c')
-rw-r--r-- | plugins/dalvik/register.c | 124 |
1 files changed, 123 insertions, 1 deletions
diff --git a/plugins/dalvik/register.c b/plugins/dalvik/register.c index 00e9757..2e7b7c6 100644 --- a/plugins/dalvik/register.c +++ b/plugins/dalvik/register.c @@ -24,6 +24,7 @@ #include "register.h" +#include <malloc.h> #include <stdio.h> @@ -32,6 +33,9 @@ +/* ------------------------- GESTION UNITAIRE DES REGISTRES ------------------------- */ + + /* Représentation d'un registre Dalvik (instance) */ struct _GDalvikRegister { @@ -71,6 +75,27 @@ static guint g_dalvik_register_hash(const GDalvikRegister *); /* Traduit un registre en version humainement lisible. */ static void g_dalvik_register_print(const GDalvikRegister *, GBufferLine *, AsmSyntax); +/* Crée une réprésentation de registre Dalvik. */ +GDalvikRegister *_g_dalvik_register_new(uint16_t); + + + +/* ------------------------ GESTION SOUS FORME DE SINGLETONS ------------------------ */ + + +/* Conservation des registres utilisés */ +static GDalvikRegister **_dalvik_registers = NULL; +static uint16_t _dreg_count = 0; + + +/* Fournit le singleton associé à un registre Dalvik. */ +static GDalvikRegister *get_dalvik_register(uint16_t); + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION UNITAIRE DES REGISTRES */ +/* ---------------------------------------------------------------------------------- */ /* Indique le type défini pour une représentation d'un registre Dalvik. */ @@ -235,7 +260,7 @@ static void g_dalvik_register_print(const GDalvikRegister *reg, GBufferLine *lin * * ******************************************************************************/ -GDalvikRegister *g_dalvik_register_new(uint16_t index) +GDalvikRegister *_g_dalvik_register_new(uint16_t index) { GDalvikRegister *result; /* Structure à retourner */ @@ -250,6 +275,29 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index) /****************************************************************************** * * +* Paramètres : index = indice du registre correspondant. * +* * +* Description : Crée une réprésentation de registre Dalvik. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GDalvikRegister *g_dalvik_register_new(uint16_t index) +{ + GDalvikRegister *result; /* Structure à retourner */ + + result = get_dalvik_register(index); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : reg = registre à consulter. * * * * Description : Fournit l'indice d'un registre Dalvik. * @@ -289,3 +337,77 @@ int g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *b return result; } + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION SOUS FORME DE SINGLETONS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : index = indice du registre correspondant. * +* * +* Description : Fournit le singleton associé à un registre Dalvik. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GDalvikRegister *get_dalvik_register(uint16_t index) +{ + GDalvikRegister *result; /* Structure à retourner */ + uint16_t i; /* Boucle de parcours */ + + if (index >= _dreg_count) + { + _dalvik_registers = realloc(_dalvik_registers, (index + 1) * sizeof(GDalvikRegister *)); + + for (i = _dreg_count; i < (index + 1); i++) + _dalvik_registers[i] = NULL; + + _dreg_count = index + 1; + + } + + if (_dalvik_registers[index] == NULL) + _dalvik_registers[index] = _g_dalvik_register_new(index); + + result = _dalvik_registers[index]; + + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Vide totalement le cache des registres Dalvik. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void clean_dalvik_register_cache(void) +{ + uint16_t i; /* Boucle de parcours */ + + for (i = 0; i < _dreg_count; i++) + g_object_unref(G_OBJECT(_dalvik_registers[i])); + + if (_dalvik_registers != NULL) + free(_dalvik_registers); + + _dalvik_registers = NULL; + _dreg_count = 0; + +} |