add PyObject refcount debugging code
[enigma2.git] / lib / python / python.cpp
index f467bc86dc7d1a63a4827e72d38c4e5901a7f715..2636a3d5fcf81a03d6fc8d9903a5228c7ff09c10 100644 (file)
@@ -1,8 +1,49 @@
-#include <lib/python/python.h>
 #include <lib/base/eerror.h>
+                /* avoid warnigs :) */
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200112L
 #include <Python.h>
 
 extern "C" void init_enigma();
+extern void bsodFatal();
+
+void Impl_Py_DECREF(const char* file, int line, PyObject *obj)
+{
+       if (!obj)
+       {
+               eDebug("decref python object null pointer %s %d!!!",
+                       file, line);
+               bsodFatal();
+       }
+       if (obj->ob_refcnt <= 0)
+       {
+               eDebug("decref python object with refcounting value %d (%s %d)!!!", obj->ob_refcnt, file, line);
+               bsodFatal();
+       }
+       Py_DECREF(obj);
+}
+
+void Impl_Py_INCREF(const char* file, int line, PyObject *obj)
+{
+       if (!obj)
+       {
+               eDebug("incref python object null pointer %s %d!!!", file, line);
+               bsodFatal();
+       }
+       if (obj->ob_refcnt <= 0)
+       {
+               eDebug("incref python object with refcounting value %d (%s %d)!!!", obj->ob_refcnt, file, line);
+               bsodFatal();
+       }
+       if (obj->ob_refcnt == 0x7FFFFFFF)
+       {
+               eDebug("incref python object with refcounting value %d (MAX_INT!!!) (%s %d)!!!", obj->ob_refcnt, file, line);
+               bsodFatal();
+       }
+       Py_INCREF(obj);
+}
+
+#include <lib/python/python.h>
 
 DEFINE_REF(TestObj);
 
@@ -56,6 +97,10 @@ ePyObject &ePyObject::operator=(void *object)
 
 ePython::ePython()
 {
+//     Py_VerboseFlag = 1;
+       
+//     Py_OptimizeFlag = 1;
+       
        Py_Initialize();
        
        init_enigma();
@@ -69,9 +114,8 @@ ePython::~ePython()
 int ePython::execute(const std::string &pythonfile, const std::string &funcname)
 {
        PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
-       
        pName = PyString_FromString(pythonfile.c_str());
-       
+
        pModule = PyImport_Import(pName);
        Py_DECREF(pName);
        
@@ -124,6 +168,7 @@ int ePython::call(PyObject *pFunc, PyObject *pArgs)
                } else
                {
                        PyErr_Print();
+                       bsodFatal();
                }
        }
        return res;