Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-10-22 23:06:41 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-10-22 23:06:41 +0400
commit2bfd10131e7bcd5926c65c381a3e987145b02ad9 (patch)
treeb88f9d4cc842a78db4f555d23c1412a950569661 /source/blender/python
parent83a44e48e7cb5cc6c794b50bb168a21144baeb06 (diff)
parent726fa618172733f3c4dc5ee85642829400e68f7b (diff)
Cycles: svn merge -r41182:41205 ^/trunk/blender
Diffstat (limited to 'source/blender/python')
-rw-r--r--source/blender/python/generic/IDProp.c8
-rw-r--r--source/blender/python/generic/py_capi_utils.c11
-rw-r--r--source/blender/python/generic/py_capi_utils.h5
-rw-r--r--source/blender/python/intern/bpy_interface.c15
-rw-r--r--source/blender/python/intern/bpy_rna.c42
5 files changed, 51 insertions, 30 deletions
diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c
index 1524812086b..541008ebaa5 100644
--- a/source/blender/python/generic/IDProp.c
+++ b/source/blender/python/generic/IDProp.c
@@ -67,9 +67,9 @@ PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop )
switch ( prop->type ) {
case IDP_STRING:
#ifdef USE_STRING_COERCE
- return PyC_UnicodeFromByte(IDP_Array(prop));
+ return PyC_UnicodeFromByteAndSize(IDP_Array(prop), prop->len);
#else
- return PyUnicode_FromString(IDP_Array(prop));
+ return PyUnicode_FromStringAndSize(IDP_Array(prop), prop->len);
#endif
case IDP_INT:
return PyLong_FromLong( (long)prop->data.val );
@@ -485,9 +485,9 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
switch (prop->type) {
case IDP_STRING:
#ifdef USE_STRING_COERCE
- return PyC_UnicodeFromByte(IDP_Array(prop));
+ return PyC_UnicodeFromByteAndSize(IDP_Array(prop), prop->len);
#else
- return PyUnicode_FromString(IDP_Array(prop));
+ return PyUnicode_FromStringAndSize(IDP_Array(prop), prop->len);
#endif
break;
case IDP_FLOAT:
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index 575495e186e..587ac69071e 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -386,9 +386,9 @@ const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
}
}
-PyObject *PyC_UnicodeFromByte(const char *str)
+PyObject *PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size)
{
- PyObject *result= PyUnicode_FromString(str);
+ PyObject *result= PyUnicode_FromStringAndSize(str, size);
if (result) {
/* 99% of the time this is enough but we better support non unicode
* chars since blender doesnt limit this */
@@ -397,11 +397,16 @@ PyObject *PyC_UnicodeFromByte(const char *str)
else {
PyErr_Clear();
/* this means paths will always be accessible once converted, on all OS's */
- result= PyUnicode_DecodeFSDefault(str);
+ result= PyUnicode_DecodeFSDefaultAndSize(str, size);
return result;
}
}
+PyObject *PyC_UnicodeFromByte(const char *str)
+{
+ return PyC_UnicodeFromByteAndSize(str, strlen(str));
+}
+
/*****************************************************************************
* Description: This function creates a new Python dictionary object.
* note: dict is owned by sys.modules["__main__"] module, reference is borrowed
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index f38ce209be2..ccd001aabd4 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -40,8 +40,9 @@ void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python
int PyC_AsArray(void *array, PyObject *value, const int length, const PyTypeObject *type, const short is_double, const char *error_prefix);
/* follow http://www.python.org/dev/peps/pep-0383/ */
-PyObject * PyC_UnicodeFromByte(const char *str);
-const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+PyObject * PyC_UnicodeFromByte(const char *str);
+PyObject * PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size);
+const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
/* name namespace function for bpy & bge */
PyObject * PyC_DefaultNameSpace(const char *filename);
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index a937dcb1c89..d8a6b192a23 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -208,9 +208,9 @@ void BPY_python_start(int argc, const char **argv)
/* allow to use our own included python */
PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL));
- /* Python 3.2 now looks for '2.58/python/include/python3.2d/pyconfig.h' to parse
- * from the 'sysconfig' module which is used by 'site', so for now disable site.
- * alternatively we could copy the file. */
+ /* Python 3.2 now looks for '2.xx/python/include/python3.2d/pyconfig.h' to
+ * parse from the 'sysconfig' module which is used by 'site',
+ * so for now disable site. alternatively we could copy the file. */
Py_NoSiteFlag= 1;
Py_Initialize();
@@ -220,8 +220,11 @@ void BPY_python_start(int argc, const char **argv)
{
int i;
PyObject *py_argv= PyList_New(argc);
- for (i=0; i<argc; i++)
- PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i])); /* should fix bug #20021 - utf path name problems, by replacing PyUnicode_FromString */
+ for (i=0; i<argc; i++) {
+ /* should fix bug #20021 - utf path name problems, by replacing
+ * PyUnicode_FromString, with this one */
+ PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
+ }
PySys_SetObject("argv", py_argv);
Py_DECREF(py_argv);
@@ -676,7 +679,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *
#ifdef WITH_PYTHON_MODULE
-#include "BLI_storage.h"
+#include "BLI_fileops.h"
/* TODO, reloading the module isnt functional at the moment. */
static void bpy_module_free(void *mod);
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index a6306909699..70e7ba051f0 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -810,7 +810,7 @@ static PyObject *pyrna_struct_str(BPy_StructRNA *self)
}
/* print name if available */
- name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
+ name= RNA_struct_name_get_alloc(&self->ptr, NULL, 0, NULL);
if (name) {
ret= PyUnicode_FromFormat("<bpy_struct, %.200s(\"%.200s\")>",
RNA_struct_identifier(self->ptr.type),
@@ -901,7 +901,7 @@ static PyObject *pyrna_prop_str(BPy_PropertyRNA *self)
/* if a pointer, try to print name of pointer target too */
if (RNA_property_type(self->prop) == PROP_POINTER) {
ptr= RNA_property_pointer_get(&self->ptr, self->prop);
- name= RNA_struct_name_get_alloc(&ptr, NULL, FALSE);
+ name= RNA_struct_name_get_alloc(&ptr, NULL, 0, NULL);
if (name) {
ret= PyUnicode_FromFormat("<bpy_%.200s, %.200s.%.200s(\"%.200s\")>",
@@ -1257,14 +1257,22 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
ret= PyUnicode_FromString(enum_item->identifier);
}
else {
- const char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, FALSE);
+ const char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, 0, NULL);
/* prefer not fail silently incase of api errors, maybe disable it later */
- printf("RNA Warning: Current value \"%d\" matches no enum in '%s', '%s', '%s'\n", val, RNA_struct_identifier(ptr->type), ptr_name, RNA_property_identifier(prop));
+ printf("RNA Warning: Current value \"%d\" "
+ "matches no enum in '%s', '%s', '%s'\n",
+ val, RNA_struct_identifier(ptr->type),
+ ptr_name, RNA_property_identifier(prop));
#if 0 // gives python decoding errors while generating docs :(
char error_str[256];
- BLI_snprintf(error_str, sizeof(error_str), "RNA Warning: Current value \"%d\" matches no enum in '%s', '%s', '%s'", val, RNA_struct_identifier(ptr->type), ptr_name, RNA_property_identifier(prop));
+ BLI_snprintf(error_str, sizeof(error_str),
+ "RNA Warning: Current value \"%d\" "
+ "matches no enum in '%s', '%s', '%s'",
+ val, RNA_struct_identifier(ptr->type),
+ ptr_name, RNA_property_identifier(prop));
+
PyErr_Warn(PyExc_RuntimeWarning, error_str);
#endif
@@ -1311,19 +1319,20 @@ PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
{
int subtype= RNA_property_subtype(prop);
const char *buf;
+ int buf_len;
char buf_fixed[32];
- buf= RNA_property_string_get_alloc(ptr, prop, buf_fixed, sizeof(buf_fixed));
+ buf= RNA_property_string_get_alloc(ptr, prop, buf_fixed, sizeof(buf_fixed), &buf_len);
#ifdef USE_STRING_COERCE
/* only file paths get special treatment, they may contain non utf-8 chars */
if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
- ret= PyC_UnicodeFromByte(buf);
+ ret= PyC_UnicodeFromByteAndSize(buf, buf_len);
}
else {
- ret= PyUnicode_FromString(buf);
+ ret= PyUnicode_FromStringAndSize(buf, buf_len);
}
#else // USE_STRING_COERCE
- ret= PyUnicode_FromString(buf);
+ ret= PyUnicode_FromStringAndSize(buf, buf_len);
#endif // USE_STRING_COERCE
if (buf_fixed != buf) {
MEM_freeN((void *)buf);
@@ -3127,14 +3136,15 @@ static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
* Collect RNA attributes
*/
char name[256], *nameptr;
+ int namelen;
iterprop= RNA_struct_iterator_property(ptr->type);
RNA_PROP_BEGIN(ptr, itemptr, iterprop) {
- nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name));
+ nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
if (nameptr) {
- pystring= PyUnicode_FromString(nameptr);
+ pystring= PyUnicode_FromStringAndSize(nameptr, namelen);
PyList_Append(list, pystring);
Py_DECREF(pystring);
@@ -3716,13 +3726,14 @@ static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
PyObject *ret= PyList_New(0);
PyObject *item;
char name[256], *nameptr;
+ int namelen;
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name));
+ nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
if (nameptr) {
/* add to python list */
- item= PyUnicode_FromString(nameptr);
+ item= PyUnicode_FromStringAndSize(nameptr, namelen);
PyList_Append(ret, item);
Py_DECREF(item);
/* done */
@@ -3751,15 +3762,16 @@ static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
PyObject *ret= PyList_New(0);
PyObject *item;
char name[256], *nameptr;
+ int namelen;
int i= 0;
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
if (itemptr.data) {
/* add to python list */
item= PyTuple_New(2);
- nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name));
+ nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
if (nameptr) {
- PyTuple_SET_ITEM(item, 0, PyUnicode_FromString(nameptr));
+ PyTuple_SET_ITEM(item, 0, PyUnicode_FromStringAndSize(nameptr, namelen));
if (name != nameptr)
MEM_freeN(nameptr);
}