[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH for-next v2 v2 4/5] pygrub: make it build 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 and provide compatibility for 2.5 and earlier. 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> --- v2: use PyBytes. --- tools/pygrub/src/fsimage/fsimage.c | 96 ++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 8 deletions(-) diff --git a/tools/pygrub/src/fsimage/fsimage.c b/tools/pygrub/src/fsimage/fsimage.c index 743a3fb7b8..7e124f7bb3 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 @@ -66,12 +70,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); @@ -91,12 +107,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); } @@ -113,11 +137,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) @@ -128,16 +154,25 @@ fsimage_file_dealloc(fsimage_file_t *file) PyObject_DEL(file); } +/* Compatibility for 2.5 and earlier */ +#ifndef PyVarObject_HEAD_INIT +#define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, +#endif + 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 */ @@ -151,7 +186,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 }; @@ -215,11 +259,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) @@ -232,14 +278,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 */ @@ -253,7 +302,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 }; @@ -316,8 +374,30 @@ 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 + 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |