Skip to content

Commit 1b7709f

Browse files
committed
use the stack
1 parent ef1782f commit 1b7709f

File tree

3 files changed

+21
-12
lines changed

3 files changed

+21
-12
lines changed

shared-bindings/_pixelbuf/PixelBuf.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,16 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
309309

310310
size_t length = common_hal__pixelbuf_pixelbuf_get_len(self_in);
311311
mp_seq_get_fast_slice_indexes(length, index_in, &slice);
312+
static mp_obj_tuple_t flat_item_tuple = {
313+
.base = {&mp_type_tuple},
314+
.len = 0,
315+
.items = {
316+
mp_const_none,
317+
mp_const_none,
318+
mp_const_none,
319+
mp_const_none,
320+
}
321+
};
312322

313323
size_t slice_len;
314324
if (slice.step > 0) {
@@ -335,8 +345,8 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
335345
if (num_items != slice_len && num_items != (slice_len * common_hal__pixelbuf_pixelbuf_get_bpp(self_in))) {
336346
mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."), slice_len, num_items);
337347
}
338-
339-
common_hal__pixelbuf_pixelbuf_set_pixels(self_in, slice.start, slice.step, slice_len, value, num_items != slice_len);
348+
common_hal__pixelbuf_pixelbuf_set_pixels(self_in, slice.start, slice.step, slice_len, value,
349+
num_items != slice_len ? &flat_item_tuple : mp_const_none);
340350
return mp_const_none;
341351
#else
342352
return MP_OBJ_NULL; // op not supported

shared-bindings/_pixelbuf/PixelBuf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,6 @@ void common_hal__pixelbuf_pixelbuf_fill(mp_obj_t self, mp_obj_t item);
4747
void common_hal__pixelbuf_pixelbuf_show(mp_obj_t self);
4848
mp_obj_t common_hal__pixelbuf_pixelbuf_get_pixel(mp_obj_t self, size_t index);
4949
void common_hal__pixelbuf_pixelbuf_set_pixel(mp_obj_t self, size_t index, mp_obj_t item);
50-
void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t* values, bool flattened);
50+
void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t* values, mp_obj_tuple_t *flatten_to);
5151

5252
#endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H

shared-module/_pixelbuf/PixelBuf.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -230,22 +230,21 @@ void _pixelbuf_set_pixel(pixelbuf_pixelbuf_obj_t* self, size_t index, mp_obj_t v
230230
_pixelbuf_set_pixel_color(self, index, r, g, b, w);
231231
}
232232

233-
void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t* values, bool flattened) {
233+
void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t* values,
234+
mp_obj_tuple_t *flatten_to)
235+
{
234236
pixelbuf_pixelbuf_obj_t* self = native_pixelbuf(self_in);
235237
mp_obj_iter_buf_t iter_buf;
236238
mp_obj_t iterable = mp_getiter(values, &iter_buf);
237239
mp_obj_t item;
238240
size_t i = 0;
239-
mp_obj_tuple_t *tuple;
240-
uint bpp = self->bytes_per_pixel;
241-
if (flattened) {
242-
tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(bpp, NULL));
243-
}
241+
bool flattened = flatten_to != mp_const_none;
242+
if (flattened) flatten_to->len = self->bytes_per_pixel;
244243
while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
245244
if (flattened) {
246-
tuple->items[i % bpp] = item;
247-
if (++i % bpp == 0) {
248-
_pixelbuf_set_pixel(self, start, tuple);
245+
flatten_to->items[i % self->bytes_per_pixel] = item;
246+
if (++i % self->bytes_per_pixel == 0) {
247+
_pixelbuf_set_pixel(self, start, flatten_to);
249248
start+=step;
250249
}
251250
} else {

0 commit comments

Comments
 (0)