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/objtype.c | |
| parent | 137a4f8a5d21f5e37277031887a3908e6c4e371e (diff) | |
| parent | 85c731734a0388c28c8e3895ec1cecd1d9491e0c (diff) | |
Merge remote-tracking branch 'origin/master' into capablerobot-usbhub
Diffstat (limited to 'py/objtype.c')
| -rw-r--r-- | py/objtype.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/py/objtype.c b/py/objtype.c index 5133d849f..a5e733208 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -34,6 +34,7 @@ #include "py/objtype.h" #include "py/runtime.h" +#include "supervisor/shared/stack.h" #include "supervisor/shared/translate.h" #if MICROPY_DEBUG_VERBOSE // print debugging info @@ -336,8 +337,10 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, cons mp_obj_t *args2 = m_new(mp_obj_t, 1 + n_args + 2 * n_kw); args2[0] = MP_OBJ_FROM_PTR(self); memcpy(args2 + 1, args, n_args * sizeof(mp_obj_t)); - // copy in kwargs - memcpy(args2 + 1 + n_args, kw_args->table, 2 * n_kw * sizeof(mp_obj_t)); + if (kw_args) { + // copy in kwargs + memcpy(args2 + 1 + n_args, kw_args->table, 2 * n_kw * sizeof(mp_obj_t)); + } new_ret = mp_call_function_n_kw(init_fn[0], n_args + 1, n_kw, args2); m_del(mp_obj_t, args2, 1 + n_args + 2 * n_kw); } @@ -849,8 +852,13 @@ STATIC mp_obj_t instance_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value mp_obj_class_lookup(&lookup, self->base.type); meth_args = 3; } - if (member[0] == MP_OBJ_SENTINEL) { - return mp_obj_subscr(self->subobj[0], index, value); + if (member[0] == MP_OBJ_SENTINEL) { // native base subscr exists + mp_obj_type_t *subobj_type = mp_obj_get_type(self->subobj[0]); + // return mp_obj_subscr(self->subobj[0], index, value, instance); + mp_obj_t ret = subobj_type->subscr(self_in, index, value); + // May have called port specific C code. Make sure it didn't mess up the heap. + assert_heap_ok(); + return ret; } else if (member[0] != MP_OBJ_NULL) { mp_obj_t args[3] = {self_in, index, value}; // TODO probably need to call mp_convert_member_lookup, and use mp_call_method_n_kw |
