MSYS2-packages/python-pyalpm/0001-Python2-compat-Module-initialization.patch
Ray Donnelly ff90f3b627 pyalpm: New package
Python wrapper for libalpm and python implementation of
pacman (pycman). Backported to Python 2.
2016-03-12 15:50:58 +00:00

109 lines
2.4 KiB
Diff

From a5e026eb17fd6c32ecb92aa40b71b5c6900fdabe Mon Sep 17 00:00:00 2001
From: Ray Donnelly <mingw.android@gmail.com>
Date: Fri, 11 Mar 2016 11:55:59 +0000
Subject: [PATCH 1/5] Python2 compat: Module initialization
From https://docs.python.org/3/howto/cporting.html
---
src/pyalpm.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 57 insertions(+), 5 deletions(-)
diff --git src/pyalpm.c src/pyalpm.c
index 507f564..47c48cc 100644
--- src/pyalpm.c
+++ src/pyalpm.c
@@ -78,6 +78,28 @@ static PyObject *pyalpm_vercmp(PyObject *self, PyObject *args) {
return PyLong_FromLong(result);
}
+/*
+ https://docs.python.org/3/howto/cporting.html
+*/
+
+struct module_state {
+ PyObject *error;
+};
+
+#if PY_MAJOR_VERSION >= 3
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+#else
+#define GETSTATE(m) (&_state)
+static struct module_state _state;
+#endif
+
+static PyObject *
+error_out(PyObject *m) {
+ struct module_state *st = GETSTATE(m);
+ PyErr_SetString(st->error, "something bad happened");
+ return NULL;
+}
+
static PyMethodDef methods[] = {
{"version", version_alpm, METH_NOARGS, "returns pyalpm version."},
{"alpmversion", alpmversion_alpm, METH_NOARGS, "returns alpm version."},
@@ -101,26 +123,56 @@ static PyMethodDef methods[] = {
{NULL, NULL, 0, NULL}
};
+#if PY_MAJOR_VERSION >= 3
+
+static int pyalpm_traverse(PyObject *m, visitproc visit, void *arg) {
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+static int pyalpm_clear(PyObject *m) {
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
static struct PyModuleDef pyalpm_def = {
PyModuleDef_HEAD_INIT,
"alpm",
"This module wraps the libalpm library",
- -1,
+ sizeof(struct module_state),
methods,
- NULL, NULL, NULL, NULL,
+ NULL,
+ pyalpm_traverse,
+ pyalpm_clear,
+ NULL,
};
-PyMODINIT_FUNC PyInit_pyalpm(void)
-{
- PyObject* m = PyModule_Create(&pyalpm_def);
+#define INITERROR return NULL
+PyMODINIT_FUNC
+PyInit_pyalpm(void)
+
+#else
+#define INITERROR return
+
+void
+initpyalpm(void)
+#endif
+{
+#if PY_MAJOR_VERSION >= 3
+ PyObject *m = PyModule_Create(&pyalpm_def);
+#else
+ PyObject *m = Py_InitModule("pyalpm", methods);
+#endif
init_pyalpm_error(m);
init_pyalpm_handle(m);
init_pyalpm_package(m);
init_pyalpm_db(m);
init_pyalpm_transaction(m);
+#if PY_MAJOR_VERSION >= 3
return m;
+#endif
}
/* vim: set ts=2 sw=2 et: */
--
2.7.1