diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-04-07 20:00:32 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-04-07 20:00:32 +0400 |
commit | 18511c56d3cbfd0b368be61002960cc161cee526 (patch) | |
tree | 0809a4749ae64c1e34133a179b0bdd02a98c6f0c | |
parent | 1534eca60f181dc4e4299f6bdf73a66bbdf87970 (diff) |
BGE Python API (small changes)
- Make BGE's ListValue types convert to python lists for printing since the CValue GetText() function didnt work well- printing lists as [,,,,,] for scene objects and mesh materials for eg.
- Check attributes are descriptor types before casting.
- py_getattr_dict use the Type dict rather then Method and Attribute array.
-rw-r--r-- | source/gameengine/Expressions/ListValue.h | 6 | ||||
-rw-r--r-- | source/gameengine/Expressions/PyObjectPlus.cpp | 17 | ||||
-rw-r--r-- | source/gameengine/Expressions/PyObjectPlus.h | 9 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 2 |
5 files changed, 17 insertions, 19 deletions
diff --git a/source/gameengine/Expressions/ListValue.h b/source/gameengine/Expressions/ListValue.h index f936298a8c4..1c01c2d221d 100644 --- a/source/gameengine/Expressions/ListValue.h +++ b/source/gameengine/Expressions/ListValue.h @@ -60,6 +60,12 @@ public: bool CheckEqual(CValue* first,CValue* second); virtual PyObject* py_getattro(PyObject* attr); + virtual PyObject* py_repr(void) { + PyObject *py_list= PySequence_List((PyObject *)this); + PyObject *py_string= PyObject_Repr(py_list); + Py_DECREF(py_list); + return py_string; + } KX_PYMETHOD_O(CListValue,append); KX_PYMETHOD_NOARGS(CListValue,reverse); diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index 3148dfc2b89..4526f8f649b 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -115,7 +115,7 @@ PyObject *PyObjectPlus::py_getattro(PyObject* attr) PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \ if (descr == NULL) { if (strcmp(PyString_AsString(attr), "__dict__")==0) { - return py_getattr_dict(NULL, Methods, NULL); /* no Attributes yet */ + return py_getattr_dict(NULL, Type.tp_dict); /* no Attributes yet */ } PyErr_SetString(PyExc_AttributeError, "attribute not found"); return NULL; @@ -767,25 +767,14 @@ 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 *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef) +PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict) { if(pydict==NULL) { /* incase calling __dict__ on the parent of this object raised an error */ PyErr_Clear(); pydict = PyDict_New(); } - if(meth) { - for (; meth->ml_name != NULL; meth++) { - PyDict_SetItemString(pydict, meth->ml_name, Py_None); - } - } - - if(attrdef) { - for (; attrdef->m_name != NULL; attrdef++) { - PyDict_SetItemString(pydict, attrdef->m_name, Py_None); - } - } - + PyDict_Update(pydict, tp_dict); return pydict; } diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index 41bf72964ce..d549be6ef60 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -105,15 +105,18 @@ static inline void Py_Fatal(const char *M) { if(descr) { \ if (PyCObject_Check(descr)) { \ return py_get_attrdef((void *)this, (const PyAttributeDef*)PyCObject_AsVoidPtr(descr)); \ - } else { \ + } else if (descr->ob_type->tp_descr_get) { \ return PyCFunction_New(((PyMethodDescrObject *)descr)->d_method, (PyObject *)this); \ + } else { \ + fprintf(stderr, "unknown attribute type"); \ + return descr; \ } \ } else { \ PyErr_Clear(); \ PyObject *rvalue= Parent::py_getattro(attr); \ \ if (strcmp(PyString_AsString(attr), "__dict__")==0) { \ - return py_getattr_dict(rvalue, Methods, Attributes); \ + return py_getattr_dict(rvalue, Type.tp_dict); \ } \ \ return rvalue; \ @@ -434,7 +437,7 @@ public: } }; -PyObject *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef); +PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict); #endif // _adr_py_lib_h_ diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index af905114ee4..7f99a565769 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -1486,7 +1486,7 @@ PyObject* KX_GameObject::pyattr_get_dir_dict(void *self_v, const KX_PYATTRIBUTE_ { KX_GameObject* self= static_cast<KX_GameObject*>(self_v); PyObject *dict_str = PyString_FromString("__dict__"); - PyObject *dict= py_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), Type.tp_dict); Py_DECREF(dict_str); if(dict==NULL) diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 493df31d982..04d6bd75f92 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<KX_Scene*>(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= py_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), Type.tp_dict); Py_DECREF(dict_str); PyDict_Update(dict, self->m_attrlist); |