Fixed slice assignment of unequal length.
diff --git a/python/pb_unit_tests/reflection_test_wrapper.py b/python/pb_unit_tests/reflection_test_wrapper.py
index 7969aba..8f7d48f 100644
--- a/python/pb_unit_tests/reflection_test_wrapper.py
+++ b/python/pb_unit_tests/reflection_test_wrapper.py
@@ -35,7 +35,6 @@
reflection_test.Proto2ReflectionTest.testRepeatedCompositeReverse_Empty.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedCompositeReverse_NonEmpty.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedListExtensions.__unittest_expecting_failure__ = True
-reflection_test.Proto2ReflectionTest.testRepeatedScalars.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedScalarsReverse_Empty.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedScalarsReverse_NonEmpty.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testSingularListExtensions.__unittest_expecting_failure__ = True
diff --git a/python/repeated.c b/python/repeated.c
index 1b32fd4..b758bef 100644
--- a/python/repeated.c
+++ b/python/repeated.c
@@ -359,12 +359,21 @@
PyObject* item = NULL;
int ret = -1;
if (!seq) goto err;
- if (PySequence_Size(seq) != count) {
- PyErr_Format(PyExc_ValueError,
- "attempt to assign sequence of size %zd to extended slice "
- "of size %zd",
- PySequence_Size(seq), count);
- goto err;
+ Py_ssize_t seq_size = PySequence_Size(seq);
+ if (seq_size != count) {
+ if (step == 1) {
+ // We must shift the tail elements (either right or left).
+ size_t tail = upb_array_size(arr) - (idx + count);
+ upb_array_resize(arr, idx + seq_size + tail, arena);
+ upb_array_move(arr, idx + seq_size, idx + count, tail);
+ count = seq_size;
+ } else {
+ PyErr_Format(PyExc_ValueError,
+ "attempt to assign sequence of %zd to extended slice "
+ "of size %zd",
+ seq_size, count);
+ goto err;
+ }
}
for (Py_ssize_t i = 0; i < count; i++, idx += step) {
upb_msgval msgval;