8000 py: Refactor slice helpers, preparing to support arbitrary slicing. · errordeveloper/micropython@de4b932 · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Mar 4, 2020. It is now read-only.

Commit de4b932

Browse files
committed
py: Refactor slice helpers, preparing to support arbitrary slicing.
1 parent ff4b6da commit de4b932

File tree

6 files changed

+46
-33
lines changed

6 files changed

+46
-33
lines changed

py/obj.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,16 @@ typedef struct _mp_obj_static_class_method_t {
563563
const mp_obj_t *mp_obj_property_get(mp_obj_t self_in);
564564

565565
// sequence helpers
566+
567+
// slice indexes resolved to particular sequence
568+
typedef struct {
569+
machine_uint_t start;
570+
machine_uint_t stop;
571+
machine_int_t step;
572+
} mp_bound_slice_t;
573+
566574
void mp_seq_multiply(const void *items, uint item_sz, uint len, uint times, void *dest);
567-
bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, machine_uint_t *begin, machine_uint_t *end);
575+
bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, mp_bound_slice_t *indexes);
568576
#define mp_seq_copy(dest, src, len, item_t) memcpy(dest, src, len * sizeof(item_t))
569577
#define mp_seq_cat(dest, src1, len1, src2, len2, item_t) { memcpy(dest, src1, (len1) * sizeof(item_t)); memcpy(dest + (len1), src2, (len2) * sizeof(item_t)); }
570578
bool mp_seq_cmp_bytes(int op, const byte *data1, uint len1, const byte *data2, uint len2);

py/objarray.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,15 +176,15 @@ STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value
176176
// slice assignment (incl. of different size)
177177
return MP_OBJ_NULL; // op not supported
178178
}
179-
machine_uint_t start, stop;
180-
if (!mp_seq_get_fast_slice_indexes(o->len, index_in, &start, &stop)) {
179+
mp_bound_slice_t slice;
180+
if (!mp_seq_get_fast_slice_indexes(o->len, index_in, &slice)) {
181181
assert(0);
182182
}
183-
mp_obj_array_t *res = array_new(o->typecode, stop - start);
183+
mp_obj_array_t *res = array_new(o->typecode, slice.stop - slice.start);
184184
int sz = mp_binary_get_size('@', o->typecode, NULL);
185185
assert(sz > 0);
186186
byte *p = o->items;
187-
memcpy(res->items, p + start * sz, (stop - start) * sz);
187+
memcpy(res->items, p + slice.start * sz, (slice.stop - slice.start) * sz);
188188
return res;
189189
} else {
190190
uint index = mp_get_index(o->base.type, o->len, index_in, false);

py/objlist.c

Lines changed: 15 additions & 13 deletions
10000
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,15 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
153153
#if MICROPY_PY_SLICE
154154
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
155155
mp_obj_list_t *self = self_in;
156-
machine_uint_t start, stop;
157-
if (!mp_seq_get_fast_slice_indexes(self->len, index, &start, &stop)) {
156+
mp_bound_slice_t slice;
157+
if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice)) {
158158
assert(0);
159159
}
160160

161-
int len_adj = start - stop;
161+
int len_adj = slice.start - slice.stop;
162162
//printf("Len adj: %d\n", len_adj);
163163
assert(len_adj <= 0);
164-
mp_seq_replace_slice_no_grow(self->items, self->len, start, stop, self->items/*NULL*/, 0, mp_obj_t);
164+
mp_seq_replace_slice_no_grow(self->items, self->len, slice.start, slice.stop, self->items/*NULL*/, 0, mp_obj_t);
165165
// Clear "freed" elements at the end of list
166166
mp_seq_clear(self->items, self->len + len_adj, self->len, sizeof(*self->items));
167167
self->len += len_adj;
@@ -176,12 +176,12 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
176176
mp_obj_list_t *self = self_in;
177177
#if MICROPY_PY_SLICE
178178
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
179-
machine_uint_t start, stop;
180-
if (!mp_seq_get_fast_slice_indexes(self->len, index, &start, &stop)) {
179+
mp_bound_slice_t slice;
180+
if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice)) {
181181
assert(0);
182182
}
183-
mp_obj_list_t *res = list_new(stop - start);
184-
mp_seq_copy(res->items, self->items + start, res->len, mp_obj_t);
183+
mp_obj_list_t *res = list_new(slice.stop - slice.start);
184+
mp_seq_copy(res->items, self->items + slice.start, res->len, mp_obj_t);
185185
return res;
186186
}
187187
#endif
@@ -193,11 +193,11 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
193193
mp_obj_list_t *self = self_in;
194194
assert(MP_OBJ_IS_TYPE(value, &mp_type_list));
195195
mp_obj_list_t *slice = value;
196-
machine_uint_t start, stop;
197-
if (!mp_seq_get_fast_slice_indexes(self->len, index, &start, &stop)) {
196+
mp_bound_slice_t slice_out;
197+
if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice_out)) {
198198
assert(0);
199199
}
200-
int len_adj = slice->len - (stop - start);
200+
int len_adj = slice->len - (slice_out.stop - slice_out.start);
201201
//printf("Len adj: %d\n", len_adj);
202202
if (len_adj > 0) {
203203
if (self->len + len_adj > self->alloc) {
@@ -206,9 +206,11 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
206206
self->items = m_renew(mp_obj_t, self->items, self->alloc, self->len + len_adj);
207207
self->alloc = self->len + len_adj;
208208
}
209-
mp_seq_replace_slice_grow_inplace(self->items, self->len, start, stop, slice->items, slice->len, len_adj, mp_obj_t);
209+
mp_seq_replace_slice_grow_inplace(self->items, self->len,
210+
slice_out.start, slice_out.stop, slice->items, slice->len, len_adj, mp_obj_t);
210211
} else {
211-
mp_seq_replace_slice_no_grow(self->items, self->len, start, stop, slice->items, slice->len, mp_obj_t);
212+
mp_seq_replace_slice_no_grow(self->items, self->len,
213+
slice_out.start, slice_out.stop, slice->items, slice->len, mp_obj_t);
212214
// Clear "freed" elements at the end of list
213215
mp_seq_clear(self->items, self->len + len_adj, self->len, sizeof(*self->items));
214216
// TODO: apply allocation policy re: alloc_size

py/objstr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,11 @@ STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
351351
// load
352352
#if MICROPY_PY_SLICE
353353
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
354-
machine_uint_t start, stop;
355-
if (!mp_seq_get_fast_slice_indexes(self_len, index, &start, &stop)) {
354+
mp_bound_slice_t slice;
355+
if (!mp_seq_get_fast_slice_indexes(self_len, index, &slice)) {
356356
assert(0);
357357
}
358-
return str_new(type, self_data + start, stop - start);
358+
return str_new(type, self_data + slice.start, slice.stop - slice.start);
359359
}
360360
#endif
361361
uint index_val = mp_get_index(type, self_len, index, false);

py/objtuple.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,12 @@ mp_obj_t mp_obj_tuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
163163
mp_obj_tuple_t *self = self_in;
164164
#if MICROPY_PY_SLICE
165165
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
166-
machine_uint_t start, stop;
167-
if (!mp_seq_get_fast_slice_indexes(self->len, index, &start, &stop)) {
166+
mp_bound_slice_t slice;
167+
if (!mp_seq_get_fast_slice_indexes(self->len, index, &slice)) {
168168
assert(0);
169169
}
170-
mp_obj_tuple_t *res = mp_obj_new_tuple(stop - start, NULL);
171-
mp_seq_copy(res->items, self->items + start, res->len, mp_obj_t);
170+
mp_obj_tuple_t *res = mp_obj_new_tuple(slice.stop - slice.start, NULL);
171+
mp_seq_copy(res->items, self->items + slice.start, res->len, mp_obj_t);
172172
return res;
173173
}
174174
#endif

py/sequence.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,10 @@ void mp_seq_multiply(const void *items, uint item_sz, uint len, uint times, void
5151
}
5252
}
5353

54-
bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, machine_uint_t *begin, machine_uint_t *end) {
54+
bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, mp_bound_slice_t *indexes) {
5555
mp_obj_t ostart, ostop, ostep;
5656
machine_int_t start, stop;
5757
mp_obj_slice_get(slice, &ostart, &ostop, &ostep);
58-
if (ostep != mp_const_none && ostep != MP_OBJ_NEW_SMALL_INT(1)) {
59-
nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
60-
"Only slices with step=1 (aka None) are supported"));
61-
return false;
62-
}
6358

6459
if (ostart == mp_const_none) {
6560
start = 0;
@@ -96,8 +91,16 @@ bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, machine_u
9691
stop = start;
9792
}
9893

99-
*begin = start;
100-
*end = stop;
94+
indexes->start = start;
95+
indexes->stop = stop;
96+
97+
if (ostep != mp_const_none && ostep != MP_OBJ_NEW_SMALL_INT(1)) {
98+
nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
99+
"Only slices with step=1 (aka None) are supported"));
100+
indexes->step = MP_OBJ_SMALL_INT_VALUE(ostep);
101+
return false;
102+
}
103+
indexes->step = 1;
101104
return true;
102105
}
103106

0 commit comments

Comments
 (0)
0