1 #ifndef __lib_python_python_class_h
4 #define __lib_python_python_class_h
8 #include <lib/base/object.h>
11 #define PYTHON_REFCOUNT_DEBUG
13 #if !defined(SKIP_PART1) && !defined(SWIG)
17 #ifdef PYTHON_REFCOUNT_DEBUG
19 int m_line, m_from, m_to;
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); }
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);
52 inline ePyObject::ePyObject()
54 #ifdef PYTHON_REFCOUNT_DEBUG
55 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
60 inline ePyObject::ePyObject(const ePyObject &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)
69 inline ePyObject::ePyObject(PyObject *ob)
71 #ifdef PYTHON_REFCOUNT_DEBUG
72 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
77 inline ePyObject::ePyObject(PyDictObject *ob)
79 #ifdef PYTHON_REFCOUNT_DEBUG
80 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
85 inline ePyObject::ePyObject(PyTupleObject *ob)
87 #ifdef PYTHON_REFCOUNT_DEBUG
88 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
93 inline ePyObject::ePyObject(PyListObject *ob)
95 #ifdef PYTHON_REFCOUNT_DEBUG
96 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
101 inline ePyObject::ePyObject(PyStringObject *ob)
103 #ifdef PYTHON_REFCOUNT_DEBUG
104 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
109 #ifndef PYTHON_REFCOUNT_DEBUG
110 inline ePyObject &ePyObject::operator=(PyObject *ob)
116 inline ePyObject &ePyObject::operator=(const ePyObject &ob)
122 inline ePyObject::operator PyObject*()
127 inline void ePyObject::incref()
132 inline void ePyObject::decref()
137 #endif // ! PYTHON_REFCOUNT_DEBUG
139 #endif // !SWIG && !SKIP_PART1
145 DECLARE_REF(TestObj);
150 TEMPLATE_TYPEDEF(ePtr<TestObj>, TestObjPtr);
152 extern PyObject *New_TestObj();
156 #ifdef PYTHON_REFCOUNT_DEBUG
157 inline void Impl_Py_DECREF(const char* file, int line, const ePyObject &obj)
159 ((ePyObject*)(&obj))->decref(file, line);
162 inline void Impl_Py_INCREF(const char* file, int line, const ePyObject &obj)
164 ((ePyObject*)(&obj))->incref(file, line);
167 inline void Impl_Py_XDECREF(const char* file, int line, const ePyObject &obj)
170 ((ePyObject*)(&obj))->decref(file, line);
173 inline void Impl_Py_XINCREF(const char* file, int line, const ePyObject &obj)
176 ((ePyObject*)(&obj))->incref(file, line);
179 inline void Impl_Py_DECREF(const ePyObject &obj)
181 ((ePyObject*)(&obj))->decref();
184 inline void Impl_Py_INCREF(const ePyObject &obj)
186 ((ePyObject*)(&obj))->incref();
189 inline void Impl_Py_XDECREF(const ePyObject &obj)
192 ((ePyObject*)(&obj))->decref();
195 inline void Impl_Py_XINCREF(const ePyObject &obj)
198 ((ePyObject*)(&obj))->incref();
202 inline void Impl_DECREF(PyObject *ob)
206 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
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)
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)
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);
237 #endif // __lib_python_python_class_h