diff options
| author | Chris Osterwood <osterwood@gmail.com> | 2020-01-20 13:11:57 -0500 |
|---|---|---|
| committer | Chris Osterwood <osterwood@gmail.com> | 2020-01-20 13:11:57 -0500 |
| commit | 97420994e85f65a4f2ddb802d532acd56c1e5879 (patch) | |
| tree | 11709251ee3b05ea46b7d262f3ba0ed28532e8cd /py/objtuple.c | |
| parent | 137a4f8a5d21f5e37277031887a3908e6c4e371e (diff) | |
| parent | 85c731734a0388c28c8e3895ec1cecd1d9491e0c (diff) | |
Merge remote-tracking branch 'origin/master' into capablerobot-usbhub
Diffstat (limited to 'py/objtuple.c')
| -rw-r--r-- | py/objtuple.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/py/objtuple.c b/py/objtuple.c index 474f81c1a..0a2ed6f4c 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -29,6 +29,7 @@ #include "py/objtuple.h" #include "py/runtime.h" +#include "py/objtype.h" #include "supervisor/shared/translate.h" @@ -181,6 +182,11 @@ mp_obj_t mp_obj_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 = MP_OBJ_TO_PTR(self_in); + // when called with a native type (eg namedtuple) using mp_obj_tuple_subscr, get the native self + if (self->base.type->subscr != &mp_obj_tuple_subscr) { + self = mp_instance_cast_to_native_base(self_in, &mp_type_tuple); + } + #if MICROPY_PY_BUILTINS_SLICE if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) { mp_bound_slice_t slice; @@ -251,7 +257,8 @@ mp_obj_t mp_obj_new_tuple(size_t n, const mp_obj_t *items) { } void mp_obj_tuple_get(mp_obj_t self_in, size_t *len, mp_obj_t **items) { - assert(MP_OBJ_IS_TYPE(self_in, &mp_type_tuple)); + // type check is done on getiter method to allow tuple, namedtuple, attrtuple + mp_check_self(mp_obj_get_type(self_in)->getiter == mp_obj_tuple_getiter); mp_obj_tuple_t *self = MP_OBJ_TO_PTR(self_in); *len = self->len; *items = &self->items[0]; |
