py: Proper framework for built-in 'type'.
This commit is contained in:
parent
6c73ca1e75
commit
93a9b5b64d
@ -315,10 +315,3 @@ mp_obj_t mp_builtin_sum(int n_args, const mp_obj_t *args) {
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
static mp_obj_t mp_builtin_type(mp_obj_t o_in) {
|
||||
// TODO implement the 3 argument version of type()
|
||||
return mp_obj_get_type(o_in);
|
||||
}
|
||||
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_type_obj, mp_builtin_type);
|
||||
|
@ -24,6 +24,7 @@ static void float_print(void (*print)(void *env, const char *fmt, ...), void *en
|
||||
print(env, "%.8g", o->value);
|
||||
}
|
||||
|
||||
// args are reverse in the array
|
||||
static mp_obj_t float_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args) {
|
||||
switch (n_args) {
|
||||
case 0:
|
||||
|
27
py/objtype.c
27
py/objtype.c
@ -12,6 +12,32 @@ static void type_print(void (*print)(void *env, const char *fmt, ...), void *env
|
||||
print(env, "<class '%s'>", self->name);
|
||||
}
|
||||
|
||||
// args are reverse in the array
|
||||
static mp_obj_t type_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args) {
|
||||
switch (n_args) {
|
||||
case 1:
|
||||
return mp_obj_get_type(args[0]);
|
||||
|
||||
case 3:
|
||||
{
|
||||
// args[2] = name
|
||||
// args[1] = bases tuple
|
||||
// args[0] = locals dict
|
||||
|
||||
mp_obj_type_t *new_type = m_new0(mp_obj_type_t, 1);
|
||||
new_type->base.type = &mp_const_type;
|
||||
new_type->name = qstr_str(mp_obj_get_qstr(args[2]));
|
||||
return new_type;
|
||||
|
||||
//mp_obj_t new_class = mp_obj_new_class(mp_obj_get_qstr(args[2]), args[0]);
|
||||
//return new_class;
|
||||
}
|
||||
|
||||
default:
|
||||
nlr_jump(mp_obj_new_exception_msg(MP_QSTR_TypeError, "type takes at 1 or 3 arguments"));
|
||||
}
|
||||
}
|
||||
|
||||
static mp_obj_t type_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
|
||||
mp_obj_type_t *self = self_in;
|
||||
if (self->make_new != NULL) {
|
||||
@ -26,5 +52,6 @@ const mp_obj_type_t mp_const_type = {
|
||||
{ &mp_const_type },
|
||||
"type",
|
||||
.print = type_print,
|
||||
.make_new = type_make_new,
|
||||
.call_n = type_call_n,
|
||||
};
|
||||
|
@ -111,7 +111,7 @@ void rt_init(void) {
|
||||
mp_map_add_qstr(&map_builtins, MP_QSTR_list, (mp_obj_t)&list_type);
|
||||
mp_map_add_qstr(&map_builtins, MP_QSTR_set, (mp_obj_t)&set_type);
|
||||
mp_map_add_qstr(&map_builtins, MP_QSTR_tuple, (mp_obj_t)&tuple_type);
|
||||
mp_map_add_qstr(&map_builtins, MP_QSTR_type, (mp_obj_t)&mp_builtin_type_obj); // TODO
|
||||
mp_map_add_qstr(&map_builtins, MP_QSTR_type, (mp_obj_t)&mp_const_type);
|
||||
|
||||
// built-in user functions; TODO covert all to &mp_builtin_xxx's
|
||||
mp_map_add_qstr(&map_builtins, MP_QSTR_abs, rt_make_function_1(mp_builtin_abs));
|
||||
|
Loading…
Reference in New Issue
Block a user