diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-03-08 13:19:35 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-03-08 13:19:35 +0300 |
commit | f4e1c1d135c4775501d11d03b11a456806e1bd61 (patch) | |
tree | 4f2fadc402bfa9a5246f304fdf8bbf353a528419 | |
parent | c324c4d57502e9056acaa85231ae330914972ee9 (diff) |
Correct recent RNA array slicing commit
Broke slice assignment when used on an item from a multi-dimensional array,
eg: `array[i][:] = data`
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index c7f05093878..75490a18ab0 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -2837,7 +2837,7 @@ static int prop_subscript_ass_array_slice__bool_recursive( /* could call (pyrna_py_to_prop_array_index(self, i, value) in a loop but it is slow */ static int prop_subscript_ass_array_slice( - PointerRNA *ptr, PropertyRNA *prop, + PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int start, int stop, int length, PyObject *value_orig) { const int length_flat = RNA_property_array_length(ptr, prop); @@ -2866,7 +2866,14 @@ static int prop_subscript_ass_array_slice( int dimsize[3]; int totdim = RNA_property_array_dimension(ptr, prop, dimsize); if (totdim > 1) { - BLI_assert(dimsize[0] == length); + BLI_assert(dimsize[arraydim] == length); + } + + int span = 1; + if (totdim > 1) { + for (int i = arraydim + 1; i < totdim; i++) { + span *= dimsize[i]; + } } value_items = PySequence_Fast_ITEMS(value); @@ -2884,10 +2891,10 @@ static int prop_subscript_ass_array_slice( float range[2]; RNA_property_float_range(ptr, prop, &range[0], &range[1]); - dimsize[0] = stop - start; + dimsize[arraydim] = stop - start; prop_subscript_ass_array_slice__float_recursive( - value_items, &values[start], - totdim, dimsize, + value_items, &values[arrayoffset + (start * span)], + totdim - arraydim, &dimsize[arraydim], range); if (PyErr_Occurred()) ret = -1; @@ -2907,10 +2914,10 @@ static int prop_subscript_ass_array_slice( int range[2]; RNA_property_int_range(ptr, prop, &range[0], &range[1]); - dimsize[0] = stop - start; + dimsize[arraydim] = stop - start; prop_subscript_ass_array_slice__int_recursive( - value_items, &values[start], - totdim, dimsize, + value_items, &values[arrayoffset + (start * span)], + totdim - arraydim, &dimsize[arraydim], range); if (PyErr_Occurred()) ret = -1; @@ -2928,10 +2935,10 @@ static int prop_subscript_ass_array_slice( RNA_property_boolean_get_array(ptr, prop, values); } - dimsize[0] = stop - start; + dimsize[arraydim] = stop - start; prop_subscript_ass_array_slice__bool_recursive( - value_items, &values[start], - totdim, dimsize); + value_items, &values[arrayoffset + (start * span)], + totdim - arraydim, &dimsize[arraydim]); if (PyErr_Occurred()) ret = -1; else RNA_property_boolean_set_array(ptr, prop, values); @@ -3005,7 +3012,9 @@ static int pyrna_prop_array_ass_subscript(BPy_PropertyArrayRNA *self, PyObject * ret = 0; /* do nothing */ } else if (step == 1) { - ret = prop_subscript_ass_array_slice(&self->ptr, self->prop, start, stop, len, value); + ret = prop_subscript_ass_array_slice( + &self->ptr, self->prop, self->arraydim, self->arrayoffset, + start, stop, len, value); } else { PyErr_SetString(PyExc_TypeError, "slice steps not supported with rna"); |