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:
authorCampbell Barton <ideasman42@gmail.com>2011-01-14 00:44:18 +0300
committerCampbell Barton <ideasman42@gmail.com>2011-01-14 00:44:18 +0300
commitc8df192de6710c280c82ae39a3dc5de851af4c70 (patch)
tree2c6ba93c3255898942126d3134cbdf9702b1196d /source/blender/python/intern/bpy_rna_array.c
parent5bdb576d3d097cc5ad09a93a6ca2ece4a7622efb (diff)
misc python api improvements
- rna array parsing was using PySequence_Size() in a loop, this can be slow to run so only call once. - assigning a single value to a multi-dimensional array was missing type check. - improve exception messages for rna array type errors. - simplify vector slice assignment by using mathutils_array_parse(...)
Diffstat (limited to 'source/blender/python/intern/bpy_rna_array.c')
-rw-r--r--source/blender/python/intern/bpy_rna_array.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/source/blender/python/intern/bpy_rna_array.c b/source/blender/python/intern/bpy_rna_array.c
index f3b3615793b..32efa387196 100644
--- a/source/blender/python/intern/bpy_rna_array.c
+++ b/source/blender/python/intern/bpy_rna_array.c
@@ -56,15 +56,15 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
/* not the last dimension */
if (dim + 1 < totdim) {
/* check that a sequence contains dimsize[dim] items */
-
- for (i= 0; i < PySequence_Size(seq); i++) {
+ const int seq_size= PySequence_Size(seq);
+ for (i= 0; i < seq_size; i++) {
PyObject *item;
int ok= 1;
item= PySequence_GetItem(seq, i);
if (!PySequence_Check(item)) {
/* BLI_snprintf(error_str, error_str_size, "expected a sequence of %s", item_type_str); */
- PyErr_Format(PyExc_TypeError, "%s expected a sequence of %s", error_prefix, item_type_str);
+ PyErr_Format(PyExc_TypeError, "%s expected a sequence of %s, not %s", error_prefix, item_type_str, Py_TYPE(item)->tp_name);
ok= 0;
}
/* arr[3][4][5]
@@ -89,14 +89,15 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
}
else {
/* check that items are of correct type */
- for (i= 0; i < PySequence_Size(seq); i++) {
+ const int seq_size= PySequence_Size(seq);
+ for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
if (!check_item_type(item)) {
Py_DECREF(item);
/* BLI_snprintf(error_str, error_str_size, "sequence items should be of type %s", item_type_str); */
- PyErr_Format(PyExc_TypeError, "sequence items should be of type %s", item_type_str);
+ PyErr_Format(PyExc_TypeError, "expected sequence items of type %s, not %s", item_type_str, Py_TYPE(item)->tp_name);
return 0;
}
@@ -113,8 +114,9 @@ static int count_items(PyObject *seq)
int totitem= 0;
if (PySequence_Check(seq)) {
+ const int seq_size= PySequence_Size(seq);
int i;
- for (i= 0; i < PySequence_Size(seq); i++) {
+ for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
totitem += count_items(item);
Py_DECREF(item);
@@ -183,7 +185,7 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
if (tot != len) {
/* BLI_snprintf(error_str, error_str_size, "sequence must have length of %d", len); */
- PyErr_Format(PyExc_ValueError, "%s sequence must have %d items total", error_prefix, len);
+ PyErr_Format(PyExc_ValueError, "%s sequence must have %d items total, not %d", error_prefix, len, tot);
return 0;
}
}
@@ -227,8 +229,9 @@ static char *copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, int
{
unsigned int i;
int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ const int seq_size= PySequence_Size(seq);
- for (i= 0; i < PySequence_Size(seq); i++) {
+ for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
if (dim + 1 < totdim) {
@@ -310,6 +313,10 @@ static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, i
index += arrayoffset;
if(lvalue_dim == totdim) { /* single item, assign directly */
+ if(!check_item_type(py)) {
+ PyErr_Format(PyExc_TypeError, "%s expected a %s type, not %s", error_prefix, item_type_str, Py_TYPE(py)->tp_name);
+ return 0;
+ }
copy_value_single(py, ptr, prop, NULL, 0, &index, convert_item, rna_set_index);
}
else {
@@ -342,7 +349,7 @@ static void py_to_bool(PyObject *py, char *data)
static int py_float_check(PyObject *py)
{
/* accept both floats and integers */
- return PyFloat_Check(py) || PyLong_Check(py);
+ return PyNumber_Check(py);
}
static int py_int_check(PyObject *py)