@@ -458,26 +458,32 @@ STATIC mp_obj_t array_extend(mp_obj_t self_in, mp_obj_t arg_in) {
458
458
459
459
// allow to extend by anything that has the buffer protocol (extension to CPython)
460
460
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 );
462
463
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 ;
464
466
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
+ }
467
475
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 ;
473
479
} 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
+ }
475
486
}
476
-
477
- // extend
478
- mp_seq_copy ((byte * )self -> items + self -> len * sz , arg_bufinfo .buf , len * sz , byte );
479
- self -> len += len ;
480
-
481
487
return mp_const_none ;
482
488
}
483
489
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (array_extend_obj , array_extend );
0 commit comments