[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v3 7/7] pygrub/fsimage: make it work with python 3



With the help of two porting guides and cpython source code:

1. Use PyBytes to replace PyString counterparts.
2. Use PyVarObject_HEAD_INIT.
3. Remove usage of Py_FindMethod.
4. Use new module initialisation routine.

For #3, Py_FindMethod was removed, yet an alternative wasn't
documented.  The code is the result of reverse-engineering cpython
commit 6116d4a1d1

https://docs.python.org/3/howto/cporting.html
http://python3porting.com/cextensions.html

Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
v3: use PyType_Ready to initialise types.
v2: use PyBytes.
---
 tools/pygrub/src/fsimage/fsimage.c | 92 ++++++++++++++++++++++++++++++++++----
 1 file changed, 84 insertions(+), 8 deletions(-)

diff --git a/tools/pygrub/src/fsimage/fsimage.c 
b/tools/pygrub/src/fsimage/fsimage.c
index 780207791c..057786d678 100644
--- a/tools/pygrub/src/fsimage/fsimage.c
+++ b/tools/pygrub/src/fsimage/fsimage.c
@@ -26,11 +26,15 @@
 #include <xenfsimage.h>
 #include <stdlib.h>
 
+#if PY_MAJOR_VERSION < 3
 #if (PYTHON_API_VERSION >= 1011)
 #define PY_PAD 
0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L
 #else
 #define PY_PAD 0L,0L,0L,0L
 #endif
+#else
+#define PY_PAD 0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L
+#endif
 
 typedef struct fsimage_fs {
        PyObject_HEAD
@@ -59,12 +63,24 @@ fsimage_file_read(fsimage_file_t *file, PyObject *args, 
PyObject *kwargs)
 
        bufsize = size ? size : 4096;
 
-       if ((buffer = PyString_FromStringAndSize(NULL, bufsize)) == NULL)
+       buffer =
+#if PY_MAJOR_VERSION < 3
+               PyString_FromStringAndSize(NULL, bufsize);
+#else
+               PyBytes_FromStringAndSize(NULL, bufsize);
+#endif
+
+       if (buffer == NULL)
                return (NULL);
  
        while (1) {
                int err;
-               void *buf = PyString_AS_STRING(buffer) + bytesread;
+               void *buf =
+#if PY_MAJOR_VERSION < 3
+                       PyString_AS_STRING(buffer) + bytesread;
+#else
+                       PyBytes_AS_STRING(buffer) + bytesread;
+#endif
 
                err = fsi_pread_file(file->file, buf, bufsize,
                    bytesread + offset);
@@ -84,12 +100,20 @@ fsimage_file_read(fsimage_file_t *file, PyObject *args, 
PyObject *kwargs)
                        if (bufsize == 0)
                                break;
                } else {
+#if PY_MAJOR_VERSION < 3
                        if (_PyString_Resize(&buffer, bytesread + bufsize) < 0)
+#else
+                       if (_PyBytes_Resize(&buffer, bytesread + bufsize) < 0)
+#endif
                                return (NULL);
                }
        }
 
+#if PY_MAJOR_VERSION < 3
        _PyString_Resize(&buffer, bytesread);
+#else
+       _PyBytes_Resize(&buffer, bytesread);
+#endif
        return (buffer);
 }
 
@@ -106,11 +130,13 @@ static struct PyMethodDef fsimage_file_methods[] = {
        { NULL, NULL, 0, NULL } 
 };
 
+#if PY_MAJOR_VERSION < 3
 static PyObject *
 fsimage_file_getattr(fsimage_file_t *file, char *name)
 {
        return (Py_FindMethod(fsimage_file_methods, (PyObject *)file, name));
 }
+#endif
 
 static void
 fsimage_file_dealloc(fsimage_file_t *file)
@@ -123,14 +149,17 @@ fsimage_file_dealloc(fsimage_file_t *file)
 
 static char fsimage_file_type__doc__[] = "Filesystem image file";
 PyTypeObject fsimage_file_type = {
-       PyObject_HEAD_INIT(&PyType_Type)
-       0,                                      /* ob_size */
+       PyVarObject_HEAD_INIT(&PyType_Type, 0)
        "xenfsimage.file",                      /* tp_name */
        sizeof(fsimage_file_t),                 /* tp_size */
        0,                                      /* tp_itemsize */
        (destructor) fsimage_file_dealloc,      /* tp_dealloc */
        0,                                      /* tp_print */
+#if PY_MAJOR_VERSION < 3
        (getattrfunc) fsimage_file_getattr,     /* tp_getattr */
+#else
+       0,                                      /* tp_getattr */
+#endif
        0,                                      /* tp_setattr */
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
@@ -144,7 +173,16 @@ PyTypeObject fsimage_file_type = {
        0,                                      /* tp_setattro */
        0,                                      /* tp_as_buffer */
        Py_TPFLAGS_DEFAULT,                     /* tp_flags */
-       fsimage_file_type__doc__,
+       fsimage_file_type__doc__,               /* tp_doc */
+#if PY_MAJOR_VERSION >= 3
+       0,                                      /* tp_traverse */
+       0,                                      /* tp_clear */
+       0,                                      /* tp_richcompare */
+       0,                                      /* tp_weaklistoffset */
+       0,                                      /* tp_iter */
+       0,                                      /* tp_iternext */
+       fsimage_file_methods,                   /* tp_methods */
+#endif
        PY_PAD
 };
 
@@ -208,11 +246,13 @@ static struct PyMethodDef fsimage_fs_methods[] = {
        { NULL, NULL, 0, NULL } 
 };
 
+#if PY_MAJOR_VERSION < 3
 static PyObject *
 fsimage_fs_getattr(fsimage_fs_t *fs, char *name)
 {
        return (Py_FindMethod(fsimage_fs_methods, (PyObject *)fs, name));
 }
+#endif
 
 static void
 fsimage_fs_dealloc (fsimage_fs_t *fs)
@@ -225,14 +265,17 @@ fsimage_fs_dealloc (fsimage_fs_t *fs)
 PyDoc_STRVAR(fsimage_fs_type__doc__, "Filesystem image");
 
 PyTypeObject fsimage_fs_type = {
-       PyObject_HEAD_INIT(&PyType_Type)
-       0,                                      /* ob_size */
+       PyVarObject_HEAD_INIT(&PyType_Type, 0)
        "xenfsimage.fs",                        /* tp_name */
        sizeof(fsimage_fs_t),                   /* tp_size */
        0,                                      /* tp_itemsize */
        (destructor) fsimage_fs_dealloc,        /* tp_dealloc */
        0,                                      /* tp_print */
+#if PY_MAJOR_VERSION < 3
        (getattrfunc) fsimage_fs_getattr,       /* tp_getattr */
+#else
+       0,                                      /* tp_getattr */
+#endif
        0,                                      /* tp_setattr */
        0,                                      /* tp_compare */
        0,                                      /* tp_repr */
@@ -246,7 +289,16 @@ PyTypeObject fsimage_fs_type = {
        0,                                      /* tp_setattro */
        0,                                      /* tp_as_buffer */
        Py_TPFLAGS_DEFAULT,                     /* tp_flags */
-       fsimage_fs_type__doc__,
+       fsimage_fs_type__doc__,                 /* tp_doc */
+#if PY_MAJOR_VERSION >= 3
+       0,                                      /* tp_traverse */
+       0,                                      /* tp_clear */
+       0,                                      /* tp_richcompare */
+       0,                                      /* tp_weaklistoffset */
+       0,                                      /* tp_iter */
+       0,                                      /* tp_iternext */
+       fsimage_fs_methods,                     /* tp_methods */
+#endif
        PY_PAD
 };
 
@@ -309,8 +361,32 @@ static struct PyMethodDef fsimage_module_methods[] = {
        { NULL, NULL, 0, NULL }
 };
 
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef fsimage_module_def = {
+       PyModuleDef_HEAD_INIT,
+       "xenfsimage",           /* m_name */
+       "",                     /* m_doc */
+       -1,                     /* m_size */
+       fsimage_module_methods, /* m_methods */
+       NULL,                   /* m_reload */
+       NULL,                   /* m_traverse */
+       NULL,                   /* m_clear */
+       NULL                    /* m_free */
+};
+#endif
+
 PyMODINIT_FUNC
+#if PY_MAJOR_VERSION >= 3
+PyInit_xenfsimage(void)
+#else
 initxenfsimage(void)
+#endif
 {
+#if PY_MAJOR_VERSION < 3
        Py_InitModule("xenfsimage", fsimage_module_methods);
+#else
+       if (PyType_Ready(&fsimage_fs_type) < 0 || 
PyType_Ready(&fsimage_file_type) < 0)
+               return NULL;
+       return PyModule_Create(&fsimage_module_def);
+#endif
 }
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.