[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19532] trunk/blender/source/gameengine: - should fix compiling with older python versions (<2.5)

Campbell Barton ideasman42 at gmail.com
Sat Apr 4 10:20:53 CEST 2009


Revision: 19532
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19532
Author:   campbellbarton
Date:     2009-04-04 10:20:52 +0200 (Sat, 04 Apr 2009)

Log Message:
-----------
- 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

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-04-04 04:56:05 UTC (rev 19531)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-04-04 08:20:52 UTC (rev 19532)
@@ -703,35 +703,40 @@
 ------------------------------*/
 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 @@
  * 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();

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.h	2009-04-04 04:56:05 UTC (rev 19531)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.h	2009-04-04 08:20:52 UTC (rev 19532)
@@ -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 @@
 
 #include "descrobject.h"
 
+
 static inline void Py_Fatal(const char *M) {
 	fprintf(stderr, "%s\n", M);
 	exit(-1);
@@ -108,7 +110,7 @@
 	} \
 	\
 	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 @@
 	}
 };
 
-PyObject *_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef);
+PyObject *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef *attrdef);
 
 #endif //  _adr_py_lib_h_
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-04-04 04:56:05 UTC (rev 19531)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-04-04 08:20:52 UTC (rev 19532)
@@ -1421,7 +1421,7 @@
 {
 	KX_GameObject* self= static_cast<KX_GameObject*>(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)

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-04-04 04:56:05 UTC (rev 19531)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-04-04 08:20:52 UTC (rev 19532)
@@ -1574,7 +1574,7 @@
 	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= _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);





More information about the Bf-blender-cvs mailing list