@@ -458,26 +458,32 @@ STATIC mp_obj_t array_extend(mp_obj_t self_in, mp_obj_t arg_in) {
458458
459459 // allow to extend by anything that has the buffer protocol (extension to CPython)
460460 mp_buffer_info_t arg_bufinfo ;
461- mp_get_buffer_raise (arg_in , & arg_bufinfo , MP_BUFFER_READ );
461+ if (mp_get_buffer (arg_in , & arg_bufinfo , MP_BUFFER_READ )) {
462+ size_t sz = mp_binary_get_size ('@' , self -> typecode , NULL );
462463
463- size_t sz = mp_binary_get_size ('@' , self -> typecode , NULL );
464+ // convert byte count to element count
465+ size_t len = arg_bufinfo .len / sz ;
464466
465- // convert byte count to element count
466- size_t len = arg_bufinfo .len / sz ;
467+ // make sure we have enough room to extend
468+ // TODO: alloc policy; at the moment we go conservative
469+ if (self -> free < len ) {
470+ self -> items = m_renew (byte , self -> items , (self -> len + self -> free ) * sz , (self -> len + len ) * sz );
471+ self -> free = 0 ;
472+ } else {
473+ self -> free -= len ;
474+ }
467475
468- // make sure we have enough room to extend
469- // TODO: alloc policy; at the moment we go conservative
470- if (self -> free < len ) {
471- self -> items = m_renew (byte , self -> items , (self -> len + self -> free ) * sz , (self -> len + len ) * sz );
472- self -> free = 0 ;
476+ // extend
477+ mp_seq_copy ((byte * )self -> items + self -> len * sz , arg_bufinfo .buf , len * sz , byte );
478+ self -> len += len ;
473479 } else {
474- self -> free -= len ;
480+ // Otherwise argument must be an iterable of items to append
481+ mp_obj_t iterable = mp_getiter (arg_in , NULL );
482+ mp_obj_t item ;
483+ while ((item = mp_iternext (iterable )) != MP_OBJ_STOP_ITERATION ) {
484+ array_append (self_in , item );
485+ }
475486 }
476-
477- // extend
478- mp_seq_copy ((byte * )self -> items + self -> len * sz , arg_bufinfo .buf , len * sz , byte );
479- self -> len += len ;
480-
481487 return mp_const_none ;
482488}
483489STATIC MP_DEFINE_CONST_FUN_OBJ_2 (array_extend_obj , array_extend );
0 commit comments