python object refcount debugging code second try
[vuplus_dvbapp] / lib / python / python.h
1 #ifndef __lib_python_python_class_h
2
3 #ifndef SKIP_PART2
4         #define __lib_python_python_class_h
5 #endif
6
7 #include <string>
8 #include <lib/base/object.h>
9 #include <Python.h>
10
11 #define PYTHON_REFCOUNT_DEBUG
12
13 #if !defined(SKIP_PART1) && !defined(SWIG)
14 class ePyObject
15 {
16         PyObject *m_ob;
17 #ifdef PYTHON_REFCOUNT_DEBUG
18         const char *m_file;
19         int m_line, m_from, m_to;
20         bool m_erased;
21 #endif
22 public:
23         inline ePyObject();
24         inline ePyObject(const ePyObject &ob);
25         inline ePyObject(PyObject *ob);
26         inline ePyObject(PyDictObject *ob);
27         inline ePyObject(PyTupleObject *ob);
28         inline ePyObject(PyListObject *ob);
29         inline ePyObject(PyStringObject *ob);
30         operator bool() { return !!m_ob; }
31         ePyObject &operator=(const ePyObject &);
32         ePyObject &operator=(PyObject *);
33         ePyObject &operator=(PyDictObject *ob) { return operator=((PyObject*)ob); }
34         ePyObject &operator=(PyTupleObject *ob) { return operator=((PyObject*)ob); }
35         ePyObject &operator=(PyListObject *ob) { return operator=((PyObject*)ob); }
36         ePyObject &operator=(PyStringObject *ob) { return operator=((PyObject*)ob); }
37         operator PyObject*();
38         operator PyTupleObject*() { return (PyTupleObject*)operator PyObject*(); }
39         operator PyListObject*() { return (PyListObject*)operator PyObject*(); }
40         operator PyStringObject*() { return (PyStringObject*)operator PyObject*(); }
41         operator PyDictObject*() { return (PyDictObject*)operator PyObject*(); }
42         PyObject *operator->() { return operator PyObject*(); }
43 #ifdef PYTHON_REFCOUNT_DEBUG
44         void incref(const char *file, int line);
45         void decref(const char *file, int line);
46 #else
47         void incref();
48         void decref();
49 #endif
50 };
51
52 inline ePyObject::ePyObject()
53         :m_ob(0)
54 #ifdef PYTHON_REFCOUNT_DEBUG
55         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
56 #endif
57 {
58 }
59
60 inline ePyObject::ePyObject(const ePyObject &ob)
61         :m_ob(ob.m_ob)
62 #ifdef PYTHON_REFCOUNT_DEBUG
63         ,m_file(ob.m_file), m_line(ob.m_line)
64         ,m_from(ob.m_from), m_to(ob.m_to), m_erased(ob.m_erased)
65 #endif
66 {
67 }
68
69 inline ePyObject::ePyObject(PyObject *ob)
70         :m_ob(ob)
71 #ifdef PYTHON_REFCOUNT_DEBUG
72         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
73 #endif
74 {
75 }
76
77 inline ePyObject::ePyObject(PyDictObject *ob)
78         :m_ob((PyObject*)ob)
79 #ifdef PYTHON_REFCOUNT_DEBUG
80         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
81 #endif
82 {
83 }
84
85 inline ePyObject::ePyObject(PyTupleObject *ob)
86         :m_ob((PyObject*)ob)
87 #ifdef PYTHON_REFCOUNT_DEBUG
88         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
89 #endif
90 {
91 }
92
93 inline ePyObject::ePyObject(PyListObject *ob)
94         :m_ob((PyObject*)ob)
95 #ifdef PYTHON_REFCOUNT_DEBUG
96         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
97 #endif
98 {
99 }
100
101 inline ePyObject::ePyObject(PyStringObject *ob)
102         :m_ob((PyObject*)ob)
103 #ifdef PYTHON_REFCOUNT_DEBUG
104         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
105 #endif
106 {
107 }
108
109 #ifndef PYTHON_REFCOUNT_DEBUG
110 inline ePyObject &ePyObject::operator=(PyObject *ob)
111 {
112         m_ob=ob;
113         return *this;
114 }
115
116 inline ePyObject &ePyObject::operator=(const ePyObject &ob)
117 {
118         m_ob=ob.m_ob;
119         return *this;
120 }
121
122 inline ePyObject::operator PyObject*()
123 {
124         return m_ob;
125 }
126
127 inline void ePyObject::incref()
128 {
129         Py_INCREF(m_ob);
130 }
131
132 inline void ePyObject::decref()
133 {
134         Py_DECREF(m_ob);
135 }
136
137 #endif // ! PYTHON_REFCOUNT_DEBUG
138
139 #endif  // !SWIG && !SKIP_PART1
140
141 #ifndef SKIP_PART2
142
143 class TestObj
144 {
145 DECLARE_REF(TestObj);
146 public:
147         TestObj();
148         ~TestObj();
149 };
150 TEMPLATE_TYPEDEF(ePtr<TestObj>, TestObjPtr);
151
152 extern PyObject *New_TestObj();
153
154 #ifndef SWIG
155
156 #ifdef PYTHON_REFCOUNT_DEBUG
157 inline void Impl_Py_DECREF(const char* file, int line, const ePyObject &obj)
158 {
159         ((ePyObject*)(&obj))->decref(file, line);
160 }
161
162 inline void Impl_Py_INCREF(const char* file, int line, const ePyObject &obj)
163 {
164         ((ePyObject*)(&obj))->incref(file, line);
165 }
166
167 inline void Impl_Py_XDECREF(const char* file, int line, const ePyObject &obj)
168 {
169         if (obj)
170                 ((ePyObject*)(&obj))->decref(file, line);
171 }
172
173 inline void Impl_Py_XINCREF(const char* file, int line, const ePyObject &obj)
174 {
175         if (obj)
176                 ((ePyObject*)(&obj))->incref(file, line);
177 }
178 #else
179 inline void Impl_Py_DECREF(const ePyObject &obj)
180 {
181         ((ePyObject*)(&obj))->decref();
182 }
183
184 inline void Impl_Py_INCREF(const ePyObject &obj)
185 {
186         ((ePyObject*)(&obj))->incref();
187 }
188
189 inline void Impl_Py_XDECREF(const ePyObject &obj)
190 {
191         if (obj)
192                 ((ePyObject*)(&obj))->decref();
193 }
194
195 inline void Impl_Py_XINCREF(const ePyObject &obj)
196 {
197         if (obj)
198                 ((ePyObject*)(&obj))->incref();
199 }
200 #endif
201
202 inline void Impl_DECREF(PyObject *ob)
203 {
204         Py_DECREF(ob);
205 }
206 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
207 #undef Py_DECREF
208 #undef Py_XDECREF
209 #undef Py_INCREF
210 #undef Py_XINCREF
211 #ifdef PYTHON_REFCOUNT_DEBUG
212 #define Py_DECREF(obj) Impl_Py_DECREF(__FILE__, __LINE__, obj)
213 #define Py_XDECREF(obj) Impl_Py_XDECREF(__FILE__, __LINE__, obj)
214 #define Py_INCREF(obj) Impl_Py_INCREF(__FILE__, __LINE__, obj)
215 #define Py_XINCREF(obj) Impl_Py_XINCREF(__FILE__, __LINE__, obj)
216 #else
217 #define Py_DECREF(obj) Impl_Py_DECREF(obj)
218 #define Py_XDECREF(obj) Impl_Py_XDECREF(obj)
219 #define Py_INCREF(obj) Impl_Py_INCREF(obj)
220 #define Py_XINCREF(obj) Impl_Py_XINCREF(obj)
221 #endif
222
223 class ePython
224 {
225 public:
226         ePython();
227         ~ePython();
228         int execute(const std::string &pythonfile, const std::string &funcname);
229         static int call(ePyObject pFunc, ePyObject args);
230         static ePyObject resolve(const std::string &pythonfile, const std::string &funcname);
231 private:
232 };
233
234 #endif // SWIG
235 #endif // SKIP_PART2
236
237 #endif // __lib_python_python_class_h