1 #ifndef __lib_python_python_class_h
4 #define __lib_python_python_class_h
8 #include <lib/base/object.h>
10 #if !defined(SKIP_PART1) && !defined(SWIG)
14 #ifdef PYTHON_REFCOUNT_DEBUG
16 int m_line, m_from, m_to;
21 inline ePyObject(const ePyObject &ob);
22 inline ePyObject(PyObject *ob);
23 #ifdef PYTHON_REFCOUNT_DEBUG
24 inline ePyObject(PyObject *ob, const char *file, int line);
26 inline ePyObject(PyVarObject *ob);
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=(PyVarObject *ob) { return operator=((PyObject*)ob); }
36 ePyObject &operator=(PyDictObject *ob) { return operator=((PyObject*)ob); }
37 ePyObject &operator=(PyTupleObject *ob) { return operator=((PyObject*)ob); }
38 ePyObject &operator=(PyListObject *ob) { return operator=((PyObject*)ob); }
39 ePyObject &operator=(PyStringObject *ob) { return operator=((PyObject*)ob); }
41 operator PyVarObject*() { return (PyVarObject*)operator PyVarObject*(); }
42 operator PyTupleObject*() { return (PyTupleObject*)operator PyObject*(); }
43 operator PyListObject*() { return (PyListObject*)operator PyObject*(); }
44 operator PyStringObject*() { return (PyStringObject*)operator PyObject*(); }
45 operator PyDictObject*() { return (PyDictObject*)operator PyObject*(); }
46 PyObject *operator->() { return operator PyObject*(); }
47 #ifdef PYTHON_REFCOUNT_DEBUG
48 void incref(const char *file, int line);
49 void decref(const char *file, int line);
56 inline ePyObject::ePyObject()
58 #ifdef PYTHON_REFCOUNT_DEBUG
59 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
64 inline ePyObject::ePyObject(const ePyObject &ob)
66 #ifdef PYTHON_REFCOUNT_DEBUG
67 ,m_file(ob.m_file), m_line(ob.m_line)
68 ,m_from(ob.m_from), m_to(ob.m_to), m_erased(ob.m_erased)
73 inline ePyObject::ePyObject(PyObject *ob)
75 #ifdef PYTHON_REFCOUNT_DEBUG
76 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
81 #ifdef PYTHON_REFCOUNT_DEBUG
82 inline ePyObject::ePyObject(PyObject *ob, const char* file, int line)
84 ,m_file(file), m_line(line), m_from(ob->ob_refcnt), m_to(ob->ob_refcnt), m_erased(false)
89 inline ePyObject::ePyObject(PyVarObject *ob)
91 #ifdef PYTHON_REFCOUNT_DEBUG
92 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
97 inline ePyObject::ePyObject(PyDictObject *ob)
99 #ifdef PYTHON_REFCOUNT_DEBUG
100 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
105 inline ePyObject::ePyObject(PyTupleObject *ob)
107 #ifdef PYTHON_REFCOUNT_DEBUG
108 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
113 inline ePyObject::ePyObject(PyListObject *ob)
115 #ifdef PYTHON_REFCOUNT_DEBUG
116 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
121 inline ePyObject::ePyObject(PyStringObject *ob)
123 #ifdef PYTHON_REFCOUNT_DEBUG
124 ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
129 #ifndef PYTHON_REFCOUNT_DEBUG
130 inline ePyObject &ePyObject::operator=(PyObject *ob)
136 inline ePyObject &ePyObject::operator=(const ePyObject &ob)
142 inline ePyObject::operator PyObject*()
147 inline void ePyObject::incref()
152 inline void ePyObject::decref()
157 class ePyObjectWrapper
161 ePyObjectWrapper(const ePyObjectWrapper &wrapper)
162 :m_obj(wrapper.m_obj)
166 ePyObjectWrapper(const ePyObject &obj)
175 ePyObjectWrapper &operator=(const ePyObjectWrapper &wrapper)
178 m_obj = wrapper.m_obj;
192 #endif // ! PYTHON_REFCOUNT_DEBUG
194 #endif // !SWIG && !SKIP_PART1
198 #ifdef PYTHON_REFCOUNT_DEBUG
199 inline void Impl_Py_DECREF(const char* file, int line, const ePyObject &obj)
201 ((ePyObject*)(&obj))->decref(file, line);
204 inline void Impl_Py_INCREF(const char* file, int line, const ePyObject &obj)
206 ((ePyObject*)(&obj))->incref(file, line);
209 inline void Impl_Py_XDECREF(const char* file, int line, const ePyObject &obj)
212 ((ePyObject*)(&obj))->decref(file, line);
215 inline void Impl_Py_XINCREF(const char* file, int line, const ePyObject &obj)
218 ((ePyObject*)(&obj))->incref(file, line);
221 inline ePyObject Impl_PyTuple_New(const char* file, int line, int elements=0)
223 return ePyObject(PyTuple_New(elements), file, line);
226 inline ePyObject Impl_PyList_New(const char* file, int line, int elements=0)
228 return ePyObject(PyList_New(elements), file, line);
231 inline ePyObject Impl_PyDict_New(const char* file, int line)
233 return ePyObject(PyDict_New(), file, line);
236 inline ePyObject Impl_PyString_FromString(const char* file, int line, const char *str)
238 return ePyObject(PyString_FromString(str), file, line);
241 inline ePyObject Impl_PyString_FromFormat(const char* file, int line, const char *fmt, ...)
245 PyObject *ob = PyString_FromFormatV(fmt, ap);
247 return ePyObject(ob, file, line);
250 inline ePyObject Impl_PyInt_FromLong(const char* file, int line, long val)
252 return ePyObject(PyInt_FromLong(val), file, line);
255 inline ePyObject Impl_PyLong_FromLong(const char* file, int line, long val)
257 return ePyObject(PyLong_FromLong(val), file, line);
260 inline ePyObject Impl_PyLong_FromUnsignedLong(const char* file, int line, unsigned long val)
262 return ePyObject(PyLong_FromUnsignedLong(val), file, line);
265 inline ePyObject Impl_PyLong_FromLongLong(const char* file, int line, long long val)
267 return ePyObject(PyLong_FromLongLong(val), file, line);
270 inline ePyObject Impl_PyList_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
272 return ePyObject(PyList_GET_ITEM(list, pos), file, line);
275 inline ePyObject Impl_PyTuple_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
277 return ePyObject(PyTuple_GET_ITEM(list, pos), file, line);
280 inline void Impl_Py_DECREF(const ePyObject &obj)
282 ((ePyObject*)(&obj))->decref();
285 inline void Impl_Py_INCREF(const ePyObject &obj)
287 ((ePyObject*)(&obj))->incref();
290 inline void Impl_Py_XDECREF(const ePyObject &obj)
293 ((ePyObject*)(&obj))->decref();
296 inline void Impl_Py_XINCREF(const ePyObject &obj)
299 ((ePyObject*)(&obj))->incref();
302 inline ePyObject Impl_PyTuple_New(int elements=0)
304 return PyTuple_New(elements);
307 inline ePyObject Impl_PyList_New(int elements=0)
309 return PyList_New(elements);
312 inline ePyObject Impl_PyDict_New()
317 inline ePyObject Impl_PyString_FromString(const char *str)
319 return PyString_FromString(str);
322 inline ePyObject Impl_PyString_FromFormat(const char *fmt, ...)
326 PyObject *ob = PyString_FromFormatV(fmt, ap);
328 return ePyObject(ob);
331 inline ePyObject Impl_PyInt_FromLong(long val)
333 return PyInt_FromLong(val);
336 inline ePyObject Impl_PyLong_FromLong(long val)
338 return PyLong_FromLong(val);
341 inline ePyObject Impl_PyLong_FromUnsignedLong(unsigned long val)
343 return PyLong_FromUnsignedLong(val);
346 inline ePyObject Impl_PyLong_FromLongLong(long long val)
348 return PyLong_FromLongLong(val);
351 inline ePyObject Impl_PyList_GET_ITEM(ePyObject list, unsigned int pos)
353 return PyList_GET_ITEM(list, pos);
356 inline ePyObject Impl_PyTuple_GET_ITEM(ePyObject list, unsigned int pos)
358 return PyTuple_GET_ITEM(list, pos);
362 inline void Impl_INCREF(PyObject *ob)
367 inline void Impl_DECREF(PyObject *ob)
371 #define Org_Py_INCREF(obj) Impl_INCREF(obj)
372 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
377 #undef PyList_GET_ITEM
378 #undef PyTuple_GET_ITEM
379 #ifdef PYTHON_REFCOUNT_DEBUG
380 #define Py_DECREF(obj) Impl_Py_DECREF(__FILE__, __LINE__, obj)
381 #define Py_XDECREF(obj) Impl_Py_XDECREF(__FILE__, __LINE__, obj)
382 #define Py_INCREF(obj) Impl_Py_INCREF(__FILE__, __LINE__, obj)
383 #define Py_XINCREF(obj) Impl_Py_XINCREF(__FILE__, __LINE__, obj)
384 #define PyList_New(args...) Impl_PyList_New(__FILE__, __LINE__, args)
385 #define PyTuple_New(args...) Impl_PyTuple_New(__FILE__, __LINE__, args)
386 #define PyDict_New(...) Impl_PyDict_New(__FILE__, __LINE__)
387 #define PyString_FromString(str) Impl_PyString_FromString(__FILE__, __LINE__, str)
388 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(__FILE__, __LINE__, str, args)
389 #define PyInt_FromLong(val) Impl_PyInt_FromLong(__FILE__, __LINE__, val)
390 #define PyLong_FromLong(val) Impl_PyLong_FromLong(__FILE__, __LINE__, val)
391 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(__FILE__, __LINE__, val)
392 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(__FILE__, __LINE__, val)
393 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(__FILE__, __LINE__, list, pos)
394 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(__FILE__, __LINE__, list, pos)
396 #define Py_DECREF(obj) Impl_Py_DECREF(obj)
397 #define Py_XDECREF(obj) Impl_Py_XDECREF(obj)
398 #define Py_INCREF(obj) Impl_Py_INCREF(obj)
399 #define Py_XINCREF(obj) Impl_Py_XINCREF(obj)
400 #define PyList_New(args...) Impl_PyList_New(args)
401 #define PyTuple_New(args...) Impl_PyTuple_New(args)
402 #define PyDict_New(...) Impl_PyDict_New()
403 #define PyString_FromString(str) Impl_PyString_FromString(str)
404 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(str, args)
405 #define PyInt_FromLong(val) Impl_PyInt_FromLong(val)
406 #define PyLong_FromLong(val) Impl_PyLong_FromLong(val)
407 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(val)
408 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(val)
409 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(list, pos)
410 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(list, pos)
418 int execFile(const char *file);
419 int execute(const std::string &pythonfile, const std::string &funcname);
420 static int call(ePyObject pFunc, ePyObject args);
421 static ePyObject resolve(const std::string &pythonfile, const std::string &funcname);
427 #endif // __lib_python_python_class_h