diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-02-07 23:42:02 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-02-07 23:42:02 (GMT) |
commit | 32bef30025f5e3f513c2b4936c0573cc3b629961 (patch) | |
tree | d4ceb04d4a6357b772a8ea55f8035701c41c6dd0 /plugins/pychrysalide/arch | |
parent | dbdd42585e8aa3333010bd57f0cd1129ac3c1d2f (diff) |
Rewritten some Python instance allocation functions.
Diffstat (limited to 'plugins/pychrysalide/arch')
-rw-r--r-- | plugins/pychrysalide/arch/instriter.c | 43 | ||||
-rw-r--r-- | plugins/pychrysalide/arch/vmpa.c | 104 |
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; } |