[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20828] trunk/blender/source/gameengine: use contains for ListValue and KX_GameObject types ( has_key is deprecated by python)

Campbell Barton ideasman42 at gmail.com
Fri Jun 12 14:56:12 CEST 2009


Revision: 20828
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20828
Author:   campbellbarton
Date:     2009-06-12 14:56:12 +0200 (Fri, 12 Jun 2009)

Log Message:
-----------
use contains for ListValue and KX_GameObject types (has_key is deprecated by python)
eg.
 if 'prop' in gameOb: ...
 if 'GameOb' in sce.objects: ...

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-06-12 09:54:28 UTC (rev 20827)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-06-12 12:56:12 UTC (rev 20828)
@@ -209,6 +209,30 @@
 	return listval_new->NewProxy(true); /* python owns this list */
 }
 
+static int listvalue_buffer_contains(PyObject *self_v, PyObject *value)
+{
+	CListValue *self= static_cast<CListValue *>(BGE_PROXY_REF(self_v));
+	
+	if (self==NULL) {
+		PyErr_SetString(PyExc_SystemError, "val in CList, "BGE_PROXY_ERROR_MSG);
+		return -1;
+	}
+	
+	if (PyString_Check(value)) {
+		if (self->FindValue((const char *)PyString_AsString(value))) {
+			return 1;
+		}
+	}
+	else if (BGE_PROXY_CHECK_TYPE(value)) { /* not dict like at all but this worked before __contains__ was used */
+		CValue *item= static_cast<CValue *>(BGE_PROXY_REF(value));
+		for (int i=0; i < self->GetCount(); i++)
+			if (self->GetValue(i) == item) // Com
+				return 1;
+		
+	} // not using CheckEqual
+	
+	return 0;
+}
 
 
 static  PySequenceMethods listvalue_as_sequence = {
@@ -225,6 +249,7 @@
  	NULL, /*sq_ass_item*/
  	NULL, /*sq_ass_slice*/
 #endif
+	(objobjproc)listvalue_buffer_contains,	/* sq_contains */
 };
 
 
@@ -264,7 +289,9 @@
 	0,
 	py_base_getattro,
 	py_base_setattro,
-	0,0,0,0,0,0,0,0,0,
+	0,
+	Py_TPFLAGS_DEFAULT,
+	0,0,0,0,0,0,0,
 	Methods
 };
 
@@ -499,7 +526,7 @@
 bool CListValue::CheckEqual(CValue* first,CValue* second)
 {
 	bool result = false;
-
+	
 	CValue* eqval =  ((CValue*)first)->Calc(VALUE_EQL_OPERATOR,(CValue*)second);
 	
 	if (eqval==NULL)
@@ -528,7 +555,7 @@
 	for (int i=0;i<numelem;i++)
 	{
 		CValue* elem = 			GetValue(i);
-		if (CheckEqual(checkobj,elem))
+		if (checkobj==elem || CheckEqual(checkobj,elem))
 		{
 			result = PyInt_FromLong(i);
 			break;
@@ -560,7 +587,7 @@
 	for (int i=0;i<numelem;i++)
 	{
 		CValue* elem = 			GetValue(i);
-		if (CheckEqual(checkobj,elem))
+		if (checkobj==elem || CheckEqual(checkobj,elem))
 		{
 			numfound ++;
 		}

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp	2009-06-12 09:54:28 UTC (rev 20827)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp	2009-06-12 12:56:12 UTC (rev 20828)
@@ -547,12 +547,15 @@
 		0,
 		0,
 		py_base_repr,
-		0,0,
+		0,
+		&KX_GameObject::Sequence,
 		&KX_GameObject::Mapping,
 		0,0,0,
 		py_base_getattro,
 		py_base_setattro,
-		0,0,0,0,0,0,0,0,0,
+		0,
+		Py_TPFLAGS_DEFAULT,
+		0,0,0,0,0,0,0,
 		Methods
 };
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-06-12 09:54:28 UTC (rev 20827)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-06-12 12:56:12 UTC (rev 20828)
@@ -1287,7 +1287,7 @@
 	return PyObjectFrom(NodeGetWorldPosition());
 }
 
-PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
+static PyObject *Map_GetItem(PyObject *self_v, PyObject *item)
 {
 	KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
 	const char *attr_str= PyString_AsString(item);
@@ -1295,7 +1295,7 @@
 	PyObject* pyconvert;
 	
 	if (self==NULL) {
-		PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+		PyErr_SetString(PyExc_SystemError, "val = gameOb[key]: KX_GameObject, "BGE_PROXY_ERROR_MSG);
 		return NULL;
 	}
 	
@@ -1321,7 +1321,7 @@
 }
 
 
-int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
+static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
 {
 	KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
 	const char *attr_str= PyString_AsString(key);
@@ -1329,7 +1329,7 @@
 		PyErr_Clear();
 	
 	if (self==NULL) {
-		PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+		PyErr_SetString(PyExc_SystemError, "gameOb[key] = value: KX_GameObject, "BGE_PROXY_ERROR_MSG);
 		return -1;
 	}
 	
@@ -1409,13 +1409,42 @@
 	return 0; /* success */
 }
 
-/* Cant set the len otherwise it can evaluate as false */
+static int Seq_Contains(PyObject *self_v, PyObject *value)
+{
+	KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
+	
+	if (self==NULL) {
+		PyErr_SetString(PyExc_SystemError, "val in gameOb: KX_GameObject, "BGE_PROXY_ERROR_MSG);
+		return -1;
+	}
+	
+	if(PyString_Check(value) && self->GetProperty(PyString_AsString(value)))
+		return 1;
+	
+	if (self->m_attr_dict && PyDict_GetItem(self->m_attr_dict, value))
+		return 1;
+	
+	return 0;
+}
+
+
 PyMappingMethods KX_GameObject::Mapping = {
 	(lenfunc)NULL					, 			/*inquiry mp_length */
-	(binaryfunc)KX_GameObject::Map_GetItem,		/*binaryfunc mp_subscript */
-	(objobjargproc)KX_GameObject::Map_SetItem,	/*objobjargproc mp_ass_subscript */
+	(binaryfunc)Map_GetItem,		/*binaryfunc mp_subscript */
+	(objobjargproc)Map_SetItem,	/*objobjargproc mp_ass_subscript */
 };
 
+PySequenceMethods KX_GameObject::Sequence = {
+	NULL,		/* Cant set the len otherwise it can evaluate as false */
+	NULL,		/* sq_concat */
+	NULL,		/* sq_repeat */
+	NULL,		/* sq_item */
+	NULL,		/* sq_slice */
+	NULL,		/* sq_ass_item */
+	NULL,		/* sq_ass_slice */
+	(objobjproc)Seq_Contains,	/* sq_contains */
+};
+
 PyTypeObject KX_GameObject::Type = {
 #if (PY_VERSION_HEX >= 0x02060000)
 	PyVarObject_HEAD_INIT(NULL, 0)
@@ -1433,12 +1462,15 @@
 		0,
 		0,
 		py_base_repr,
-		0,0,
+		0,
+		&Sequence,
 		&Mapping,
 		0,0,0,
 		py_base_getattro,
 		py_base_setattro,
-		0,0,0,0,0,0,0,0,0,
+		0,
+		Py_TPFLAGS_DEFAULT,
+		0,0,0,0,0,0,0,
 		Methods
 };
 
@@ -2779,16 +2811,11 @@
 /* Matches python dict.has_key() */
 PyObject* KX_GameObject::Pyhas_key(PyObject* value)
 {
-	if(PyString_Check(value) && GetProperty(PyString_AsString(value)))
-		Py_RETURN_TRUE;
-	
-	if (m_attr_dict && PyDict_GetItem(m_attr_dict, value))
-		Py_RETURN_TRUE;
-	
-	Py_RETURN_FALSE;
+	// the ONLY error case is invalid data, this is checked by the macro'd static function
+	// that calls this one. but make sure Seq_Contains doesnt add extra errors later on.
+	return PyBool_FromLong(Seq_Contains((PyObject *)this, value));
 }
 
-
 /* --------------------------------------------------------------------- 
  * Some stuff taken from the header
  * --------------------------------------------------------------------- */

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h	2009-06-12 09:54:28 UTC (rev 20827)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h	2009-06-12 12:56:12 UTC (rev 20828)
@@ -917,10 +917,8 @@
 	static PyObject*	pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
 	
 	/* getitem/setitem */
-	static Py_ssize_t			Map_Len(PyObject* self);
 	static PyMappingMethods	Mapping;
-	static PyObject*			Map_GetItem(PyObject *self_v, PyObject *item);
-	static int					Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val);
+	static PySequenceMethods	Sequence;
 	
 private :
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2009-06-12 09:54:28 UTC (rev 20827)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2009-06-12 12:56:12 UTC (rev 20828)
@@ -293,12 +293,15 @@
 		0,
 		0,
 		py_base_repr,
-		0,0,
+		0,
+		&KX_GameObject::Sequence,
 		&KX_GameObject::Mapping,
 		0,0,0,
 		py_base_getattro,
 		py_base_setattro,
-		0,0,0,0,0,0,0,0,0,
+		0,
+		Py_TPFLAGS_DEFAULT,
+		0,0,0,0,0,0,0,
 		Methods
 };
 





More information about the Bf-blender-cvs mailing list