Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-04-07 20:00:32 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-04-07 20:00:32 +0400
commit18511c56d3cbfd0b368be61002960cc161cee526 (patch)
tree0809a4749ae64c1e34133a179b0bdd02a98c6f0c
parent1534eca60f181dc4e4299f6bdf73a66bbdf87970 (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.h6
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp17
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h9
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp2
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);