py: add dict length function, and fix rt_store_set.
diff --git a/py/builtin.c b/py/builtin.c
index f6b5710..f39ab03 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -209,11 +209,8 @@
         mp_obj_t *seq_items;
         mp_obj_list_get(o_in, &seq_len, &seq_items);
         len = seq_len;
-        /* TODO
     } else if (MP_OBJ_IS_TYPE(o_in, &dict_type)) {
-        mp_obj_base_t *o = o_in;
-        len = o->u_map.used;
-        */
+        len = mp_obj_dict_len(o_in);
     } else {
         nlr_jump(mp_obj_new_exception_msg_1_arg(rt_q_TypeError, "object of type '%s' has no len()", mp_obj_get_type_str(o_in)));
     }
diff --git a/py/obj.h b/py/obj.h
index 8d857b1..1a7b91a 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -206,6 +206,7 @@
 
 // dict
 extern const mp_obj_type_t dict_type;
+uint mp_obj_dict_len(mp_obj_t self_in);
 mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value);
 
 // set
diff --git a/py/objdict.c b/py/objdict.c
index 02753e3..50ce279 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -53,13 +53,6 @@
     }
 }
 
-mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value) {
-    assert(MP_OBJ_IS_TYPE(self_in, &dict_type));
-    mp_obj_dict_t *self = self_in;
-    mp_map_lookup_helper(&self->map, key, true)->value = value;
-    return self_in;
-}
-
 const mp_obj_type_t dict_type = {
     { &mp_const_type },
     "dict",
@@ -78,3 +71,21 @@
     mp_map_init(&o->map, MP_MAP_OBJ, n_args);
     return o;
 }
+
+uint mp_obj_dict_len(mp_obj_t self_in) {
+    mp_obj_dict_t *self = self_in;
+    uint len = 0;
+    for (int i = 0; i < self->map.alloc; i++) {
+        if (self->map.table[i].key != NULL) {
+            len += 1;
+        }
+    }
+    return len;
+}
+
+mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value) {
+    assert(MP_OBJ_IS_TYPE(self_in, &dict_type));
+    mp_obj_dict_t *self = self_in;
+    mp_map_lookup_helper(&self->map, key, true)->value = value;
+    return self_in;
+}
diff --git a/py/runtime.c b/py/runtime.c
index 7258b36..1598cc2 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -737,7 +737,7 @@
 }
 
 mp_obj_t rt_store_set(mp_obj_t set, mp_obj_t item) {
-    mp_set_lookup(set, item, true);
+    mp_obj_set_store(set, item);
     return set;
 }
 
diff --git a/py/showbc.c b/py/showbc.c
index 20a9790..480dc1c 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -279,21 +279,17 @@
                 rt_store_map(sp[unum + 1], sp[0], sp[1]);
                 sp += 2;
                 break;
+                */
 
             case MP_BC_BUILD_SET:
                 DECODE_UINT;
-                obj1 = rt_build_set(unum, sp);
-                sp += unum - 1;
-                *sp = obj1;
+                printf("BUILD_SET %lu", unum);
                 break;
 
             case MP_BC_SET_ADD:
                 DECODE_UINT;
-                // I think it's guaranteed by the compiler that sp[unum] is a set
-                rt_store_set(sp[unum], sp[0]);
-                sp++;
+                printf("SET_ADD %lu", unum);
                 break;
-                */
 
             case MP_BC_UNPACK_SEQUENCE:
                 DECODE_UINT;