From e74f52b76c2be9aefca689e34cd05f8f64be02f8 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Thu, 27 Feb 2014 22:49:47 +0200
Subject: [PATCH] namedtuple: Inherit unary/binary ops from tuple base class.

---
 py/objnamedtuple.c          | 4 ++--
 py/objtuple.c               | 6 +++---
 py/objtuple.h               | 2 ++
 tests/basics/namedtuple1.py | 6 ++++++
 4 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c
index 41502fcc4..348530111 100644
--- a/py/objnamedtuple.c
+++ b/py/objnamedtuple.c
@@ -127,8 +127,8 @@ mp_obj_t mp_obj_new_namedtuple_type(qstr name, const char *fields) {
     o->base.name = name;
     o->base.print = namedtuple_print;
     o->base.make_new = namedtuple_make_new;
-//    o->base.unary_op = ;
-//    o->base.binary_op = ;
+    o->base.unary_op = tuple_unary_op;
+    o->base.binary_op = tuple_binary_op;
     o->base.load_attr = namedtuple_load_attr;
     o->base.store_attr = namedtuple_store_attr;
     o->base.bases_tuple = (mp_obj_t)&namedtuple_base_tuple;
diff --git a/py/objtuple.c b/py/objtuple.c
index 41ad8a5d5..d39b36d9f 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -86,7 +86,7 @@ STATIC bool tuple_cmp_helper(int op, mp_obj_t self_in, mp_obj_t another_in) {
     return mp_seq_cmp_objs(op, self->items, self->len, another->items, another->len);
 }
 
-STATIC mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) {
+mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) {
     mp_obj_tuple_t *self = self_in;
     switch (op) {
         case RT_UNARY_OP_BOOL: return MP_BOOL(self->len != 0);
@@ -95,7 +95,7 @@ STATIC mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) {
     }
 }
 
-STATIC mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
+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 RT_BINARY_OP_SUBSCR:
@@ -116,7 +116,7 @@ STATIC mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
         }
         case RT_BINARY_OP_ADD:
         {
-            if (!MP_OBJ_IS_TYPE(rhs, &tuple_type)) {
+            if (!mp_obj_is_subclass_fast(mp_obj_get_type(rhs), (mp_obj_t)&tuple_type)) {
                 return NULL;
             }
             mp_obj_tuple_t *p = rhs;
diff --git a/py/objtuple.h b/py/objtuple.h
index 6ff38c10e..c310bfb7d 100644
--- a/py/objtuple.h
+++ b/py/objtuple.h
@@ -5,3 +5,5 @@ typedef struct _mp_obj_tuple_t {
 } mp_obj_tuple_t;
 
 void tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind);
+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);
diff --git a/tests/basics/namedtuple1.py b/tests/basics/namedtuple1.py
index 331c7dec1..1e194472f 100644
--- a/tests/basics/namedtuple1.py
+++ b/tests/basics/namedtuple1.py
@@ -5,8 +5,14 @@ T = namedtuple("Tup", "foo bar")
 #print(T)
 t = T(1, 2)
 print(t)
+print(t[0], t[1])
 print(t.foo, t.bar)
 
+print(len(t))
+print(bool(t))
+print(t + t)
+print(t * 3)
+
 print(isinstance(t, tuple))
 
 try:
-- 
GitLab