diff options
Diffstat (limited to 'miasm2/jitter/arch/JitCore_x86.c')
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 88 |
1 files changed, 35 insertions, 53 deletions
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index a13b6881..50ce6bd5 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -2,6 +2,7 @@ #include "structmember.h" #include <stdint.h> #include <inttypes.h> +#include "../compat_py23.h" #include "../queue.h" #include "../vm_mngr.h" #include "../vm_mngr_py.h" @@ -10,6 +11,7 @@ #include "../op_semantics.h" #include "JitCore_x86.h" + vm_cpu_t ref_arch_regs; reg_dict gpreg_dict[] = { @@ -161,13 +163,11 @@ PyObject* cpu_get_gpreg(JitCpu* self) } - - - PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) { PyObject* dict; PyObject *d_key, *d_value = NULL; + char* d_key_name; Py_ssize_t pos = 0; uint64_t val; unsigned int i, found; @@ -177,12 +177,10 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ - if(!PyString_Check(d_key)) - RAISE(PyExc_TypeError, "key must be str"); - + PyGetStr(d_key_name, d_key); found = 0; for (i=0; i < sizeof(gpreg_dict)/sizeof(reg_dict); i++){ - if (strcmp(PyString_AsString(d_key), gpreg_dict[i].name)) + if (strcmp(d_key_name, gpreg_dict[i].name)) continue; found = 1; switch (gpreg_dict[i].size) { @@ -213,7 +211,16 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) PyObject* cst_ffffffff; uint64_t tmp; - /* Ensure py_long is a PyLong */ + +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(py_long)){ + /* Already PyLong */ + /* Increment ref as we will decement it next */ + Py_INCREF(py_long); + } else { + RAISE(PyExc_TypeError,"arg must be int"); + } +#else if (PyInt_Check(py_long)){ tmp = (uint64_t)PyInt_AsLong(py_long); py_long = PyLong_FromLong((long)tmp); @@ -225,6 +232,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) else{ RAISE(PyExc_TypeError,"arg must be int"); } +#endif cst_ffffffff = PyLong_FromLong(0xffffffff); @@ -254,7 +262,7 @@ PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) if (found) continue; - fprintf(stderr, "unknown key: %s\n", PyString_AsString(d_key)); + fprintf(stderr, "unknown key: %s\n", d_key_name); RAISE(PyExc_ValueError, "unknown reg"); } Py_INCREF(Py_None); @@ -437,7 +445,7 @@ PyObject* cpu_get_segm_base(JitCpu* self, PyObject* args) if (!PyArg_ParseTuple(args, "O", &item1)) RAISE(PyExc_TypeError,"Cannot parse arguments"); PyGetInt(item1, segm_num); - v = PyInt_FromLong((long)(((vm_cpu_t*)self->cpu)->segm_base[segm_num])); + v = PyLong_FromLong((long)(((vm_cpu_t*)self->cpu)->segm_base[segm_num])); return v; } @@ -484,11 +492,11 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args) PyGetInt(py_addr, addr); - if(!PyString_Check(py_buffer)) - RAISE(PyExc_TypeError,"arg must be str"); + if(!PyBytes_Check(py_buffer)) + RAISE(PyExc_TypeError,"arg must be bytes"); - size = PyString_Size(py_buffer); - PyString_AsStringAndSize(py_buffer, &buffer, &py_length); + size = PyBytes_Size(py_buffer); + PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length); ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size); if (ret < 0) @@ -865,9 +873,8 @@ static PyGetSetDef JitCpu_getseters[] = { static PyTypeObject JitCpuType = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "JitCore_x86.JitCpu", /*tp_name*/ + PyVarObject_HEAD_INIT(NULL, 0) + "JitCore_x86.JitCpu", /*tp_name*/ sizeof(JitCpu), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)JitCpu_dealloc,/*tp_dealloc*/ @@ -918,47 +925,22 @@ static PyMethodDef JitCore_x86_Methods[] = { }; -static PyObject *JitCore_x86_Error; -PyMODINIT_FUNC -initJitCore_x86(void) +MOD_INIT(JitCore_x86) { - PyObject *m; + PyObject *module; - if (PyType_Ready(&JitCpuType) < 0) - return; + MOD_DEF(module, "JitCore_x86", "JitCore_x86 module", JitCore_x86_Methods); - m = Py_InitModule("JitCore_x86", JitCore_x86_Methods); - if (m == NULL) - return; + if (module == NULL) + return NULL; - JitCore_x86_Error = PyErr_NewException("JitCore_x86.error", NULL, NULL); - Py_INCREF(JitCore_x86_Error); - PyModule_AddObject(m, "error", JitCore_x86_Error); + if (PyType_Ready(&JitCpuType) < 0) + return NULL; - Py_INCREF(&JitCpuType); - PyModule_AddObject(m, "JitCpu", (PyObject *)&JitCpuType); + Py_INCREF(&JitCpuType); + if (PyModule_AddObject(module, "JitCpu", (PyObject *)&JitCpuType) < 0) + return NULL; + return module; } - - - - - - - - - - - - - - - - - - - - - - |