From bcbeea0a477ed977a668e67f6f5402260d26ceb9 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Sat, 11 Jan 2014 10:47:22 +0000
Subject: [PATCH] py: Fix bug where == and != not handled for small_ints.

---
 py/runtime.c | 58 ++++++++++++++++++++++++++--------------------------
 1 file changed, 29 insertions(+), 29 deletions(-)

diff --git a/py/runtime.c b/py/runtime.c
index 53861f1e4..29571a44b 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -467,6 +467,35 @@ mp_obj_t rt_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
     //   then fail
     // note that list does not implement + or +=, so that inplace_concat is reached first for +=
 
+    // deal with == and != for all types
+    if (op == RT_COMPARE_OP_EQUAL || op == RT_COMPARE_OP_NOT_EQUAL) {
+        if (mp_obj_equal(lhs, rhs)) {
+            if (op == RT_COMPARE_OP_EQUAL) {
+                return mp_const_true;
+            } else {
+                return mp_const_false;
+            }
+        } else {
+            if (op == RT_COMPARE_OP_EQUAL) {
+                return mp_const_false;
+            } else {
+                return mp_const_true;
+            }
+        }
+    }
+
+    // deal with exception_match for all types
+    if (op == RT_COMPARE_OP_EXCEPTION_MATCH) {
+        // TODO properly! at the moment it just compares the exception identifier for equality
+        if (MP_OBJ_IS_TYPE(lhs, &exception_type) && MP_OBJ_IS_TYPE(rhs, &exception_type)) {
+            if (mp_obj_exception_get_type(lhs) == mp_obj_exception_get_type(rhs)) {
+                return mp_const_true;
+            } else {
+                return mp_const_false;
+            }
+        }
+    }
+
     if (MP_OBJ_IS_SMALL_INT(lhs)) {
         mp_small_int_t lhs_val = MP_OBJ_SMALL_INT_VALUE(lhs);
         if (MP_OBJ_IS_SMALL_INT(rhs)) {
@@ -530,35 +559,6 @@ mp_obj_t rt_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
             return mp_obj_complex_binary_op(op, lhs_val, 0, rhs);
         }
     } else {
-        // deal with == and !=
-        if (op == RT_COMPARE_OP_EQUAL || op == RT_COMPARE_OP_NOT_EQUAL) {
-            if (mp_obj_equal(lhs, rhs)) {
-                if (op == RT_COMPARE_OP_EQUAL) {
-                    return mp_const_true;
-                } else {
-                    return mp_const_false;
-                }
-            } else {
-                if (op == RT_COMPARE_OP_EQUAL) {
-                    return mp_const_false;
-                } else {
-                    return mp_const_true;
-                }
-            }
-        }
-
-        // deal with exception_match
-        if (op == RT_COMPARE_OP_EXCEPTION_MATCH) {
-            // TODO properly! at the moment it just compares the exception identifier for equality
-            if (MP_OBJ_IS_TYPE(lhs, &exception_type) && MP_OBJ_IS_TYPE(rhs, &exception_type)) {
-                if (mp_obj_exception_get_type(lhs) == mp_obj_exception_get_type(rhs)) {
-                    return mp_const_true;
-                } else {
-                    return mp_const_false;
-                }
-            }
-        }
-
         if (MP_OBJ_IS_OBJ(lhs)) {
             mp_obj_base_t *o = lhs;
             if (o->type->binary_op != NULL) {
-- 
GitLab