[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