Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
94d82462
Commit
94d82462
authored
May 10, 2014
by
Paul Sokolovsky
Browse files
objlist: Implement non-growing slice assignment.
Slice value to assign can be only a list so far too.
parent
d915a52e
Changes
3
Hide whitespace changes
Inline
Side-by-side
py/obj.h
View file @
94d82462
...
...
@@ -573,3 +573,8 @@ mp_obj_t mp_seq_index_obj(const mp_obj_t *items, uint len, uint n_args, const mp
mp_obj_t
mp_seq_count_obj
(
const
mp_obj_t
*
items
,
uint
len
,
mp_obj_t
value
);
// Helper to clear stale pointers from allocated, but unused memory, to preclude GC problems
#define mp_seq_clear(start, len, alloc_len, item_sz) memset((byte*)(start) + (len) * (item_sz), 0, ((alloc_len) - (len)) * (item_sz))
#define mp_seq_replace_slice_no_grow(dest, dest_len, beg, end, slice, slice_len, item_t) \
/*printf("memcpy(%p, %p, %d)\n", dest + beg, slice, slice_len * sizeof(item_t));*/
\
memcpy(dest + beg, slice, slice_len * sizeof(item_t)); \
/*printf("memcpy(%p, %p, %d)\n", dest + (beg + slice_len), dest + end, (dest_len - end) * sizeof(item_t));*/
\
memcpy(dest + (beg + slice_len), dest + end, (dest_len - end) * sizeof(item_t));
py/objlist.c
View file @
94d82462
...
...
@@ -173,6 +173,26 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
uint
index_val
=
mp_get_index
(
self
->
base
.
type
,
self
->
len
,
index
,
false
);
return
self
->
items
[
index_val
];
}
else
{
#if MICROPY_ENABLE_SLICE
if
(
MP_OBJ_IS_TYPE
(
index
,
&
mp_type_slice
))
{
mp_obj_list_t
*
self
=
self_in
;
assert
(
MP_OBJ_IS_TYPE
(
value
,
&
mp_type_list
));
mp_obj_list_t
*
slice
=
value
;
machine_uint_t
start
,
stop
;
if
(
!
mp_seq_get_fast_slice_indexes
(
self
->
len
,
index
,
&
start
,
&
stop
))
{
assert
(
0
);
}
int
len_adj
=
slice
->
len
-
(
stop
-
start
);
//printf("Len adj: %d\n", len_adj);
assert
(
len_adj
<=
0
);
mp_seq_replace_slice_no_grow
(
self
->
items
,
self
->
len
,
start
,
stop
,
slice
->
items
,
slice
->
len
,
mp_obj_t
);
// Clear "freed" elements at the end of list
mp_seq_clear
(
self
->
items
,
self
->
len
+
len_adj
,
self
->
len
,
sizeof
(
*
self
->
items
));
self
->
len
+=
len_adj
;
// TODO: apply allocation policy re: alloc_size
return
mp_const_none
;
}
#endif
mp_obj_list_store
(
self_in
,
index
,
value
);
return
mp_const_none
;
}
...
...
tests/basics/list_slice_assign.py
0 → 100644
View file @
94d82462
# test slices; only 2 argument version supported by Micro Python at the moment
x
=
list
(
range
(
10
))
# Assignment
l
=
list
(
x
)
l
[
1
:
3
]
=
[
10
,
20
]
print
(
l
)
l
=
list
(
x
)
l
[
1
:
3
]
=
[
10
]
print
(
l
)
l
=
list
(
x
)
l
[
1
:
3
]
=
[]
print
(
l
)
l
=
list
(
x
)
l
[:
3
]
=
[
10
,
20
]
print
(
l
)
l
=
list
(
x
)
l
[:
3
]
=
[]
print
(
l
)
l
=
list
(
x
)
l
[:
-
3
]
=
[
10
,
20
]
print
(
l
)
l
=
list
(
x
)
l
[:
-
3
]
=
[]
print
(
l
)
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment