summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/arch
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-02-07 23:42:02 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-02-07 23:42:02 (GMT)
commit32bef30025f5e3f513c2b4936c0573cc3b629961 (patch)
treed4ceb04d4a6357b772a8ea55f8035701c41c6dd0 /plugins/pychrysalide/arch
parentdbdd42585e8aa3333010bd57f0cd1129ac3c1d2f (diff)
Rewritten some Python instance allocation functions.
Diffstat (limited to 'plugins/pychrysalide/arch')
-rw-r--r--plugins/pychrysalide/arch/instriter.c43
-rw-r--r--plugins/pychrysalide/arch/vmpa.c104
2 files changed, 61 insertions, 86 deletions
diff --git a/plugins/pychrysalide/arch/instriter.c b/plugins/pychrysalide/arch/instriter.c
index 9b149fd..bb1e1a3 100644
--- a/plugins/pychrysalide/arch/instriter.c
+++ b/plugins/pychrysalide/arch/instriter.c
@@ -57,9 +57,6 @@ static PyObject *py_instr_iterator_next(PyInstrIterator *);
/* Initialise un nouvel itérateur. */
static int py_instr_iterator_init(PyInstrIterator *, PyObject *, PyObject *);
-/* Construit un nouvel itérateur. */
-static PyObject *py_instr_iterator_new(PyTypeObject *, PyObject *, PyObject *);
-
/******************************************************************************
@@ -172,44 +169,6 @@ static int py_instr_iterator_init(PyInstrIterator *self, PyObject *args, PyObjec
/******************************************************************************
* *
-* Paramètres : type = type d'objet à mettre en place. *
-* args = arguments passés pour l'appel. *
-* kwds = mots clefs éventuellement fournis en complément. *
-* *
-* Description : Construit un nouvel itérateur. *
-* *
-* Retour : Définition d'objet pour Python. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_instr_iterator_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- PyInstrIterator *result; /* Nouvelle instance à renvoyer*/
- int ret; /* Bilan de l'initialisation */
-
- result = (PyInstrIterator *)type->tp_alloc(type, 0);
-
- if (result != NULL)
- {
- ret = py_instr_iterator_init(result, args, kwds);
-
- if (ret != 0)
- {
- Py_DECREF(result);
- result = NULL;
- }
-
- }
-
- return (PyObject *)result;
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : - *
* *
* Description : Fournit un accès à une définition de type à diffuser. *
@@ -239,7 +198,7 @@ PyTypeObject *get_python_instr_iterator_type(void)
.tp_iternext = (iternextfunc)py_instr_iterator_next,
.tp_init = (initproc)py_instr_iterator_init,
- .tp_new = py_instr_iterator_new,
+ .tp_new = PyType_GenericNew,
};
diff --git a/plugins/pychrysalide/arch/vmpa.c b/plugins/pychrysalide/arch/vmpa.c
index 0474fe0..b042a9f 100644
--- a/plugins/pychrysalide/arch/vmpa.c
+++ b/plugins/pychrysalide/arch/vmpa.c
@@ -70,8 +70,8 @@ static PyObject *py_vmpa_get_value(PyObject *, void *);
/* Définit une partie du contenu de la position représentée. */
static int py_vmpa_set_value(PyObject *, PyObject *, void *);
-/* Crée un nouvel objet Python de type 'vmpa2t'. */
-static PyObject *py_vmpa_new(PyTypeObject *, PyObject *, PyObject *);
+/* Initialise un objet Python de type 'vmpa2t'. */
+static int py_vmpa_init(py_vmpa_t *, PyObject *, PyObject *);
/* Effectue une conversion d'un objet Python en type 'vmpa_t'. */
static bool convert_pyobj_to_vmpa(PyObject *, vmpa2t *);
@@ -130,9 +130,8 @@ static PyObject *py_mrange_get_end_addr(PyObject *, void *);
-
-/* Crée un nouvel objet Python de type 'mrange'. */
-static PyObject *py_mrange_new(PyTypeObject *, PyObject *, PyObject *);
+/* Initialise un objet Python de type 'mrange_t'. */
+static int py_mrange_init(py_mrange_t *, PyObject *, PyObject *);
@@ -380,40 +379,42 @@ static int py_vmpa_set_value(PyObject *self, PyObject *value, void *closure)
/******************************************************************************
* *
-* Paramètres : type = type de l'objet à instancier. *
-* args = arguments fournis à l'appel. *
-* kwds = arguments de type key=val fournis. *
+* Paramètres : self = instance d'objet à initialiser. *
+* args = arguments passés pour l'appel. *
+* kwds = mots clefs éventuellement fournis en complément. *
* *
-* Description : Crée un nouvel objet Python de type 'vmpa2t'. *
+* Description : Initialise un objet Python de type 'vmpa2t'. *
* *
-* Retour : Instance Python mise en place. *
+* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
-static PyObject *py_vmpa_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+static int py_vmpa_init(py_vmpa_t *self, PyObject *args, PyObject *kwds)
{
- py_vmpa_t *result; /* Instance à retourner */
+ int result; /* Bilan à retourner */
unsigned long long phy; /* Position physique */
unsigned long long virt; /* Adresse en mémoire virtuelle*/
int ret; /* Bilan de lecture des args. */
+ result = -1;
+
phy = VMPA_NO_PHYSICAL;
virt = VMPA_NO_VIRTUAL;
ret = PyArg_ParseTuple(args, "|KK", &phy, &virt);
- if (!ret) return NULL;
-
- result = (py_vmpa_t *)type->tp_alloc(type, 0);
+ if (!ret) goto exit;
- init_vmpa(&result->addr, phy, virt);
+ init_vmpa(&self->addr, phy, virt);
- return (PyObject *)result;
+ result = 0;
-}
+ exit:
+ return result;
+}
@@ -637,7 +638,9 @@ PyTypeObject *get_python_vmpa_type(void)
.tp_richcompare = py_vmpa_richcompare,
.tp_getset = py_vmpa_getseters,
- .tp_new = py_vmpa_new
+
+ .tp_init = (initproc)py_vmpa_init,
+ .tp_new = PyType_GenericNew,
};
@@ -723,16 +726,19 @@ vmpa2t *get_internal_vmpa(PyObject *obj)
PyObject *build_from_internal_vmpa(const vmpa2t *addr)
{
- py_vmpa_t *result; /* Instance à retourner */
+ PyObject *result; /* Instance à retourner */
PyTypeObject *type; /* Type à instancier */
+ PyObject *args; /* Liste des arguments d'appel */
type = get_python_vmpa_type();
- result = (py_vmpa_t *)type->tp_alloc(type, 0);
+ args = Py_BuildValue("KK", get_phy_addr(addr), get_virt_addr(addr));
- copy_vmpa(&result->addr, addr);
+ result = PyObject_CallObject((PyObject *)type, args);
- return (PyObject *)result;
+ Py_DECREF(args);
+
+ return result;
}
@@ -1122,45 +1128,46 @@ static PyObject *py_mrange_get_end_addr(PyObject *self, void *closure)
/******************************************************************************
* *
-* Paramètres : type = type de l'objet à instancier. *
-* args = arguments fournis à l'appel. *
-* kwds = arguments de type key=val fournis. *
+* Paramètres : self = instance d'objet à initialiser. *
+* args = arguments passés pour l'appel. *
+* kwds = mots clefs éventuellement fournis en complément. *
* *
-* Description : Crée un nouvel objet Python de type 'mrange'. *
+* Description : Initialise un objet Python de type 'mrange_t'. *
* *
-* Retour : Instance Python mise en place. *
+* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
-static PyObject *py_mrange_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+static int py_mrange_init(py_mrange_t *self, PyObject *args, PyObject *kwds)
{
- py_mrange_t *result; /* Instance à retourner */
+ int result; /* Bilan à retourner */
PyObject *py_vmpa; /* Localisation version Python */
unsigned long long length; /* Taille physique */
int ret; /* Bilan de lecture des args. */
vmpa2t *addr; /* Localisation version C */
+ result = -1;
+
ret = PyArg_ParseTuple(args, "OK", &py_vmpa, &length);
- if (!ret) return NULL;
+ if (!ret) goto exit;
ret = PyObject_IsInstance(py_vmpa, (PyObject *)get_python_vmpa_type());
- if (!ret) return NULL;
+ if (!ret) goto exit;
addr = get_internal_vmpa(py_vmpa);
- if (addr == NULL) return NULL;
+ if (addr == NULL) goto exit;
- result = (py_mrange_t *)type->tp_alloc(type, 0);
+ init_mrange(&self->range, addr, length);
- init_mrange(&result->range, addr, length);
-
- return (PyObject *)result;
-
-}
+ result = 0;
+ exit:
+ return result;
+}
@@ -1231,7 +1238,9 @@ PyTypeObject *get_python_mrange_type(void)
.tp_methods = py_mrange_methods,
.tp_getset = py_mrange_getseters,
- .tp_new = py_mrange_new
+
+ .tp_init = (initproc)py_mrange_init,
+ .tp_new = PyType_GenericNew,
};
@@ -1314,15 +1323,22 @@ mrange_t *get_internal_mrange(PyObject *obj)
PyObject *build_from_internal_mrange(const mrange_t *range)
{
- py_mrange_t *result; /* Instance à retourner */
+ PyObject *result; /* Instance à retourner */
PyTypeObject *type; /* Type à instancier */
+ PyObject *addr_obj; /* Objet pour l'adresse de base*/
+ PyObject *args; /* Liste des arguments d'appel */
type = get_python_mrange_type();
- result = (py_mrange_t *)type->tp_alloc(type, 0);
+ addr_obj = build_from_internal_vmpa(get_mrange_addr(range));
- copy_mrange(&result->range, range);
+ args = Py_BuildValue("OK", addr_obj, get_mrange_length(range));
- return (PyObject *)result;
+ result = PyObject_CallObject((PyObject *)type, args);
+
+ Py_DECREF(args);
+ Py_DECREF(addr_obj);
+
+ return result;
}