@@ -163,6 +163,7 @@ mp_obj_t mp_obj_list_append(mp_obj_t self_in, mp_obj_t arg) {
163
163
if (self -> len >= self -> alloc ) {
164
164
self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> alloc * 2 );
165
165
self -> alloc *= 2 ;
166
+ mp_seq_clear (self -> items , self -> len + 1 , self -> alloc , sizeof (* self -> items ));
166
167
}
167
168
self -> items [self -> len ++ ] = arg ;
168
169
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) {
178
179
// TODO: use alloc policy for "4"
179
180
self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> len + arg -> len + 4 );
180
181
self -> alloc = self -> len + arg -> len + 4 ;
182
+ mp_seq_clear (self -> items , self -> len + arg -> len , self -> alloc , sizeof (* self -> items ));
181
183
}
182
184
183
185
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) {
199
201
mp_obj_t ret = self -> items [index ];
200
202
self -> len -= 1 ;
201
203
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 ;
202
206
if (self -> alloc > LIST_MIN_ALLOC && self -> alloc > 2 * self -> len ) {
203
207
self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> alloc /2 );
204
208
self -> alloc /= 2 ;
@@ -253,6 +257,7 @@ STATIC mp_obj_t list_clear(mp_obj_t self_in) {
253
257
self -> len = 0 ;
254
258
self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , LIST_MIN_ALLOC );
255
259
self -> alloc = LIST_MIN_ALLOC ;
260
+ mp_seq_clear (self -> items , 0 , self -> alloc , sizeof (* self -> items ));
256
261
return mp_const_none ;
257
262
}
258
263
@@ -368,6 +373,7 @@ void mp_obj_list_init(mp_obj_list_t *o, uint n) {
368
373
o -> alloc = n < LIST_MIN_ALLOC ? LIST_MIN_ALLOC : n ;
369
374
o -> len = n ;
370
375
o -> items = m_new (mp_obj_t , o -> alloc );
376
+ mp_seq_clear (o -> items , n , o -> alloc , sizeof (* o -> items ));
371
377
}
372
378
373
379
STATIC mp_obj_list_t * list_new (uint n ) {
0 commit comments