[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19036] trunk/blender/source/gameengine: Accept negative indices's for ListValues

Campbell Barton ideasman42 at gmail.com
Thu Feb 19 08:02:14 CET 2009


Revision: 19036
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19036
Author:   campbellbarton
Date:     2009-02-19 08:01:49 +0100 (Thu, 19 Feb 2009)

Log Message:
-----------
Accept negative indices's for ListValues
  scene.getObjectList()[-1] works like a python sequence.

removed some STR_String creation that was only used to do comparisons, in a simple expressions benchmark this made logic use 4% less overall.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/InputParser.cpp
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp

Modified: trunk/blender/source/gameengine/Expressions/InputParser.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/InputParser.cpp	2009-02-18 21:28:04 UTC (rev 19035)
+++ trunk/blender/source/gameengine/Expressions/InputParser.cpp	2009-02-19 07:01:49 UTC (rev 19036)
@@ -272,32 +272,29 @@
 				|| ((ch >= 'A') && (ch <= 'Z')))
 			{ // reserved word?
 				int start;
-				STR_String funstr;
 				start = chcount;
 				CharRep();
 				GrabString(start);
-				funstr = const_as_string;
-				funstr.Upper();
-				if (funstr == STR_String("SUM")) {
+				if (!strcasecmp(const_as_string, "SUM")) {
 					sym = sumsym;
 				}
-				else if (funstr == STR_String("NOT")) {
+				else if (!strcasecmp(const_as_string, "NOT")) {
 					sym = opsym;
 					opkind = OPnot;
 				}
-				else if (funstr == STR_String("AND")) {
+				else if (!strcasecmp(const_as_string, "AND")) {
 					sym = opsym; opkind = OPand;
 				}
-				else if (funstr == STR_String("OR")) {
+				else if (!strcasecmp(const_as_string, "OR")) {
 					sym = opsym; opkind = OPor;
 				}
-				else if (funstr == STR_String("IF")) {
+				else if (!strcasecmp(const_as_string, "IF"))
 					sym = ifsym;
-				} else if (funstr == STR_String("WHOMADE")) {
+				else if (!strcasecmp(const_as_string, "WHOMADE"))
 					sym = whocodedsym;
-				} else if (funstr == STR_String("FALSE")) {
+				else if (!strcasecmp(const_as_string, "FALSE")) {
 					sym = constsym; constkind = booltype; boolvalue = false;
-				} else if (funstr == STR_String("TRUE")) {
+				} else if (!strcasecmp(const_as_string, "TRUE")) {
 					sym = constsym; constkind = booltype; boolvalue = true;
 				} else {
 					sym = idsym;

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-02-18 21:28:04 UTC (rev 19035)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp	2009-02-19 07:01:49 UTC (rev 19036)
@@ -34,7 +34,12 @@
 
 PyObject* listvalue_buffer_item(PyObject* list,Py_ssize_t index)
 {
-	if (index >= 0 && index < ((CListValue*) list)->GetCount())
+	int count = ((CListValue*) list)->GetCount();
+	
+	if (index < 0)
+		index = count+index;
+	
+	if (index >= 0 && index < count)
 	{
 		PyObject* pyobj = ((CListValue*) list)->GetValue(index)->ConvertValueToPython();
 		if (pyobj)
@@ -64,8 +69,7 @@
 	}
 	
 	PyObject *pyindex_str = PyObject_Repr(pyindex); /* new ref */
-	STR_String index_str(PyString_AsString(pyindex_str));
-	PyErr_Format(PyExc_KeyError, "'%s' not in list", index_str.Ptr());
+	PyErr_Format(PyExc_KeyError, "'%s' not in list", PyString_AsString(pyindex_str));
 	Py_DECREF(pyindex_str);
 	return NULL;
 }

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-02-18 21:28:04 UTC (rev 19035)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2009-02-19 07:01:49 UTC (rev 19036)
@@ -94,7 +94,7 @@
  * PyObjectPlus Methods 	-- Every class, even the abstract one should have a Methods
 ------------------------------*/
 PyMethodDef PyObjectPlus::Methods[] = {
-  {"isA",		 (PyCFunction) sPy_isA,			METH_VARARGS},
+  {"isA",		 (PyCFunction) sPy_isA,			METH_O},
   {NULL, NULL}		/* Sentinel */
 };
 
@@ -688,19 +688,21 @@
   
   for (P = Ps[i=0]; P != NULL; P = Ps[i++])
   {
-      if (STR_String(P->tp_name) == STR_String(mytypename)	)
+      if (strcmp(P->tp_name, mytypename)==0)
 		  return true;
   }
 	
   return false;
 }
 
-PyObject *PyObjectPlus::Py_isA(PyObject *args)		// Python wrapper for isA
+PyObject *PyObjectPlus::Py_isA(PyObject *value)		// Python wrapper for isA
 {
   char *mytypename;
-  if (!PyArg_ParseTuple(args, "s", &mytypename))
+  if (!PyString_Check(value)) {
+    PyErr_SetString(PyExc_TypeError, "expected a string");
     return NULL;
-  if(isA(mytypename))
+  }
+  if(isA(PyString_AsString(value)))
     Py_RETURN_TRUE;
   else
     Py_RETURN_FALSE;

Modified: trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp	2009-02-18 21:28:04 UTC (rev 19035)
+++ trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp	2009-02-19 07:01:49 UTC (rev 19036)
@@ -199,7 +199,7 @@
 			{
 				if (client_info->m_auxilary_info)
 				{
-					found = (m_touchedpropname == STR_String((char*)client_info->m_auxilary_info));
+					found = (!strcmp(m_touchedpropname.Ptr(), (char*)client_info->m_auxilary_info));
 				}
 			} else
 			{





More information about the Bf-blender-cvs mailing list