Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3f8d34c

Browse files
committed
objlist: Support list slice deletion.
1 parent 94d8246 commit 3f8d34c

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

py/objlist.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,24 @@ STATIC mp_obj_t list_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
153153
STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
154154
if (value == MP_OBJ_NULL) {
155155
// delete
156+
#if MICROPY_ENABLE_SLICE
157+
if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
158+
mp_obj_list_t *self = self_in;
159+
machine_uint_t start, stop;
160+
if (!mp_seq_get_fast_slice_indexes(self->len, index, &start, &stop)) {
161+
assert(0);
162+
}
163+
164+
int len_adj = start - stop;
165+
//printf("Len adj: %d\n", len_adj);
166+
assert(len_adj <= 0);
167+
mp_seq_replace_slice_no_grow(self->items, self->len, start, stop, self->items/*NULL*/, 0, mp_obj_t);
168+
// Clear "freed" elements at the end of list
169+
mp_seq_clear(self->items, self->len + len_adj, self->len, sizeof(*self->items));
170+
self->len += len_adj;
171+
return mp_const_none;
172+
}
173+
#endif
156174
mp_obj_t args[2] = {self_in, index};
157175
list_pop(2, args);
158176
return mp_const_none;

tests/basics/list_slice_assign.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,26 @@
1111
l = list(x)
1212
l[1:3] = []
1313
print(l)
14+
l = list(x)
15+
del l[1:3]
16+
print(l)
1417

1518
l = list(x)
1619
l[:3] = [10, 20]
1720
print(l)
1821
l = list(x)
1922
l[:3] = []
2023
print(l)
24+
l = list(x)
25+
del l[:3]
26+
print(l)
2127

2228
l = list(x)
2329
l[:-3] = [10, 20]
2430
print(l)
2531
l = list(x)
2632
l[:-3] = []
2733
print(l)
34+
l = list(x)
35+
del l[:-3]
36+
print(l)

0 commit comments

Comments
 (0)