1 #ifndef __lib_python_python_class_h
4 #define __lib_python_python_class_h
8 #include <lib/base/object.h>
11 #if !defined(SKIP_PART1) && !defined(SWIG)
15 #ifdef PYTHON_REFCOUNT_DEBUG
17 int m_line, m_from, m_to;
22 inline ePyObject(const ePyObject &ob);
23 inline ePyObject(PyObject *ob);
24 #ifdef PYTHON_REFCOUNT_DEBUG
25 inline ePyObject(PyObject *ob, const char *file, int line);
27 inline ePyObject(PyDictObject *ob);
28 inline ePyObject(PyTupleObject *ob);
29 inline ePyObject(PyListObject *ob);
30 inline ePyObject(PyStringObject *ob);
31 operator bool() const { return !!m_ob; }
32 operator bool() { return !!m_ob; }
33 ePyObject &operator=(const ePyObject &);
34 ePyObject &operator=(PyObject *);
35 ePyObject &operator=(PyDictObject *ob) { return operator=((PyObject*)ob); }
36 ePyObject &operator=(PyTupleObject *ob) { return operator=((PyObject*)ob); }
37 ePyObject &operator=(PyListObject *ob) { return operator=((PyObject*)ob); }
38 ePyObject &operator=(PyStringObject *ob) { return operator=((PyObject*)ob); }
40 operator PyTupleObject*() { return (PyTupleObject*)operator PyObject*(); }
41 operator PyListObject*() { return (PyListObject*)operator PyObject*(); }
42 operator PyStringObject*() { return (PyStringObject*)operator PyObject*(); }
43 operator PyDictObject*() { return (PyDictObject*)operator PyObject*(); }
44 PyObject *operator->() { return operator PyObject*(); }
45 #ifdef PYTHON_REFCOUNT_DEBUG
46 void incref(const char *file, int line);
47 void decref(const char *file, int line);
54 inline ePyObject::ePyObject()
56 #ifdef PYTHON_REFCOUNT_DEBUG
57 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
62 inline ePyObject::ePyObject(const ePyObject &ob)
64 #ifdef PYTHON_REFCOUNT_DEBUG
65 ,m_file(ob.m_file), m_line(ob.m_line)
66 ,m_from(ob.m_from), m_to(ob.m_to), m_erased(ob.m_erased)
71 inline ePyObject::ePyObject(PyObject *ob)
73 #ifdef PYTHON_REFCOUNT_DEBUG
74 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
79 #ifdef PYTHON_REFCOUNT_DEBUG
80 inline ePyObject::ePyObject(PyObject *ob, const char* file, int line)
82 ,m_file(file), m_line(line), m_from(ob->ob_refcnt), m_to(ob->ob_refcnt), m_erased(false)
87 inline ePyObject::ePyObject(PyDictObject *ob)
89 #ifdef PYTHON_REFCOUNT_DEBUG
90 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
95 inline ePyObject::ePyObject(PyTupleObject *ob)
97 #ifdef PYTHON_REFCOUNT_DEBUG
98 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
103 inline ePyObject::ePyObject(PyListObject *ob)
105 #ifdef PYTHON_REFCOUNT_DEBUG
106 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
111 inline ePyObject::ePyObject(PyStringObject *ob)
113 #ifdef PYTHON_REFCOUNT_DEBUG
114 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
119 #ifndef PYTHON_REFCOUNT_DEBUG
120 inline ePyObject &ePyObject::operator=(PyObject *ob)
126 inline ePyObject &ePyObject::operator=(const ePyObject &ob)
132 inline ePyObject::operator PyObject*()
137 inline void ePyObject::incref()
142 inline void ePyObject::decref()
147 #endif // ! PYTHON_REFCOUNT_DEBUG
149 #endif // !SWIG && !SKIP_PART1
155 DECLARE_REF(TestObj);
160 TEMPLATE_TYPEDEF(ePtr<TestObj>, TestObjPtr);
163 extern PyObject *New_TestObj();
164 #ifdef PYTHON_REFCOUNT_DEBUG
165 inline void Impl_Py_DECREF(const char* file, int line, const ePyObject &obj)
167 ((ePyObject*)(&obj))->decref(file, line);
170 inline void Impl_Py_INCREF(const char* file, int line, const ePyObject &obj)
172 ((ePyObject*)(&obj))->incref(file, line);
175 inline void Impl_Py_XDECREF(const char* file, int line, const ePyObject &obj)
178 ((ePyObject*)(&obj))->decref(file, line);
181 inline void Impl_Py_XINCREF(const char* file, int line, const ePyObject &obj)
184 ((ePyObject*)(&obj))->incref(file, line);
187 inline ePyObject Impl_PyTuple_New(const char* file, int line, int elements=0)
189 return ePyObject(PyTuple_New(elements), file, line);
192 inline ePyObject Impl_PyList_New(const char* file, int line, int elements=0)
194 return ePyObject(PyList_New(elements), file, line);
197 inline ePyObject Impl_PyDict_New(const char* file, int line)
199 return ePyObject(PyDict_New(), file, line);
202 inline ePyObject Impl_PyString_FromString(const char* file, int line, const char *str)
204 return ePyObject(PyString_FromString(str), file, line);
207 inline ePyObject Impl_PyString_FromFormat(const char* file, int line, const char *fmt, ...)
211 PyObject *ob = PyString_FromFormatV(fmt, ap);
213 return ePyObject(ob, file, line);
216 inline ePyObject Impl_PyInt_FromLong(const char* file, int line, long val)
218 return ePyObject(PyInt_FromLong(val), file, line);
221 inline ePyObject Impl_PyLong_FromLong(const char* file, int line, long val)
223 return ePyObject(PyLong_FromLong(val), file, line);
226 inline ePyObject Impl_PyLong_FromUnsignedLong(const char* file, int line, unsigned long val)
228 return ePyObject(PyLong_FromUnsignedLong(val), file, line);
231 inline ePyObject Impl_PyLong_FromLongLong(const char* file, int line, long long val)
233 return ePyObject(PyLong_FromLongLong(val), file, line);
236 inline ePyObject Impl_New_TestObj(const char* file, int line)
238 return ePyObject(New_TestObj(), file, line);
241 inline ePyObject Impl_PyList_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
243 return ePyObject(PyList_GET_ITEM(list, pos), file, line);
246 inline ePyObject Impl_PyTuple_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
248 return ePyObject(PyTuple_GET_ITEM(list, pos), file, line);
251 inline void Impl_Py_DECREF(const ePyObject &obj)
253 ((ePyObject*)(&obj))->decref();
256 inline void Impl_Py_INCREF(const ePyObject &obj)
258 ((ePyObject*)(&obj))->incref();
261 inline void Impl_Py_XDECREF(const ePyObject &obj)
264 ((ePyObject*)(&obj))->decref();
267 inline void Impl_Py_XINCREF(const ePyObject &obj)
270 ((ePyObject*)(&obj))->incref();
273 inline ePyObject Impl_PyTuple_New(int elements=0)
275 return PyTuple_New(elements);
278 inline ePyObject Impl_PyList_New(int elements=0)
280 return PyList_New(elements);
283 inline ePyObject Impl_PyDict_New()
288 inline ePyObject Impl_PyString_FromString(const char *str)
290 return PyString_FromString(str);
293 inline ePyObject Impl_PyString_FromFormat(const char *fmt, ...)
297 PyObject *ob = PyString_FromFormatV(fmt, ap);
299 return ePyObject(ob);
302 inline ePyObject Impl_PyInt_FromLong(long val)
304 return PyInt_FromLong(val);
307 inline ePyObject Impl_PyLong_FromLong(long val)
309 return PyLong_FromLong(val);
312 inline ePyObject Impl_PyLong_FromUnsignedLong(unsigned long val)
314 return PyLong_FromUnsignedLong(val);
317 inline ePyObject Impl_PyLong_FromLongLong(long long val)
319 return PyLong_FromLongLong(val);
322 inline ePyObject Impl_New_TestObj()
324 return New_TestObj();
327 inline ePyObject Impl_PyList_GET_ITEM(ePyObject list, unsigned int pos)
329 return PyList_GET_ITEM(list, pos);
332 inline ePyObject Impl_PyTuple_GET_ITEM(ePyObject list, unsigned int pos)
334 return PyTuple_GET_ITEM(list, pos);
338 inline void Impl_DECREF(PyObject *ob)
342 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
347 #undef PyList_GET_ITEM
348 #undef PyTuple_GET_ITEM
349 #ifdef PYTHON_REFCOUNT_DEBUG
350 #define Py_DECREF(obj) Impl_Py_DECREF(__FILE__, __LINE__, obj)
351 #define Py_XDECREF(obj) Impl_Py_XDECREF(__FILE__, __LINE__, obj)
352 #define Py_INCREF(obj) Impl_Py_INCREF(__FILE__, __LINE__, obj)
353 #define Py_XINCREF(obj) Impl_Py_XINCREF(__FILE__, __LINE__, obj)
354 #define PyList_New(args...) Impl_PyList_New(__FILE__, __LINE__, args)
355 #define PyTuple_New(args...) Impl_PyTuple_New(__FILE__, __LINE__, args)
356 #define PyDict_New(...) Impl_PyDict_New(__FILE__, __LINE__)
357 #define PyString_FromString(str) Impl_PyString_FromString(__FILE__, __LINE__, str)
358 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(__FILE__, __LINE__, str, args)
359 #define PyInt_FromLong(val) Impl_PyInt_FromLong(__FILE__, __LINE__, val)
360 #define PyLong_FromLong(val) Impl_PyLong_FromLong(__FILE__, __LINE__, val)
361 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(__FILE__, __LINE__, val)
362 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(__FILE__, __LINE__, val)
363 #define NEW_TestObj(...) Impl_New_TestObj(__FILE__, __LINE__)
364 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(__FILE__, __LINE__, list, pos)
365 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(__FILE__, __LINE__, list, pos)
367 #define Py_DECREF(obj) Impl_Py_DECREF(obj)
368 #define Py_XDECREF(obj) Impl_Py_XDECREF(obj)
369 #define Py_INCREF(obj) Impl_Py_INCREF(obj)
370 #define Py_XINCREF(obj) Impl_Py_XINCREF(obj)
371 #define PyList_New(args...) Impl_PyList_New(args)
372 #define PyTuple_New(args...) Impl_PyTuple_New(args)
373 #define PyDict_New(...) Impl_PyDict_New()
374 #define PyString_FromString(str) Impl_PyString_FromString(str)
375 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(str, args)
376 #define PyInt_FromLong(val) Impl_PyInt_FromLong(val)
377 #define PyLong_FromLong(val) Impl_PyLong_FromLong(val)
378 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(val)
379 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(val)
380 #define NEW_TestObj(...) Impl_New_TestObj()
381 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(list, pos)
382 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(list, pos)
390 int execute(const std::string &pythonfile, const std::string &funcname);
391 static int call(ePyObject pFunc, ePyObject args);
392 static ePyObject resolve(const std::string &pythonfile, const std::string &funcname);
399 #endif // __lib_python_python_class_h