From: Wei Liu <wei.liu2@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Anthony PERARD <anthony.perard@citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>,
Wei Liu <wei.liu2@citrix.com>,
George Dunlap <george.dunlap@eu.citrix.com>
Subject: [PATCH v3 7/7] pygrub/fsimage: make it work with python 3
Date: Mon, 11 Mar 2019 13:04:34 +0000 [thread overview]
Message-ID: <20190311130434.10437-8-wei.liu2@citrix.com> (raw)
In-Reply-To: <20190311130434.10437-1-wei.liu2@citrix.com>
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@citrix.com>
---
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@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-03-11 13:04 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-11 13:04 [PATCH v3 0/7] tools: Python 3 compatibility Wei Liu
2019-03-11 13:04 ` [PATCH v3 1/7] Update python requirement Wei Liu
2019-03-11 13:08 ` Andrew Cooper
2019-03-11 14:39 ` Wei Liu
2019-03-11 13:04 ` [PATCH v3 2/7] pygrub/fsimage: drop unused struct Wei Liu
2019-03-11 13:08 ` Andrew Cooper
2019-03-11 13:04 ` [PATCH v3 3/7] pygrub: change tabs into spaces Wei Liu
2019-03-11 13:10 ` Andrew Cooper
2019-03-11 13:04 ` [PATCH v3 4/7] build/m4: make python_devel.m4 work with both python 2 and 3 Wei Liu
2019-03-11 13:04 ` [PATCH v3 5/7] libxl: make python scripts work with python 2.6 and up Wei Liu
2019-03-11 13:11 ` Andrew Cooper
2019-03-11 13:04 ` [PATCH v3 6/7] pygrub: make python scripts work with " Wei Liu
2019-03-11 13:20 ` Andrew Cooper
2019-03-11 13:04 ` Wei Liu [this message]
2019-03-11 14:41 ` [PATCH v3 8/7] pygrub/fsimage: use named initialisation in extension Wei Liu
2019-03-11 14:47 ` Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190311130434.10437-8-wei.liu2@citrix.com \
--to=wei.liu2@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@citrix.com \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.