From ceeba88cafc4c7d2c625e53fb175b763e480f6ba Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 19 Jun 2018 20:19:56 +0200
Subject: Provided instruction unique identifiers as requested.

---
 plugins/pychrysalide/arch/instruction.c | 37 +++++++++++++++++++++++++++++++++
 src/arch/instruction.c                  | 23 ++++++++++++++++++++
 src/arch/instruction.h                  |  2 +-
 3 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/plugins/pychrysalide/arch/instruction.c b/plugins/pychrysalide/arch/instruction.c
index bb977ce..7d5462d 100644
--- a/plugins/pychrysalide/arch/instruction.c
+++ b/plugins/pychrysalide/arch/instruction.c
@@ -49,6 +49,9 @@
 
 
 
+/* Fournit l'identifiant unique pour un ensemble d'instructions. */
+static PyObject *py_arch_instruction_get_unique_id(PyObject *, void *);
+
 /* Fournit la place mémoire d'une instruction. */
 static PyObject *py_arch_instruction_get_range(PyObject *, void *);
 
@@ -207,6 +210,36 @@ static PyObject *py_arch_instruction_get_destinations(PyObject *self, void *unus
 *  Paramètres  : self    = classe représentant une instruction.               *
 *                closure = adresse non utilisée ici.                          *
 *                                                                             *
+*  Description : Fournit l'identifiant unique pour un ensemble d'instructions.*
+*                                                                             *
+*  Retour      : Identifiant unique par type d'instruction et architecture.   *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_arch_instruction_get_unique_id(PyObject *self, void *closure)
+{
+    PyObject *result;                       /* Conversion à retourner      */
+    GArchInstruction *instr;                /* Version native              */
+    itid_t uid;                             /* Identifiant unique associé  */
+
+    instr = G_ARCH_INSTRUCTION(pygobject_get(self));
+
+    uid = g_arch_instruction_get_unique_id(instr);
+
+    result = PyLong_FromUnsignedLong(uid);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self    = classe représentant une instruction.               *
+*                closure = adresse non utilisée ici.                          *
+*                                                                             *
 *  Description : Fournit la place mémoire d'une instruction.                  *
 *                                                                             *
 *  Retour      : Valeur associée à la propriété consultée.                    *
@@ -384,6 +417,10 @@ PyTypeObject *get_python_arch_instruction_type(void)
 
     static PyGetSetDef py_arch_instruction_getseters[] = {
         {
+            "uid", py_arch_instruction_get_unique_id, NULL,
+            "Provide the unique identification number given to this kind of instruction.", NULL
+        },
+        {
             "range", py_arch_instruction_get_range, py_arch_instruction_set_range,
             "Give access to the memory range covered by the current instruction.", NULL
         },
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index e2d8d2a..212b5b5 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -273,6 +273,29 @@ bool g_arch_instruction_set_flag(GArchInstruction *instr, ArchInstrFlag flag)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : instr = instruction quelconque à consulter.                  *
+*                                                                             *
+*  Description : Fournit l'identifiant unique pour un ensemble d'instructions.*
+*                                                                             *
+*  Retour      : Identifiant unique par type d'instruction et architecture.   *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+itid_t g_arch_instruction_get_unique_id(const GArchInstruction *instr)
+{
+    itid_t result;                          /* Numéro à retourner          */
+
+    result = instr->uid;
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : instr = instruction quelconque à modifier.                   *
 *                                                                             *
 *  Description : Fournit les informations complémentaires d'une instruction.  *
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index 2201dd5..d89158e 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -90,7 +90,7 @@ bool g_arch_instruction_set_flag(GArchInstruction *, ArchInstrFlag);
 ArchInstrFlag g_arch_instruction_get_flags(const GArchInstruction *);
 
 /* Fournit l'identifiant unique pour un ensemble d'instructions. */
-itid_t g_arch_instruction_get_type_id(const GArchInstruction *instr);
+itid_t g_arch_instruction_get_unique_id(const GArchInstruction *);
 
 
 /**
-- 
cgit v0.11.2-87-g4458