- 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
This commit is contained in:
Campbell Barton
2009-04-04 08:20:52 +00:00
parent c31f806c99
commit a35a8f7a38
4 changed files with 31 additions and 24 deletions

View File

@@ -703,35 +703,40 @@ PyObject *PyObjectPlus::py_repr(void)
------------------------------*/ ------------------------------*/
bool PyObjectPlus::isA(PyTypeObject *T) // if called with a Type, use "typename" 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 bool PyObjectPlus::isA(const char *mytypename) // check typename of each parent
{ {
int i; int i;
PyParentObject P; PyParentObject P;
PyParentObject *Ps = GetParents(); PyParentObject *Ps = GetParents();
for (P = Ps[i=0]; P != NULL; P = Ps[i++]) for (P = Ps[i=0]; P != NULL; P = Ps[i++])
{ if (strcmp(P->tp_name, mytypename)==0)
if (strcmp(P->tp_name, mytypename)==0) return true;
return true;
} return false;
return false;
} }
PyObject *PyObjectPlus::Py_isA(PyObject *value) // Python wrapper for isA PyObject *PyObjectPlus::Py_isA(PyObject *value) // Python wrapper for isA
{ {
if (!PyString_Check(value)) { if (PyType_Check(value)) {
PyErr_SetString(PyExc_TypeError, "expected a string"); return PyBool_FromLong(isA((PyTypeObject *)value));
return NULL; } else if (PyString_Check(value)) {
} return PyBool_FromLong(isA(PyString_AsString(value)));
if(isA(PyString_AsString(value))) }
Py_RETURN_TRUE; PyErr_SetString(PyExc_TypeError, "expected a type or a string");
else return NULL;
Py_RETURN_FALSE;
} }
/* Utility function called by the macro py_getattro_up() /* 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 * Other then making dir() useful the value returned from __dict__() is not useful
* since every value is a Py_None * 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 */ if(pydict==NULL) { /* incase calling __dict__ on the parent of this object raised an error */
PyErr_Clear(); PyErr_Clear();

View File

@@ -62,6 +62,7 @@
/* for pre Py 2.5 */ /* for pre Py 2.5 */
#if PY_VERSION_HEX < 0x02050000 #if PY_VERSION_HEX < 0x02050000
typedef int Py_ssize_t; typedef int Py_ssize_t;
typedef Py_ssize_t (*lenfunc)(PyObject *);
#define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MAX INT_MAX
#define PY_SSIZE_T_MIN INT_MIN #define PY_SSIZE_T_MIN INT_MIN
#define PY_METHODCHAR char * #define PY_METHODCHAR char *
@@ -74,6 +75,7 @@ typedef int Py_ssize_t;
#include "descrobject.h" #include "descrobject.h"
static inline void Py_Fatal(const char *M) { static inline void Py_Fatal(const char *M) {
fprintf(stderr, "%s\n", M); fprintf(stderr, "%s\n", M);
exit(-1); exit(-1);
@@ -108,7 +110,7 @@ static inline void Py_Fatal(const char *M) {
} \ } \
\ \
if (strcmp(PyString_AsString(attr), "__dict__")==0) {\ if (strcmp(PyString_AsString(attr), "__dict__")==0) {\
rvalue = _getattr_dict(rvalue, Methods, Attributes); \ rvalue = py_getattr_dict(rvalue, Methods, Attributes); \
} \ } \
return rvalue; \ 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_ #endif // _adr_py_lib_h_

View File

@@ -1421,7 +1421,7 @@ PyObject* KX_GameObject::pyattr_get_dir_dict(void *self_v, const KX_PYATTRIBUTE_
{ {
KX_GameObject* self= static_cast<KX_GameObject*>(self_v); KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
PyObject *dict_str = PyString_FromString("__dict__"); 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); Py_DECREF(dict_str);
if(dict==NULL) if(dict==NULL)

View File

@@ -1574,7 +1574,7 @@ PyObject* KX_Scene::pyattr_get_dir_dict(void *self_v, const KX_PYATTRIBUTE_DEF *
KX_Scene* self= static_cast<KX_Scene*>(self_v); KX_Scene* self= static_cast<KX_Scene*>(self_v);
/* Useually done by py_getattro_up but in this case we want to include m_attrlist dict */ /* 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_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); Py_DECREF(dict_str);
PyDict_Update(dict, self->m_attrlist); PyDict_Update(dict, self->m_attrlist);