mirror of
https://github.com/blender/blender
synced 2026-09-29 04:37:17 +03:00
Fix #105678: Crash assigning Image.pixels to an undersized sequence
Now only dynamic function parameters that use ParameterDynAlloc support
dynamically sized parameters arrays.
Add tests for both dynamic arrays that don't support resizing
(Image.pixels) and dynamic sized arguments using
(VertexGroup.add(index=[..])).
Regression in [0] which extended support for dynamic sized function
arguments.
[0]: dfb8c5974e
This commit is contained in:
parent
1c88bf6ce1
commit
51e5417bd3
2 changed files with 105 additions and 20 deletions
|
|
@ -195,6 +195,76 @@ class TestPropArrayMultiDimensional(unittest.TestCase):
|
|||
del id_type.temp
|
||||
|
||||
|
||||
class TestPropArrayDynamicAssign(unittest.TestCase):
|
||||
"""
|
||||
Pixels are dynamic in the sense the size can change however the assignment does not define the size.
|
||||
"""
|
||||
|
||||
dims = 12
|
||||
|
||||
def setUp(self):
|
||||
self.image = bpy.data.images.new("", self.dims, self.dims)
|
||||
|
||||
def tearDown(self):
|
||||
bpy.data.images.remove(self.image)
|
||||
self.image = None
|
||||
|
||||
def test_assign_fixed_under_1px(self):
|
||||
image = self.image
|
||||
with self.assertRaises(ValueError):
|
||||
image.pixels = [1.0, 1.0, 1.0, 1.0]
|
||||
|
||||
def test_assign_fixed_under_0px(self):
|
||||
image = self.image
|
||||
with self.assertRaises(ValueError):
|
||||
image.pixels = []
|
||||
|
||||
def test_assign_fixed_over_by_1px(self):
|
||||
image = self.image
|
||||
with self.assertRaises(ValueError):
|
||||
image.pixels = ([1.0, 1.0, 1.0, 1.0] * (self.dims * self.dims)) + [1.0]
|
||||
|
||||
def test_assign_fixed(self):
|
||||
# Valid assignment, ensure it works as intended.
|
||||
image = self.image
|
||||
values = [1.0, 0.0, 1.0, 0.0] * (self.dims * self.dims)
|
||||
image.pixels = values
|
||||
self.assertEqual(tuple(values), tuple(image.pixels))
|
||||
|
||||
|
||||
class TestPropArrayDynamicArg(unittest.TestCase):
|
||||
"""
|
||||
Index array, a dynamic array argument which defines it's own length.
|
||||
"""
|
||||
|
||||
dims = 8
|
||||
|
||||
def setUp(self):
|
||||
self.me = bpy.data.meshes.new("")
|
||||
self.me.vertices.add(self.dims)
|
||||
self.ob = bpy.data.objects.new("", self.me)
|
||||
|
||||
def tearDown(self):
|
||||
bpy.data.objects.remove(self.ob)
|
||||
bpy.data.meshes.remove(self.me)
|
||||
self.me = None
|
||||
self.ob = None
|
||||
|
||||
def test_param_dynamic(self):
|
||||
ob = self.ob
|
||||
vg = ob.vertex_groups.new(name="")
|
||||
|
||||
# Add none.
|
||||
vg.add(index=(), weight=1.0, type='REPLACE')
|
||||
for i in range(self.dims):
|
||||
with self.assertRaises(RuntimeError):
|
||||
vg.weight(i)
|
||||
|
||||
# Add all.
|
||||
vg.add(index=range(self.dims), weight=1.0, type='REPLACE')
|
||||
self.assertEqual(tuple([1.0] * self.dims), tuple([vg.weight(i) for i in range(self.dims)]))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue