summaryrefslogtreecommitdiffstatshomepage
path: root/py/objlist.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-28 00:16:57 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-28 00:33:21 +0300
commita224067846ad92c09249abdcb77fac7420eb1a95 (patch)
tree94c41d38fc7ce9a5f2b6b51ae5ac3c76ab269cde /py/objlist.c
parent7ce6a8fe46e5424fa615f33e1952aad6173fcbe5 (diff)
downloadmicropython-a224067846ad92c09249abdcb77fac7420eb1a95.tar.gz
micropython-a224067846ad92c09249abdcb77fac7420eb1a95.zip
py: Clear allocated, but unused memory in containers.
Also, clear up freed slots in containers. As a follow up to 32bef315be8e56ad2d7f69223fe7b9606893b6ab.
Diffstat (limited to 'py/objlist.c')
-rw-r--r--py/objlist.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/py/objlist.c b/py/objlist.c
index 6de07cf578..0c55f524da 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -163,6 +163,7 @@ mp_obj_t mp_obj_list_append(mp_obj_t self_in, mp_obj_t arg) {
if (self->len >= self->alloc) {
self->items = m_renew(mp_obj_t, self->items, self->alloc, self->alloc * 2);
self->alloc *= 2;
+ mp_seq_clear(self->items, self->len + 1, self->alloc, sizeof(*self->items));
}
self->items[self->len++] = arg;
return mp_const_none; // return None, as per CPython
@@ -178,6 +179,7 @@ STATIC mp_obj_t list_extend(mp_obj_t self_in, mp_obj_t arg_in) {
// TODO: use alloc policy for "4"
self->items = m_renew(mp_obj_t, self->items, self->alloc, self->len + arg->len + 4);
self->alloc = self->len + arg->len + 4;
+ mp_seq_clear(self->items, self->len + arg->len, self->alloc, sizeof(*self->items));
}
memcpy(self->items + self->len, arg->items, sizeof(mp_obj_t) * arg->len);
@@ -199,6 +201,8 @@ STATIC mp_obj_t list_pop(uint n_args, const mp_obj_t *args) {
mp_obj_t ret = self->items[index];
self->len -= 1;
memcpy(self->items + index, self->items + index + 1, (self->len - index) * sizeof(mp_obj_t));
+ // Clear stale pointer from slot which just got freed to prevent GC issues
+ self->items[self->len] = MP_OBJ_NULL;
if (self->alloc > LIST_MIN_ALLOC && self->alloc > 2 * self->len) {
self->items = m_renew(mp_obj_t, self->items, self->alloc, self->alloc/2);
self->alloc /= 2;
@@ -253,6 +257,7 @@ STATIC mp_obj_t list_clear(mp_obj_t self_in) {
self->len = 0;
self->items = m_renew(mp_obj_t, self->items, self->alloc, LIST_MIN_ALLOC);
self->alloc = LIST_MIN_ALLOC;
+ mp_seq_clear(self->items, 0, self->alloc, sizeof(*self->items));
return mp_const_none;
}
@@ -368,6 +373,7 @@ void mp_obj_list_init(mp_obj_list_t *o, uint n) {
o->alloc = n < LIST_MIN_ALLOC ? LIST_MIN_ALLOC : n;
o->len = n;
o->items = m_new(mp_obj_t, o->alloc);
+ mp_seq_clear(o->items, n, o->alloc, sizeof(*o->items));
}
STATIC mp_obj_list_t *list_new(uint n) {