@@ -199,12 +199,21 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
199199 }
200200 int len_adj = slice -> len - (stop - start );
201201 //printf("Len adj: %d\n", len_adj);
202- assert (len_adj <= 0 );
203- mp_seq_replace_slice_no_grow (self -> items , self -> len , start , stop , slice -> items , slice -> len , mp_obj_t );
204- // Clear "freed" elements at the end of list
205- mp_seq_clear (self -> items , self -> len + len_adj , self -> len , sizeof (* self -> items ));
202+ if (len_adj > 0 ) {
203+ if (self -> len + len_adj > self -> alloc ) {
204+ // TODO: Might optimize memory copies here by checking if block can
205+ // be grown inplace or not
206+ self -> items = m_renew (mp_obj_t , self -> items , self -> alloc , self -> len + len_adj );
207+ self -> alloc = self -> len + len_adj ;
208+ }
209+ mp_seq_replace_slice_grow_inplace (self -> items , self -> len , start , stop , slice -> items , slice -> len , len_adj , mp_obj_t );
210+ } else {
211+ mp_seq_replace_slice_no_grow (self -> items , self -> len , start , stop , slice -> items , slice -> len , mp_obj_t );
212+ // Clear "freed" elements at the end of list
213+ mp_seq_clear (self -> items , self -> len + len_adj , self -> len , sizeof (* self -> items ));
214+ // TODO: apply allocation policy re: alloc_size
215+ }
206216 self -> len += len_adj ;
207- // TODO: apply allocation policy re: alloc_size
208217 return mp_const_none ;
209218 }
210219#endif
0 commit comments