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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to