diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-17 22:10:53 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-17 22:10:53 +0100 |
commit | 729f7b42d65c016c9d5f27fb8a8122869f06c129 (patch) | |
tree | 8d8d8c2a89ff9011b06650c256a2d5f2458c930c /py/objtuple.c | |
parent | de7c425139c92745280b62f7ebb756def96d072a (diff) |
py: Merge BINARY_OP_SUBSCR and store_subscr (w/ delete) into subscr.
mp_obj_t->subscr now does load/store/delete.
Diffstat (limited to 'py/objtuple.c')
-rw-r--r-- | py/objtuple.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/py/objtuple.c b/py/objtuple.c index 63866e80d..57b313fd6 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -95,22 +95,6 @@ mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) { mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) { mp_obj_tuple_t *o = lhs; switch (op) { - case MP_BINARY_OP_SUBSCR: - { -#if MICROPY_ENABLE_SLICE - if (MP_OBJ_IS_TYPE(rhs, &mp_type_slice)) { - machine_uint_t start, stop; - if (!m_seq_get_fast_slice_indexes(o->len, rhs, &start, &stop)) { - assert(0); - } - mp_obj_tuple_t *res = mp_obj_new_tuple(stop - start, NULL); - m_seq_copy(res->items, o->items + start, res->len, mp_obj_t); - return res; - } -#endif - uint index = mp_get_index(o->base.type, o->len, rhs, false); - return o->items[index]; - } case MP_BINARY_OP_ADD: { if (!mp_obj_is_subclass_fast(mp_obj_get_type(rhs), (mp_obj_t)&mp_type_tuple)) { @@ -144,6 +128,28 @@ mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) { } } +mp_obj_t tuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { + if (value == MP_OBJ_SENTINEL) { + // load + mp_obj_tuple_t *self = self_in; +#if MICROPY_ENABLE_SLICE + if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) { + machine_uint_t start, stop; + if (!m_seq_get_fast_slice_indexes(self->len, index, &start, &stop)) { + assert(0); + } + mp_obj_tuple_t *res = mp_obj_new_tuple(stop - start, NULL); + m_seq_copy(res->items, self->items + start, res->len, mp_obj_t); + return res; + } +#endif + uint index_value = mp_get_index(self->base.type, self->len, index, false); + return self->items[index_value]; + } else { + return MP_OBJ_NOT_SUPPORTED; + } +} + STATIC mp_obj_t tuple_getiter(mp_obj_t o_in) { return mp_obj_new_tuple_iterator(o_in, 0); } @@ -176,6 +182,7 @@ const mp_obj_type_t mp_type_tuple = { .make_new = mp_obj_tuple_make_new, .unary_op = tuple_unary_op, .binary_op = tuple_binary_op, + .subscr = tuple_subscr, .getiter = tuple_getiter, .locals_dict = (mp_obj_t)&tuple_locals_dict, }; |