about summary refs log tree commit diff stats
path: root/miasm2/jitter/arch/JitCore_x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter/arch/JitCore_x86.c')
-rw-r--r--miasm2/jitter/arch/JitCore_x86.c88
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;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-