From a5e026eb17fd6c32ecb92aa40b71b5c6900fdabe Mon Sep 17 00:00:00 2001 From: Ray Donnelly 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