From: Wei Liu <wei.liu2@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: George Dunlap <george.dunlap@eu.citrix.com>,
Anthony PERARD <anthony.perard@citrix.com>,
Wei Liu <wei.liu2@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [PATCH for-next v2 v2 4/5] pygrub: make it build with python 3
Date: Wed, 6 Mar 2019 17:52:09 +0000 [thread overview]
Message-ID: <20190306175210.28145-5-wei.liu2@citrix.com> (raw)
In-Reply-To: <20190306175210.28145-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 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@citrix.com>
---
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@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-03-06 17:52 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-06 17:52 [PATCH for-next v2 v2 0/5] tools: Python 3 compatibility Wei Liu
2019-03-06 17:52 ` [PATCH for-next v2 v2 1/5] build/m4: make python_devel.m4 work with both python 2 and 3 Wei Liu
2019-03-07 11:14 ` Anthony PERARD
2019-03-06 17:52 ` [PATCH for-next v2 v2 2/5] libxl: make python scripts work with python 2.6 and up Wei Liu
2019-03-06 18:20 ` Andrew Cooper
2019-03-06 20:58 ` Hans van Kranenburg
2019-03-07 10:37 ` Wei Liu
2019-03-07 11:30 ` Wei Liu
2019-03-06 17:52 ` [PATCH for-next v2 v2 3/5] pygrub: convert python scripts to work with " Wei Liu
2019-03-06 18:23 ` Andrew Cooper
2019-03-06 17:52 ` Wei Liu [this message]
2019-03-06 18:46 ` [PATCH for-next v2 v2 4/5] pygrub: make it build with python 3 Andrew Cooper
2019-03-06 17:52 ` [PATCH for-next v2 v2 5/5] Update python requirement Wei Liu
2019-03-07 11:21 ` Anthony PERARD
2019-03-07 11:24 ` Wei Liu
2019-03-06 18:17 ` [PATCH for-next v2 v2 0/5] tools: Python 3 compatibility Wei Liu
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=20190306175210.28145-5-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.