summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-04-02 17:28:24 +1000
committerDamien George <damien.p.george@gmail.com>2017-04-02 17:28:24 +1000
commita5500a8aad263054e9530a03da18c0c0961424b2 (patch)
treedd9734cb5f8b081a307c120156b2510609f97089 /py
parent3df65e9bae3e3c5298a2691e177335bb5efeb5ed (diff)
downloadmicropython-a5500a8aad263054e9530a03da18c0c0961424b2.tar.gz
micropython-a5500a8aad263054e9530a03da18c0c0961424b2.zip
py/obj.h: Make sequence grow more efficient and support overlapping.
The first memmove now copies less bytes in some cases (because len_adj <= slice_len), and the memcpy is replaced with memmove to support the possibility that dest and slice regions are overlapping.
Diffstat (limited to 'py')
-rw-r--r--py/obj.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/py/obj.h b/py/obj.h
index 580b814a8d..b19aca29a7 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -842,9 +842,10 @@ mp_obj_t mp_seq_extract_slice(size_t len, const mp_obj_t *seq, mp_bound_slice_t
/*printf("memmove(%p, %p, %d)\n", dest + (beg + slice_len), dest + end, (dest_len - end) * (item_sz));*/ \
memmove(((char*)dest) + (beg + slice_len) * (item_sz), ((char*)dest) + (end) * (item_sz), (dest_len - end) * (item_sz));
+// Note: dest and slice regions may overlap
#define mp_seq_replace_slice_grow_inplace(dest, dest_len, beg, end, slice, slice_len, len_adj, item_sz) \
/*printf("memmove(%p, %p, %d)\n", dest + beg + len_adj, dest + beg, (dest_len - beg) * (item_sz));*/ \
- memmove(((char*)dest) + (beg + len_adj) * (item_sz), ((char*)dest) + (beg) * (item_sz), (dest_len - beg) * (item_sz)); \
- memcpy(((char*)dest) + (beg) * (item_sz), slice, slice_len * (item_sz));
+ memmove(((char*)dest) + (beg + slice_len) * (item_sz), ((char*)dest) + (end) * (item_sz), ((dest_len) + (len_adj) - ((beg) + (slice_len))) * (item_sz)); \
+ memmove(((char*)dest) + (beg) * (item_sz), slice, slice_len * (item_sz));
#endif // __MICROPY_INCLUDED_PY_OBJ_H__