Improved type/class/instance code; mp_obj_type_t now has load_attr, store_attr.
Creating of classes (types) and instances is much more like CPython now.
You can use "type('name', (), {...})" to create classes.
diff --git a/py/builtin.c b/py/builtin.c
index 5dbf47a..50e9c02 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -23,8 +23,8 @@
// 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(0);
- rt_locals_set(class_locals);
+ mp_obj_t class_locals = mp_obj_new_dict(0);
+ rt_locals_set(mp_obj_dict_get_map(class_locals));
// call the class code
mp_obj_t cell = rt_call_function_1(args[0], (mp_obj_t)0xdeadbeef);
@@ -32,7 +32,6 @@
// restore old __locals__ object
rt_locals_set(old_locals);
- /*
// get the class type (meta object) from the base objects
mp_obj_t meta;
if (n_args == 2) {
@@ -42,21 +41,16 @@
// 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
+ meta_args[0] = class_locals; // dict of members
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) {