From a35a8f7a382e9f62834eaf355d448205665a07bc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 4 Apr 2009 08:20:52 +0000 Subject: [PATCH] - should fix compiling with older python versions (<2.5) - made the isA() function accept python types as well as strings. - renamed _getattr_dict to py_getattr_dict --- .../gameengine/Expressions/PyObjectPlus.cpp | 45 ++++++++++--------- source/gameengine/Expressions/PyObjectPlus.h | 6 ++- source/gameengine/Ketsji/KX_GameObject.cpp | 2 +- source/gameengine/Ketsji/KX_Scene.cpp | 2 +- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index ed6932b414a..ac1871300d0 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -703,35 +703,40 @@ PyObject *PyObjectPlus::py_repr(void) ------------------------------*/ bool PyObjectPlus::isA(PyTypeObject *T) // if called with a Type, use "typename" { - return isA(T->tp_name); + int i; + PyParentObject P; + PyParentObject *Ps = GetParents(); + + for (P = Ps[i=0]; P != NULL; P = Ps[i++]) + if (P==T) + return true; + + return false; } bool PyObjectPlus::isA(const char *mytypename) // check typename of each parent { - int i; - PyParentObject P; - PyParentObject *Ps = GetParents(); + int i; + PyParentObject P; + PyParentObject *Ps = GetParents(); - for (P = Ps[i=0]; P != NULL; P = Ps[i++]) - { - if (strcmp(P->tp_name, mytypename)==0) - return true; - } - - return false; + for (P = Ps[i=0]; P != NULL; P = Ps[i++]) + if (strcmp(P->tp_name, mytypename)==0) + return true; + + return false; } PyObject *PyObjectPlus::Py_isA(PyObject *value) // Python wrapper for isA { - if (!PyString_Check(value)) { - PyErr_SetString(PyExc_TypeError, "expected a string"); - return NULL; - } - if(isA(PyString_AsString(value))) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; + if (PyType_Check(value)) { + return PyBool_FromLong(isA((PyTypeObject *)value)); + } else if (PyString_Check(value)) { + return PyBool_FromLong(isA(PyString_AsString(value))); + } + PyErr_SetString(PyExc_TypeError, "expected a type or a string"); + return NULL; } /* Utility function called by the macro py_getattro_up() @@ -742,7 +747,7 @@ PyObject *PyObjectPlus::Py_isA(PyObject *value) // Python wrapper for isA * Other then making dir() useful the value returned from __dict__() is not useful * since every value is a Py_None * */ -PyObject *_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef) +PyObject *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef) { if(pydict==NULL) { /* incase calling __dict__ on the parent of this object raised an error */ PyErr_Clear(); diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index 77963c092eb..f178d03e131 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -62,6 +62,7 @@ /* for pre Py 2.5 */ #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; +typedef Py_ssize_t (*lenfunc)(PyObject *); #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_METHODCHAR char * @@ -74,6 +75,7 @@ typedef int Py_ssize_t; #include "descrobject.h" + static inline void Py_Fatal(const char *M) { fprintf(stderr, "%s\n", M); exit(-1); @@ -108,7 +110,7 @@ static inline void Py_Fatal(const char *M) { } \ \ if (strcmp(PyString_AsString(attr), "__dict__")==0) {\ - rvalue = _getattr_dict(rvalue, Methods, Attributes); \ + rvalue = py_getattr_dict(rvalue, Methods, Attributes); \ } \ return rvalue; \ @@ -404,7 +406,7 @@ public: } }; -PyObject *_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef); +PyObject *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef); #endif // _adr_py_lib_h_ diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index e79ef5ab72b..5bba9190bd6 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -1421,7 +1421,7 @@ PyObject* KX_GameObject::pyattr_get_dir_dict(void *self_v, const KX_PYATTRIBUTE_ { KX_GameObject* self= static_cast(self_v); PyObject *dict_str = PyString_FromString("__dict__"); - PyObject *dict= _getattr_dict(self->SCA_IObject::py_getattro(dict_str), KX_GameObject::Methods, KX_GameObject::Attributes); + PyObject *dict= py_getattr_dict(self->SCA_IObject::py_getattro(dict_str), KX_GameObject::Methods, KX_GameObject::Attributes); Py_DECREF(dict_str); if(dict==NULL) diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 94ea234f1bf..254717894df 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1574,7 +1574,7 @@ PyObject* KX_Scene::pyattr_get_dir_dict(void *self_v, const KX_PYATTRIBUTE_DEF * KX_Scene* self= static_cast(self_v); /* Useually done by py_getattro_up but in this case we want to include m_attrlist dict */ PyObject *dict_str= PyString_FromString("__dict__"); - PyObject *dict= _getattr_dict(self->PyObjectPlus::py_getattro(dict_str), KX_Scene::Methods, KX_Scene::Attributes); + PyObject *dict= py_getattr_dict(self->PyObjectPlus::py_getattro(dict_str), KX_Scene::Methods, KX_Scene::Attributes); Py_DECREF(dict_str); PyDict_Update(dict, self->m_attrlist);