summaryrefslogtreecommitdiff
path: root/src/arch/dalvik/register.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-11-27 23:35:47 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-11-27 23:35:47 (GMT)
commit7d6d3acb65586ad9512a38b58c16b9a21cdf98e0 (patch)
tree9ae21078e24c997b80a24d8d71ed5ad1be74c850 /src/arch/dalvik/register.c
parent3eacf14cc395e7fd0ab5dd5e9d22bb93a6a02979 (diff)
Saved memory space by sharing arch GObjects.
Diffstat (limited to 'src/arch/dalvik/register.c')
-rw-r--r--src/arch/dalvik/register.c148
1 files changed, 139 insertions, 9 deletions
diff --git a/src/arch/dalvik/register.c b/src/arch/dalvik/register.c
index ed1b8c6..d112a86 100644
--- a/src/arch/dalvik/register.c
+++ b/src/arch/dalvik/register.c
@@ -28,9 +28,13 @@
#include "../register-int.h"
+#include "../sharing/manager.h"
+/* ------------------------- ENCADREMENT DE REGISTRES BRUTS ------------------------- */
+
+
/* Représentation d'un registre Dalvik (instance) */
struct _GDalvikRegister
{
@@ -58,9 +62,34 @@ static void g_dalvik_register_class_init(GDalvikRegisterClass *);
/* Initialise une instance de registre Dalvik. */
static void g_dalvik_register_init(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 *);
+
/* 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);
+
+
+
+/* -------------------------- PARTAGES DE CONTENUS UNIQUES -------------------------- */
+
+
+/* Gestionnaire des partages d'instances */
+static GShareManager *_dalvik_register_manager = NULL;
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* ENCADREMENT DE REGISTRES BRUTS */
+/* ---------------------------------------------------------------------------------- */
/* Indique le type défini pour une représentation d'un registre Dalvik. */
@@ -85,6 +114,9 @@ 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;
register_class->print = (reg_print_fc)g_dalvik_register_print;
@@ -126,9 +158,11 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index)
{
GDalvikRegister *result; /* Structure à retourner */
- result = g_object_new(G_TYPE_DALVIK_REGISTER, NULL);
+ result = G_DALVIK_REGISTER(g_share_manager_get(_dalvik_register_manager, &index));
+
+ //result = g_object_new(G_TYPE_DALVIK_REGISTER, NULL);
- result->index = index;
+ //result->index = index;
return result;
@@ -137,19 +171,46 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index)
/******************************************************************************
* *
-* Paramètres : reg = registre à consulter. *
+* Paramètres : reg = objet partagé à initialiser. *
+* index = indice du registre correspondant. *
* *
-* Description : Fournit l'indice d'un registre Dalvik. *
+* Description : Initialise un nouvel objet partagé avec des informations. *
* *
-* Retour : Inditifiant représentant le registre. *
+* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
-uint16_t g_dalvik_register_get_index(const GDalvikRegister *reg)
+static bool g_dalvik_register_do_init(GDalvikRegister *reg, const uint16_t *index)
{
- return reg->index;
+ reg->index = *index;
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* 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)
+{
+ bool result; /* Bilan à retourner */
+
+ result = (reg->index == *index);
+
+ return result;
}
@@ -186,14 +247,16 @@ static guint g_dalvik_register_hash(const GDalvikRegister *reg)
* *
******************************************************************************/
-int g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *b)
+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;
@@ -216,7 +279,7 @@ int g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *b
* *
******************************************************************************/
-void g_dalvik_register_print(const GDalvikRegister *reg, GBufferLine *line, AsmSyntax syntax)
+static void g_dalvik_register_print(const GDalvikRegister *reg, GBufferLine *line, AsmSyntax syntax)
{
char key[MAX_REGNAME_LEN]; /* Mot clef principal */
size_t klen; /* Taille de ce mot clef */
@@ -240,3 +303,70 @@ void g_dalvik_register_print(const GDalvikRegister *reg, GBufferLine *line, AsmS
g_buffer_line_append_text(line, BLC_ASSEMBLY, key, klen, RTT_REGISTER, NULL);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : reg = registre à consulter. *
+* *
+* Description : Fournit l'indice d'un registre Dalvik. *
+* *
+* Retour : Inditifiant représentant le registre. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+uint16_t g_dalvik_register_get_index(const GDalvikRegister *reg)
+{
+ return reg->index;
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* PARTAGES DE CONTENUS UNIQUES */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Met en place les mécanismes de partage des registres Dalvik. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool init_dalvik_register_sharing(void)
+{
+ _dalvik_register_manager = g_share_manager_new(G_TYPE_DALVIK_REGISTER);
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Supprime les mécanismes de partage des registres Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void exit_dalvik_register_sharing(void)
+{
+
+
+
+
+}