diff options
author | Damien George <damien.p.george@gmail.com> | 2014-01-03 16:22:19 -0800 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-01-03 16:22:19 -0800 |
commit | 98adccf7acb52a0cf9169a78e3af1a8958f7ab36 (patch) | |
tree | 1636edcddd671552a7740605ac3f7c52aa5520a0 /py | |
parent | 892af61d4d61cf6e49ba3fa6ac398c8965ae12d3 (diff) | |
parent | 64427d6ee62c02d5ac2d9c8aa555c1fa4310fc40 (diff) | |
download | micropython-98adccf7acb52a0cf9169a78e3af1a8958f7ab36.tar.gz micropython-98adccf7acb52a0cf9169a78e3af1a8958f7ab36.zip |
Merge pull request #52 from chipaca/master
Tweaks to list.pop.
Diffstat (limited to 'py')
-rw-r--r-- | py/objlist.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/py/objlist.c b/py/objlist.c index 5d4e8c03ab..47bd6d985a 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -76,13 +76,21 @@ mp_obj_t mp_obj_list_append(mp_obj_t self_in, mp_obj_t arg) { return mp_const_none; // return None, as per CPython } -static mp_obj_t list_pop(mp_obj_t self_in, mp_obj_t arg) { - assert(MP_OBJ_IS_TYPE(self_in, &list_type)); - mp_obj_list_t *self = self_in; - uint index = mp_get_index(self->base.type, self->len, arg); +static mp_obj_t list_pop(int n_args, const mp_obj_t *args) { + assert(1 <= n_args && n_args <= 2); + assert(MP_OBJ_IS_TYPE(args[0], &list_type)); + mp_obj_list_t *self = args[0]; + if (self->len == 0) { + nlr_jump(mp_obj_new_exception_msg(rt_q_IndexError, "pop from empty list")); + } + uint index = mp_get_index(self->base.type, self->len, n_args == 1 ? mp_obj_new_int(-1) : args[1]); mp_obj_t ret = self->items[index]; self->len -= 1; memcpy(self->items + index, self->items + index + 1, (self->len - index) * sizeof(mp_obj_t)); + if (self->alloc > 2 * self->len) { + self->items = m_renew(mp_obj_t, self->items, self->alloc, self->alloc/2); + self->alloc /= 2; + } return ret; } @@ -118,7 +126,7 @@ static mp_obj_t list_sort(mp_obj_t self_in, mp_obj_t key_fn) { } static MP_DEFINE_CONST_FUN_OBJ_2(list_append_obj, mp_obj_list_append); -static MP_DEFINE_CONST_FUN_OBJ_2(list_pop_obj, list_pop); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(list_pop_obj, 1, 2, list_pop); static MP_DEFINE_CONST_FUN_OBJ_2(list_sort_obj, list_sort); const mp_obj_type_t list_type = { |