@@ -163,6 +163,7 @@ mp_obj_t mp_obj_list_append(mp_obj_t self_in, mp_obj_t arg) {
163163 if (self -> len >= self -> alloc ) {
164164 self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> alloc * 2 );
165165 self -> alloc *= 2 ;
166+ mp_seq_clear (self -> items , self -> len + 1 , self -> alloc , sizeof (* self -> items ));
166167 }
167168 self -> items [self -> len ++ ] = arg ;
168169 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) {
178179 // TODO: use alloc policy for "4"
179180 self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> len + arg -> len + 4 );
180181 self -> alloc = self -> len + arg -> len + 4 ;
182+ mp_seq_clear (self -> items , self -> len + arg -> len , self -> alloc , sizeof (* self -> items ));
181183 }
182184
183185 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) {
199201 mp_obj_t ret = self -> items [index ];
200202 self -> len -= 1 ;
201203 memcpy (self -> items + index , self -> items + index + 1 , (self -> len - index ) * sizeof (mp_obj_t ));
204+ // Clear stale pointer from slot which just got freed to prevent GC issues
205+ self -> items [self -> len ] = MP_OBJ_NULL ;
202206 if (self -> alloc > LIST_MIN_ALLOC && self -> alloc > 2 * self -> len ) {
203207 self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> alloc /2 );
204208 self -> alloc /= 2 ;
@@ -253,6 +257,7 @@ STATIC mp_obj_t list_clear(mp_obj_t self_in) {
253257 self -> len = 0 ;
254258 self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , LIST_MIN_ALLOC );
255259 self -> alloc = LIST_MIN_ALLOC ;
260+ mp_seq_clear (self -> items , 0 , self -> alloc , sizeof (* self -> items ));
256261 return mp_const_none ;
257262}
258263
@@ -368,6 +373,7 @@ void mp_obj_list_init(mp_obj_list_t *o, uint n) {
368373 o -> alloc = n < LIST_MIN_ALLOC ? LIST_MIN_ALLOC : n ;
369374 o -> len = n ;
370375 o -> items = m_new (mp_obj_t , o -> alloc );
376+ mp_seq_clear (o -> items , n , o -> alloc , sizeof (* o -> items ));
371377}
372378
373379STATIC mp_obj_list_t * list_new (uint n ) {
0 commit comments