fix some refcounting bugs
authorghost <andreas.monzner@multimedia-labs.de>
Mon, 24 Nov 2008 23:34:29 +0000 (00:34 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Mon, 24 Nov 2008 23:34:29 +0000 (00:34 +0100)
lib/base/nconfig.cpp
lib/dvb/dvb.cpp
lib/dvb/epgcache.cpp
lib/gui/elistboxcontent.cpp

index 31b0a36..106558a 100644 (file)
@@ -25,6 +25,7 @@ RESULT ePythonConfigQuery::getConfigValue(const char *key, std::string &value)
                        if (PyString_Check(pRet))
                        {
                                value.assign(PyString_AS_STRING(pRet));
+                               Py_DECREF(pRet);
                                return 0;
                        }
                        Py_DECREF(pRet);
index 7e9a39c..eac4554 100644 (file)
@@ -1502,7 +1502,7 @@ RESULT eDVBChannel::setCIRouting(const eDVBCIRouting &routing)
 
 void eDVBChannel::SDTready(int result)
 {
-       ePyObject args = PyTuple_New(2);
+       ePyObject args = PyTuple_New(2), ret;
        bool ok=false;
        if (!result)
        {
@@ -1521,7 +1521,9 @@ void eDVBChannel::SDTready(int result)
                Py_INCREF(Py_None);
                Py_INCREF(Py_None);
        }
-       PyObject_CallObject(m_tsid_onid_callback, args);
+       ret = PyObject_CallObject(m_tsid_onid_callback, args);
+       if (ret)
+               Py_DECREF(ret);
        Py_DECREF(args);
        Py_DECREF(m_tsid_onid_callback);
        m_tsid_onid_callback = ePyObject();
index 0bb6e25..222cba3 100644 (file)
@@ -1672,7 +1672,7 @@ int handleEvent(eServiceEvent *ptr, ePyObject dest_list, const char* argstring,
        {
                fillTuple(convertFuncArgs, argstring, argcount, service, ptr, nowTime, service_name);
                ePyObject result = PyObject_CallObject(convertFunc, convertFuncArgs);
-               if (result)
+               if (!result)
                {
                        if (service_name)
                                Py_DECREF(service_name);
index beb1204..69f72a4 100644 (file)
@@ -467,7 +467,8 @@ void eListboxPythonConfigContent::paint(gPainter &painter, eWindowStyle &style,
                                        /* type is borrowed */
                        } else
                                eWarning("eListboxPythonConfigContent: second value of tuple is not a tuple.");
-                               /* value is borrowed */
+                       if (value)
+                               Py_DECREF(value);
                }
 
                if (selected && (!local_style || !local_style->m_selection))
@@ -622,7 +623,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
        painter.clip(itemregion);
        clearRegion(painter, style, local_style, ePyObject(), ePyObject(), ePyObject(), ePyObject(), selected, itemregion, sel_clip);
 
-       ePyObject items;
+       ePyObject items, buildfunc_ret;
 
        if (m_list && cursorValid())
        {
@@ -638,7 +639,7 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                        if (PyCallable_Check(m_buildFunc))  // when we have a buildFunc then call it
                        {
                                if (PyTuple_Check(items))
-                                       items = PyObject_CallObject(m_buildFunc, items);
+                                       buildfunc_ret = items = PyObject_CallObject(m_buildFunc, items);
                                else
                                        eDebug("items is no tuple");
                        }
@@ -983,8 +984,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
                style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry);
 
 error_out:
-       if (m_buildFunc && PyCallable_Check(m_buildFunc) && items)
-               Py_DECREF(items);
+       if (buildfunc_ret)
+               Py_DECREF(buildfunc_ret);
 
        painter.clippop();
 }
@@ -1015,7 +1016,11 @@ int eListboxPythonMultiContent::currentCursorSelectable()
                        {
                                ePyObject ret = PyObject_CallObject(m_selectableFunc, args);
                                if (ret)
-                                       return ret == Py_True;
+                               {
+                                       bool retval = ret == Py_True;
+                                       Py_DECREF(ret);
+                                       return ret;
+                               }
                                eDebug("call m_selectableFunc failed!!! assume not callable");
                        }
                        else