[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41500] trunk/blender/source: python string conversion

Campbell Barton ideasman42 at gmail.com
Thu Nov 3 15:09:18 CET 2011


Revision: 41500
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41500
Author:   campbellbarton
Date:     2011-11-03 14:09:18 +0000 (Thu, 03 Nov 2011)
Log Message:
-----------
python string conversion
- use _PyUnicode_AsStringAndSize where possible
- use %R for PyErr_Format(...) rather then running repr on the object explicitly 
- use const char

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/moviecache.c
    trunk/blender/source/blender/python/generic/IDProp.c
    trunk/blender/source/blender/python/generic/IDProp.h
    trunk/blender/source/blender/python/generic/py_capi_utils.c
    trunk/blender/source/blender/python/intern/bpy_operator.c
    trunk/blender/source/blender/python/intern/bpy_props.c
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/Expressions/StringValue.h
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp

Modified: trunk/blender/source/blender/imbuf/intern/moviecache.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/moviecache.c	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/blender/imbuf/intern/moviecache.c	2011-11-03 14:09:18 UTC (rev 41500)
@@ -230,7 +230,7 @@
 
 	key= BLI_mempool_alloc(cache->keys_pool);
 	key->cache_owner= cache;
-	key->userkey= BLI_mempool_alloc(cache->userkeys_pool);;
+	key->userkey= BLI_mempool_alloc(cache->userkeys_pool);
 	memcpy(key->userkey, userkey, cache->keysize);
 
 	item= BLI_mempool_alloc(cache->items_pool);

Modified: trunk/blender/source/blender/python/generic/IDProp.c
===================================================================
--- trunk/blender/source/blender/python/generic/IDProp.c	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/blender/python/generic/IDProp.c	2011-11-03 14:09:18 UTC (rev 41500)
@@ -195,19 +195,22 @@
 
 static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUSED(closure))
 {
-	char *st;
+	const char *name;
+	Py_ssize_t name_size;
+
 	if (!PyUnicode_Check(value)) {
 		PyErr_SetString(PyExc_TypeError, "expected a string!");
 		return -1;
 	}
 
-	st = _PyUnicode_AsString(value);
-	if (BLI_strnlen(st, MAX_IDPROP_NAME) == MAX_IDPROP_NAME) {
+	name = _PyUnicode_AsStringAndSize(value, &name_size);
+
+	if (name_size > MAX_IDPROP_NAME) {
 		PyErr_SetString(PyExc_TypeError, "string length cannot exceed 31 characters!");
 		return -1;
 	}
 
-	BLI_strncpy(self->prop->name, st, sizeof(self->prop->name));
+	memcpy(self->prop->name, name, name_size);
 	return 0;
 }
 
@@ -236,7 +239,7 @@
 static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
 {
 	IDProperty *idprop;
-	char *name;
+	const char *name;
 
 	if (self->prop->type  != IDP_GROUP) {
 		PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
@@ -301,15 +304,23 @@
 	return type;
 }
 
-/* note: group can be a pointer array or a group */
-const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *group, PyObject *ob)
+/* note: group can be a pointer array or a group.
+ * assume we already checked key is a string. */
+const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *name_obj, IDProperty *group, PyObject *ob)
 {
 	IDProperty *prop = NULL;
 	IDPropertyTemplate val = {0};
 
-	if (strlen(name) >= sizeof(group->name))
-		return "the length of IDProperty names is limited to 31 characters";
+	const char *name= "";
 
+	if (name_obj) {
+		Py_ssize_t name_size;
+		name = _PyUnicode_AsStringAndSize(name_obj, &name_size);
+		if (name_size > MAX_IDPROP_NAME) {
+			return "the length of IDProperty names is limited to 31 characters";
+		}
+	}
+
 	if (PyFloat_Check(ob)) {
 		val.d = PyFloat_AsDouble(ob);
 		prop = IDP_New(IDP_DOUBLE, val, name);
@@ -364,7 +375,7 @@
 			for (i=0; i<val.array.len; i++) {
 				const char *error;
 				item = PySequence_GetItem(ob, i);
-				error= BPy_IDProperty_Map_ValidateAndCreate("", prop, item);
+				error= BPy_IDProperty_Map_ValidateAndCreate(NULL, prop, item);
 				Py_DECREF(item);
 
 				if (error)
@@ -396,7 +407,7 @@
 				Py_XDECREF(pval);
 				return "invalid element in subgroup dict template!";
 			}
-			if (BPy_IDProperty_Map_ValidateAndCreate(_PyUnicode_AsString(key), prop, pval)) {
+			if (BPy_IDProperty_Map_ValidateAndCreate(key, prop, pval)) {
 				IDP_FreeProperty(prop);
 				MEM_freeN(prop);
 				Py_XDECREF(keys);
@@ -453,7 +464,7 @@
 			return -1;
 		}
 
-		err = BPy_IDProperty_Map_ValidateAndCreate(_PyUnicode_AsString(key), prop, val);
+		err = BPy_IDProperty_Map_ValidateAndCreate(key, prop, val);
 		if (err) {
 			PyErr_SetString(PyExc_KeyError, err );
 			return -1;
@@ -587,7 +598,7 @@
 {
 	IDProperty *idprop;
 	PyObject *pyform;
-	char *name = _PyUnicode_AsString(value);
+	const char *name = _PyUnicode_AsString(value);
 
 	if (!name) {
 		PyErr_SetString(PyExc_TypeError, "pop expected at least 1 argument, got 0");
@@ -724,7 +735,7 @@
 
 static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value)
 {
-	char *name = _PyUnicode_AsString(value);
+	const char *name = _PyUnicode_AsString(value);
 
 	if (!name) {
 		PyErr_SetString(PyExc_TypeError, "expected a string");

Modified: trunk/blender/source/blender/python/generic/IDProp.h
===================================================================
--- trunk/blender/source/blender/python/generic/IDProp.h	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/blender/python/generic/IDProp.h	2011-11-03 14:09:18 UTC (rev 41500)
@@ -61,7 +61,7 @@
 
 
 PyObject *BPy_IDGroup_WrapData(struct ID *id, struct IDProperty *prop );
-const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, struct IDProperty *group, PyObject *ob);
+const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *key, struct IDProperty *group, PyObject *ob);
 
 void IDProp_Init_Types(void);
 

Modified: trunk/blender/source/blender/python/generic/py_capi_utils.c
===================================================================
--- trunk/blender/source/blender/python/generic/py_capi_utils.c	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/blender/python/generic/py_capi_utils.c	2011-11-03 14:09:18 UTC (rev 41500)
@@ -363,7 +363,7 @@
 /* string conversion, escape non-unicode chars, coerce must be set to NULL */
 const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
 {
-	char *result;
+	const char *result;
 
 	result= _PyUnicode_AsString(py_str);
 

Modified: trunk/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_operator.c	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/blender/python/intern/bpy_operator.c	2011-11-03 14:09:18 UTC (rev 41500)
@@ -380,7 +380,7 @@
 {
 	wmOperatorType *ot;
 	PointerRNA ptr;
-	char *opname= _PyUnicode_AsString(value);
+	const char *opname= _PyUnicode_AsString(value);
 	BPy_StructRNA *pyrna= NULL;
 	
 	if (opname==NULL) {
@@ -413,7 +413,7 @@
 	wmOperatorType *ot;
 	wmOperator *op;
 	PointerRNA ptr;
-	char *opname= _PyUnicode_AsString(value);
+	const char *opname= _PyUnicode_AsString(value);
 	BPy_StructRNA *pyrna= NULL;
 
 	if (opname==NULL) {

Modified: trunk/blender/source/blender/python/intern/bpy_props.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_props.c	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/blender/python/intern/bpy_props.c	2011-11-03 14:09:18 UTC (rev 41500)
@@ -1211,7 +1211,7 @@
 	if (!srna) {
 		if (PyErr_Occurred()) {
 			PyObject *msg= PyC_ExceptionBuffer();
-			char *msg_char= _PyUnicode_AsString(msg);
+			const char *msg_char= _PyUnicode_AsString(msg);
 			PyErr_Format(PyExc_TypeError,
 			             "%.200s expected an RNA type derived from PropertyGroup, failed with: %s",
 			             error_prefix, msg_char);

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp	2011-11-03 14:09:18 UTC (rev 41500)
@@ -344,8 +344,9 @@
 /* Python functions                                                          */
 /* ------------------------------------------------------------------------- */
 
-PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) {
-	char *string= _PyUnicode_AsString(value);
+PyObject* BL_ActionActuator::PyGetChannel(PyObject* value)
+{
+	const char *string= _PyUnicode_AsString(value);
 	
 	if (!string) {
 		PyErr_SetString(PyExc_TypeError, "expected a single string");

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp	2011-11-03 14:09:18 UTC (rev 41500)
@@ -339,10 +339,9 @@
 		int index = PyLong_AsSsize_t(pyindex);
 		return listvalue_buffer_item(self, index); /* wont add a ref */
 	}
-	
-	PyObject *pyindex_str = PyObject_Repr(pyindex); /* new ref */
-	PyErr_Format(PyExc_KeyError, "CList[key]: '%s' key not in list", _PyUnicode_AsString(pyindex_str));
-	Py_DECREF(pyindex_str);
+
+	PyErr_Format(PyExc_KeyError,
+	             "CList[key]: '%R' key not in list", pyindex);
 	return NULL;
 }
 

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp	2011-11-03 14:09:18 UTC (rev 41500)
@@ -1012,8 +1012,8 @@
 			{
 				if (PyUnicode_Check(value)) 
 				{
-					Py_ssize_t val_len;
-					char *val = _PyUnicode_AsStringAndSize(value, &val_len);
+					Py_ssize_t val_size;
+					const char *val = _PyUnicode_AsStringAndSize(value, &val_size);
 					strncpy(ptr, val, attrdef->m_size);
 					ptr[attrdef->m_size-1] = 0;
 				}
@@ -1030,7 +1030,7 @@
 				if (PyUnicode_Check(value)) 
 				{
 					Py_ssize_t val_len;
-					char *val = _PyUnicode_AsStringAndSize(value, &val_len);
+					const char *val = _PyUnicode_AsStringAndSize(value, &val_len); /* XXX, should be 'const' but we do a silly trick to have a shorter string */
 					if (attrdef->m_clamp)
 					{
 						if (val_len < attrdef->m_imin)
@@ -1042,10 +1042,8 @@
 						else if (val_len > attrdef->m_imax)
 						{
 							// trim the string
-							char c = val[attrdef->m_imax];
-							val[attrdef->m_imax] = 0;
 							*var = val;
-							val[attrdef->m_imax] = c;
+							var->SetLength(attrdef->m_imax);
 							break;
 						}
 					} else if (val_len < attrdef->m_imin || val_len > attrdef->m_imax)

Modified: trunk/blender/source/gameengine/Expressions/StringValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/StringValue.h	2011-11-03 13:49:04 UTC (rev 41499)
+++ trunk/blender/source/gameengine/Expressions/StringValue.h	2011-11-03 14:09:18 UTC (rev 41500)
@@ -31,8 +31,7 @@
 	CStringValue();
 	CStringValue (const char *txt, const char *name , AllocationTYPE alloctype = CValue::HEAPVALUE);
 
-	virtual ~CStringValue() {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list