py: Improve __build_class__.
diff --git a/py/builtin.c b/py/builtin.c
index 6babc76..4ee5c57 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -15,22 +15,59 @@
 #include "map.h"
 #include "builtin.h"
 
-mp_obj_t mp_builtin___build_class__(mp_obj_t o_class_fun, mp_obj_t o_class_name) {
+// args[0] is function from class body
+// args[1] is class name
+// args[2:] are base objects
+mp_obj_t mp_builtin___build_class__(int n_args, const mp_obj_t *args) {
+    assert(2 <= n_args);
+
     // we differ from CPython: we set the new __locals__ object here
     mp_map_t *old_locals = rt_locals_get();
     mp_map_t *class_locals = mp_map_new(MP_MAP_QSTR, 0);
     rt_locals_set(class_locals);
 
     // call the class code
-    rt_call_function_1(o_class_fun, (mp_obj_t)0xdeadbeef);
+    mp_obj_t cell = rt_call_function_1(args[0], (mp_obj_t)0xdeadbeef);
 
     // restore old __locals__ object
     rt_locals_set(old_locals);
 
-    // create and return the new class
-    return mp_obj_new_class(class_locals);
+    /*
+    // get the class type (meta object) from the base objects
+    mp_obj_t meta;
+    if (n_args == 2) {
+        // no explicit bases, so use 'type'
+        meta = (mp_obj_t)&mp_const_type;
+    } else {
+        // use type of first base object
+        meta = mp_obj_get_type(args[2]);
+    }
+    */
+
+    // TODO do proper metaclass resolution for multiple base objects
+
+    /*
+    // create the new class using a call to the meta object
+    // (arguments must be backwards in the array)
+    mp_obj_t meta_args[3];
+    meta_args[2] = args[1]; // class name
+    meta_args[1] = mp_obj_new_tuple(n_args - 2, args + 2); // tuple of bases
+    meta_args[0] = class_locals; // dict of members TODO, currently is a map
+    mp_obj_t new_class = rt_call_function_n(meta, 3, meta_args);
+    */
+    // create the new class
+    mp_obj_t new_class = mp_obj_new_class(class_locals);
+
+    // store into cell if neede
+    if (cell != mp_const_none) {
+        mp_obj_cell_set(cell, new_class);
+    }
+
+    return new_class;
 }
 
+MP_DEFINE_CONST_FUN_OBJ_VAR(mp_builtin___build_class___obj, 2, mp_builtin___build_class__);
+
 mp_obj_t mp_builtin___repl_print__(mp_obj_t o) {
     if (o != mp_const_none) {
         mp_obj_print(o);
@@ -281,12 +318,7 @@
 
 static mp_obj_t mp_builtin_type(mp_obj_t o_in) {
     // TODO implement the 3 argument version of type()
-    if (MP_OBJ_IS_SMALL_INT(o_in)) {
-        return (mp_obj_t)&int_type;
-    } else {
-        mp_obj_base_t *o = o_in;
-        return (mp_obj_t)o->type;
-    }
+    return mp_obj_get_type(o_in);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_type_obj, mp_builtin_type);