summaryrefslogtreecommitdiff
path: root/plugins/dalvik/register.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-10-25 19:39:15 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-10-25 19:39:15 (GMT)
commit8a4274cb6a99184ff4d9203c784ffd1e78550002 (patch)
treeff3a3a5091b90e1cb1958924acf5119b115d656e /plugins/dalvik/register.c
parente6180b353a5177238b4e77946ff44505854e12f8 (diff)
Created a cache for Dalvik registers.
Diffstat (limited to 'plugins/dalvik/register.c')
-rw-r--r--plugins/dalvik/register.c124
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;
+
+}