Skip to content

Commit c63711a

Browse files
authored
Merge pull request #7552 from gneverov/issue_3913
add support for array.extend(iterable) - fixes #3913
2 parents 5f43a63 + abc5eb3 commit c63711a

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

py/objarray.c

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
483489
STATIC MP_DEFINE_CONST_FUN_OBJ_2(array_extend_obj, array_extend);

0 commit comments

Comments
 (0)