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.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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_
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user