X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/7d7ca8ee2eaae704989a1552ad429794d402f550..77923ed4e1caecf4cef7d46bd6979ef700fed7e2:/lib/python/connections.h diff --git a/lib/python/connections.h b/lib/python/connections.h index 9da6a002..ab123137 100644 --- a/lib/python/connections.h +++ b/lib/python/connections.h @@ -7,36 +7,19 @@ #include #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200112L + #include class PSignal { +protected: + ePyObject m_list; + bool *m_destroyed; public: - PyObject *m_list; -public: - PSignal() - { - m_list = PyList_New(0); - Py_INCREF(m_list); - } - ~PSignal() - { - Py_DECREF(m_list); - } - - void callPython(PyObject *tuple) - { - int size = PyList_Size(m_list); - int i; - for (i=0; i public: R operator()() { - PyObject *pArgs = PyTuple_New(0); - callPython(pArgs); - Py_DECREF(pArgs); - return Signal0::operator()(); + bool destroyed=false; + m_destroyed = &destroyed; + if (m_list) + { + PyObject *pArgs = PyTuple_New(0); + callPython(pArgs); + Org_Py_DECREF(pArgs); + } + if (!destroyed) { + m_destroyed = 0; + return Signal0::operator()(); + } } }; @@ -68,11 +59,19 @@ class PSignal1: public PSignal, public Signal1 public: R operator()(V0 a0) { - PyObject *pArgs = PyTuple_New(1); - PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); - callPython(pArgs); - Py_DECREF(pArgs); - return Signal1::operator()(a0); + bool destroyed=false; + m_destroyed = &destroyed; + if (m_list) + { + PyObject *pArgs = PyTuple_New(1); + PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); + callPython(pArgs); + Org_Py_DECREF(pArgs); + } + if (!destroyed) { + m_destroyed = 0; + return Signal1::operator()(a0); + } } }; @@ -82,12 +81,20 @@ class PSignal2: public PSignal, public Signal2 public: R operator()(V0 a0, V1 a1) { - PyObject *pArgs = PyTuple_New(2); - PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); - PyTuple_SET_ITEM(pArgs, 1, PyFrom(a1)); - callPython(pArgs); - Py_DECREF(pArgs); - return Signal2::operator()(a0, a1); + bool destroyed=false; + m_destroyed = &destroyed; + if (m_list) + { + PyObject *pArgs = PyTuple_New(2); + PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); + PyTuple_SET_ITEM(pArgs, 1, PyFrom(a1)); + callPython(pArgs); + Org_Py_DECREF(pArgs); + } + if (!destroyed) { + m_destroyed = 0; + return Signal2::operator()(a0, a1); + } } };