summaryrefslogtreecommitdiff
path: root/py/objnamedtuple.c
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2019-12-13 16:00:04 -0800
committerScott Shawcroft <scott@tannewt.org>2019-12-13 16:00:04 -0800
commitd8e66a5f32749f29f5274432c616b2bd001dc7b3 (patch)
tree2ad6468ef5890ddcc217ee467edf46f6b311355e /py/objnamedtuple.c
parent7f7105d36d5775e6b7842a24f06604a229b2aae3 (diff)
try 2. make namedtuple types handle subclasses
Diffstat (limited to 'py/objnamedtuple.c')
-rw-r--r--py/objnamedtuple.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c
index a044fe3ff..a0a64f9b2 100644
--- a/py/objnamedtuple.c
+++ b/py/objnamedtuple.c
@@ -31,6 +31,7 @@
#include "py/runtime.h"
#include "py/objstr.h"
#include "py/objnamedtuple.h"
+#include "py/objtype.h"
#include "supervisor/shared/translate.h"
@@ -70,6 +71,15 @@ void namedtuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t ki
mp_obj_attrtuple_print_helper(print, fields, &o->tuple);
}
+mp_obj_t namedtuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+ mp_obj_type_t *type = mp_obj_get_type(self_in);
+ // Check for subclasses of namedtuple and unpack if needed.
+ if (type->parent != &mp_type_tuple) {
+ self_in = ((mp_obj_instance_t*) self_in)->subobj[0];
+ }
+ return mp_obj_tuple_subscr(self_in, index, value);
+}
+
void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (dest[0] == MP_OBJ_NULL) {
// load attribute
@@ -167,7 +177,7 @@ STATIC mp_obj_t mp_obj_new_namedtuple_type(qstr name, size_t n_fields, mp_obj_t
o->base.unary_op = mp_obj_tuple_unary_op;
o->base.binary_op = mp_obj_tuple_binary_op;
o->base.attr = namedtuple_attr;
- o->base.subscr = mp_obj_tuple_subscr;
+ o->base.subscr = namedtuple_subscr;
o->base.getiter = mp_obj_tuple_getiter;
o->base.parent = &mp_type_tuple;
return MP_OBJ_FROM_PTR(o);