[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25717] trunk/blender/source/blender/ python/intern/bpy_rna.c: pyrna array slice assignment
Campbell Barton
ideasman42 at gmail.com
Mon Jan 4 21:53:52 CET 2010
Revision: 25717
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25717
Author: campbellbarton
Date: 2010-01-04 21:53:52 +0100 (Mon, 04 Jan 2010)
Log Message:
-----------
pyrna array slice assignment
- accept any sequence
- disallow deleting & resizing via slices
Modified Paths:
--------------
trunk/blender/source/blender/python/intern/bpy_rna.c
Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c 2010-01-04 20:49:42 UTC (rev 25716)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c 2010-01-04 20:53:52 UTC (rev 25717)
@@ -1181,18 +1181,28 @@
}
/* could call (pyrna_py_to_prop_index(self, i, value) in a loop but it is slow */
-static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length, PyObject *value)
+static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length, PyObject *value_orig)
{
+ PyObject *value;
int count;
void *values_alloc= NULL;
int ret= 0;
-
- /* TODO - fast list ? */
- if(!PyList_Check(value)) {
- PyErr_Format(PyExc_TypeError, "invalid slice assignment, exitected a list instead of %.200s instance.", Py_TYPE(value)->tp_name);
+
+ if(value_orig == NULL) {
+ PyErr_SetString(PyExc_TypeError, "invalid slice assignment, deleting with list types is not supported by StructRNA.");
return -1;
}
+ if(!(value=PySequence_Fast(value_orig, "invalid slice assignment, type is not a sequence"))) {
+ return -1;
+ }
+
+ if(PySequence_Fast_GET_SIZE(value) != stop-start) {
+ Py_DECREF(value);
+ PyErr_SetString(PyExc_TypeError, "invalid slice assignment, resizing StructRNA arrays isn't supported.");
+ return -1;
+ }
+
switch (RNA_property_type(prop)) {
case PROP_FLOAT:
{
@@ -1204,7 +1214,7 @@
RNA_property_float_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- values[count] = PyFloat_AsDouble(PyList_GET_ITEM(value, count-start));
+ values[count] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
if(PyErr_Occurred()) ret= -1;
else RNA_property_float_set_array(ptr, prop, values);
@@ -1221,7 +1231,7 @@
RNA_property_boolean_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- values[count] = PyLong_AsSsize_t(PyList_GET_ITEM(value, count-start));
+ values[count] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
if(PyErr_Occurred()) ret= -1;
else RNA_property_boolean_set_array(ptr, prop, values);
@@ -1238,7 +1248,7 @@
RNA_property_int_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- values[count] = PyLong_AsSsize_t(PyList_GET_ITEM(value, count-start));
+ values[count] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
if(PyErr_Occurred()) ret= -1;
else RNA_property_int_set_array(ptr, prop, values);
@@ -1248,6 +1258,8 @@
PyErr_SetString(PyExc_TypeError, "not an array type");
ret= -1;
}
+
+ Py_DECREF(value);
if(values_alloc) {
PyMem_FREE(values_alloc);
More information about the Bf-blender-cvs
mailing list