objarray: Implement slice subscription.

pull/512/head
Paul Sokolovsky 2014-04-19 20:06:57 +03:00
rodzic 9ae0912496
commit d6e12723ed
2 zmienionych plików z 24 dodań i 7 usunięć

Wyświetl plik

@ -139,14 +139,27 @@ STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value
return MP_OBJ_NOT_SUPPORTED;
} else {
mp_obj_array_t *o = self_in;
uint index = mp_get_index(o->base.type, o->len, index_in, false);
if (value == MP_OBJ_SENTINEL) {
// load
return mp_binary_get_val_array(o->typecode, o->items, index);
if (MP_OBJ_IS_TYPE(index_in, &mp_type_slice)) {
machine_uint_t start, stop;
if (!m_seq_get_fast_slice_indexes(o->len, index_in, &start, &stop)) {
assert(0);
}
mp_obj_array_t *res = array_new(o->typecode, stop - start);
int sz = mp_binary_get_size('@', o->typecode, NULL);
assert(sz > 0);
byte *p = o->items;
memcpy(res->items, p + start * sz, (stop - start) * sz);
return res;
} else {
// store
mp_binary_set_val_array(o->typecode, o->items, index, value);
return mp_const_none;
uint index = mp_get_index(o->base.type, o->len, index_in, false);
if (value == MP_OBJ_SENTINEL) {
// load
return mp_binary_get_val_array(o->typecode, o->items, index);
} else {
// store
mp_binary_set_val_array(o->typecode, o->items, index, value);
return mp_const_none;
}
}
}
}

Wyświetl plik

@ -13,3 +13,7 @@ s = 0
for i in a:
s += i
print(s)
print(a[1:])
print(a[:-1])
print(a[2:3])