diff options
author | Hans Lambermont <hans@lambermont.dyndns.org> | 2002-10-12 15:37:38 +0400 |
---|---|---|
committer | Hans Lambermont <hans@lambermont.dyndns.org> | 2002-10-12 15:37:38 +0400 |
commit | 12315f4d0e0ae993805f141f64cb8c73c5297311 (patch) | |
tree | 59b45827cd8293cfb727758989c7a74b40183974 /source/gameengine/Expressions/PyObjectPlus.h |
Initial revisionv2.25
Diffstat (limited to 'source/gameengine/Expressions/PyObjectPlus.h')
-rw-r--r-- | source/gameengine/Expressions/PyObjectPlus.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h new file mode 100644 index 00000000000..e88ea2b255a --- /dev/null +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -0,0 +1,135 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ +#ifndef NO_EXP_PYTHON_EMBEDDING + +#ifndef _adr_py_lib_h_ // only process once, +#define _adr_py_lib_h_ // even if multiply included + +#ifndef __cplusplus // c++ only +#error Must be compiled with C++ +#endif + +#include "KX_Python.h" + +/*------------------------------ + * Python defines +------------------------------*/ + + // some basic python macros +#define Py_NEWARGS 1 +#define Py_Return Py_INCREF(Py_None); return Py_None; + +#define Py_Error(E, M) {PyErr_SetString(E, M); return NULL;} +#define Py_Try(F) {if (!(F)) return NULL;} +#define Py_Assert(A,E,M) {if (!(A)) {PyErr_SetString(E, M); return NULL;}} + +inline void Py_Fatal(char *M) { + //cout << M << endl; + exit(-1); +}; + + // This must be the first line of each + // PyC++ class +#define Py_Header \ + public: \ + static PyTypeObject Type; \ + static PyMethodDef Methods[]; \ + static PyParentObject Parents[]; \ + virtual PyTypeObject *GetType(void) {return &Type;}; \ + virtual PyParentObject *GetParents(void) {return Parents;} + + // This defines the _getattr_up macro + // which allows attribute and method calls + // to be properly passed up the hierarchy. +#define _getattr_up(Parent) \ + PyObject *rvalue = Py_FindMethod(Methods, this, attr); \ + if (rvalue == NULL) \ + { \ + PyErr_Clear(); \ + return Parent::_getattr(attr); \ + } \ + else \ + return rvalue + + +/*------------------------------ + * PyObjectPlus +------------------------------*/ +typedef PyTypeObject * PyParentObject; // Define the PyParent Object + +class PyObjectPlus : public PyObject { // The PyObjectPlus abstract class + + Py_Header; // Always start with Py_Header + + public: + PyObjectPlus(PyTypeObject *T); + + virtual ~PyObjectPlus() {}; // destructor + static void PyDestructor(PyObject *P) // python wrapper + { + delete ((PyObjectPlus *) P); + }; + + //void INCREF(void) { +// Py_INCREF(this); +// }; // incref method + //void DECREF(void) { +// Py_DECREF(this); +// }; // decref method + + virtual PyObject *_getattr(char *attr); // _getattr method + static PyObject *__getattr(PyObject * PyObj, char *attr) // This should be the entry in Type. + { return ((PyObjectPlus*) PyObj)->_getattr(attr); }; + + virtual int _setattr(char *attr, PyObject *value); // _setattr method + static int __setattr(PyObject *PyObj, // This should be the entry in Type. + char *attr, + PyObject *value) + { return ((PyObjectPlus*) PyObj)->_setattr(attr, value); }; + + virtual PyObject *_repr(void); // _repr method + static PyObject *__repr(PyObject *PyObj) // This should be the entry in Type. + { return ((PyObjectPlus*) PyObj)->_repr(); }; + + + // isA methods + bool isA(PyTypeObject *T); + bool isA(const char *mytypename); + PyObject *Py_isA(PyObject *args); + static PyObject *sPy_isA(PyObject *self, PyObject *args, PyObject *kwd) + {return ((PyObjectPlus*)self)->Py_isA(args);}; +}; + +#endif // _adr_py_lib_h_ + +#endif //NO_EXP_PYTHON_EMBEDDING + |