diff options
Diffstat (limited to 'py/runtime.c')
| -rw-r--r-- | py/runtime.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/py/runtime.c b/py/runtime.c index 59e47c7ff..8dbdac9d9 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -517,12 +517,6 @@ mp_obj_t mp_call_function_2(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2) { return mp_call_function_n_kw(fun, 2, 0, args); } -// wrapper that accepts n_args and n_kw in one argument -// native emitter can only pass at most 3 arguments to a function -mp_obj_t mp_call_function_n_kw_for_native(mp_obj_t fun_in, uint n_args_kw, const mp_obj_t *args) { - return mp_call_function_n_kw(fun_in, n_args_kw & 0xff, (n_args_kw >> 8) & 0xff, args); -} - // args contains, eg: arg0 arg1 key0 value0 key1 value1 mp_obj_t mp_call_function_n_kw(mp_obj_t fun_in, uint n_args, uint n_kw, const mp_obj_t *args) { // TODO improve this: fun object can specify its type and we parse here the arguments, @@ -1163,17 +1157,56 @@ NORETURN void mp_not_implemented(const char *msg) { nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError, msg)); } -// these must correspond to the respective enum +// convert a Micro Python object to a valid native value based on type +mp_uint_t mp_convert_obj_to_native(mp_obj_t obj, mp_uint_t type) { + DEBUG_printf("mp_convert_obj_to_native(%p, " UINT_FMT ")\n", obj, type); + switch (type & 3) { + case MP_NATIVE_TYPE_OBJ: return (mp_uint_t)obj; + case MP_NATIVE_TYPE_BOOL: + case MP_NATIVE_TYPE_INT: + case MP_NATIVE_TYPE_UINT: return mp_obj_get_int(obj); + default: assert(0); return 0; + } +} + +// convert a native value to a Micro Python object based on type +mp_obj_t mp_convert_native_to_obj(mp_uint_t val, mp_uint_t type) { + DEBUG_printf("mp_convert_native_to_obj(" UINT_FMT ", " UINT_FMT ")\n", val, type); + switch (type & 3) { + case MP_NATIVE_TYPE_OBJ: return (mp_obj_t)val; + case MP_NATIVE_TYPE_BOOL: return MP_BOOL(val); + case MP_NATIVE_TYPE_INT: return mp_obj_new_int(val); + case MP_NATIVE_TYPE_UINT: return mp_obj_new_int_from_uint(val); + default: assert(0); return mp_const_none; + } +} + +// wrapper that accepts n_args and n_kw in one argument +// (native emitter can only pass at most 3 arguments to a function) +mp_obj_t mp_native_call_function_n_kw(mp_obj_t fun_in, uint n_args_kw, const mp_obj_t *args) { + return mp_call_function_n_kw(fun_in, n_args_kw & 0xff, (n_args_kw >> 8) & 0xff, args); +} + +// wrapper that makes raise obj and raises it +NORETURN void mp_native_raise(mp_obj_t o) { + nlr_raise(mp_make_raise_obj(o)); +} + +// these must correspond to the respective enum in runtime0.h void *const mp_fun_table[MP_F_NUMBER_OF] = { + mp_convert_obj_to_native, + mp_convert_native_to_obj, mp_load_const_int, mp_load_const_dec, mp_load_const_str, + mp_load_const_bytes, mp_load_name, mp_load_global, mp_load_build_class, mp_load_attr, mp_load_method, mp_store_name, + mp_store_global, mp_store_attr, mp_obj_subscr, mp_obj_is_true, @@ -1189,10 +1222,13 @@ void *const mp_fun_table[MP_F_NUMBER_OF] = { mp_obj_set_store, #endif mp_make_function_from_raw_code, - mp_call_function_n_kw_for_native, + mp_native_call_function_n_kw, mp_call_method_n_kw, mp_getiter, mp_iternext, + nlr_push, + nlr_pop, + mp_native_raise, mp_import_name, mp_import_from, mp_import_all, |
