Skip to content
Snippets Groups Projects
Commit d4a89710 authored by Guilhem Saurel's avatar Guilhem Saurel
Browse files

module initialization compatible with python 2 & 3

parent 2c6f3151
No related branches found
No related tags found
No related merge requests found
...@@ -72,7 +72,9 @@ extern PyObject* realTimeLoggerDestroy(PyObject* self, PyObject* args); ...@@ -72,7 +72,9 @@ extern PyObject* realTimeLoggerDestroy(PyObject* self, PyObject* args);
extern PyObject* realTimeLoggerInstance(PyObject* self, PyObject* args); extern PyObject* realTimeLoggerInstance(PyObject* self, PyObject* args);
} // namespace debug } // namespace debug
PyObject* dgpyError; struct module_state {
PyObject* dgpyError;
};
/** /**
\brief plug a signal into another one. \brief plug a signal into another one.
...@@ -140,6 +142,25 @@ PyObject* enableTrace(PyObject* /*self*/, PyObject* args) { ...@@ -140,6 +142,25 @@ PyObject* enableTrace(PyObject* /*self*/, PyObject* args) {
} }
return Py_BuildValue(""); return Py_BuildValue("");
} }
#if PY_MAJOR_VERSION >= 3
#define GETSTATE(m) ((struct dynamicgraph::python::module_state*)PyModule_GetState(m))
#else
#define GETSTATE(m) (&dynamicgraph::python::_state)
static struct dynamicgraph::python::module_state _state;
#endif
static PyObject *
#if PY_MAJOR_VERSION >= 3
error_out(PyObject* m, PyObject*) {
struct module_state *st = GETSTATE(m);
#else
error_out(PyObject*, PyObject*) {
struct module_state *st = &dynamicgraph::python::_state;
#endif
PyErr_SetString(st->dgpyError, "something bad happened");
return NULL;
}
} // namespace python } // namespace python
} // namespace dynamicgraph } // namespace dynamicgraph
...@@ -219,18 +240,53 @@ static PyMethodDef dynamicGraphMethods[] = { ...@@ -219,18 +240,53 @@ static PyMethodDef dynamicGraphMethods[] = {
"Destroy the real time logger."}, "Destroy the real time logger."},
{"real_time_logger_instance", dynamicgraph::python::debug::realTimeLoggerInstance, METH_VARARGS, {"real_time_logger_instance", dynamicgraph::python::debug::realTimeLoggerInstance, METH_VARARGS,
"Starts the real time logger."}, "Starts the real time logger."},
{"error_out", (PyCFunction)dynamicgraph::python::error_out, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL} /* Sentinel */ {NULL, NULL, 0, NULL} /* Sentinel */
}; };
PyMODINIT_FUNC initwrap(void) { #if PY_MAJOR_VERSION >= 3
PyObject* m;
static struct PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT,
"dynamic_graph",
NULL,
sizeof(struct dynamicgraph::python::module_state),
dynamicGraphMethods,
NULL,
NULL,
NULL,
NULL
};
#define INITERROR return NULL
PyMODINIT_FUNC
PyInit_dynamic_graph(void)
m = Py_InitModule("wrap", dynamicGraphMethods); #else
if (m == NULL) return; #define INITERROR return
std::string msg("dynamic_graph.error"); void
initdynamic_graph(void)
#endif
{
#if PY_MAJOR_VERSION >= 3
PyObject *module = PyModule_Create(&moduledef);
#else
PyObject *module = Py_InitModule("dynamic_graph", dynamicGraphMethods);
#endif
if (module == NULL)
INITERROR;
struct dynamicgraph::python::module_state *st = GETSTATE(module);
st->dgpyError = PyErr_NewException(const_cast<char*>("dynamic_graph.dgpyError"), NULL, NULL);
if (st->dgpyError == NULL) {
Py_DECREF(module);
INITERROR;
}
dynamicgraph::python::dgpyError = PyErr_NewException(const_cast<char*>(msg.c_str()), NULL, NULL); #if PY_MAJOR_VERSION >= 3
Py_INCREF(dynamicgraph::python::dgpyError); return module;
PyModule_AddObject(m, "error", dynamicgraph::python::dgpyError); #endif
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment