summaryrefslogtreecommitdiffstatshomepage
path: root/py/objfun.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objfun.c')
-rw-r--r--py/objfun.c62
1 files changed, 20 insertions, 42 deletions
diff --git a/py/objfun.c b/py/objfun.c
index 25a835e9b5..48c51053df 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -108,8 +108,18 @@ qstr mp_obj_code_get_name(const byte *code_info) {
return mp_decode_uint(&code_info);
}
+#if MICROPY_EMIT_NATIVE
+STATIC const mp_obj_type_t mp_type_fun_native;
+#endif
+
qstr mp_obj_fun_get_name(mp_const_obj_t fun_in) {
const mp_obj_fun_bc_t *fun = fun_in;
+ #if MICROPY_EMIT_NATIVE
+ if (fun->base.type == &mp_type_fun_native) {
+ // TODO native functions don't have name stored
+ return MP_QSTR_;
+ }
+ #endif
const byte *code_info = fun->bytecode;
return mp_obj_code_get_name(code_info);
}
@@ -168,7 +178,8 @@ mp_code_state *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, mp_uint_t n_arg
}
code_state->n_state = n_state;
- code_state->ip = ip;
+ code_state->code_info = 0; // offset to code-info
+ code_state->ip = ip - self->bytecode; // offset to prelude
mp_setup_code_state(code_state, self_in, n_args, n_kw, args);
// execute the byte code with the correct globals context
@@ -216,7 +227,8 @@ STATIC mp_obj_t fun_bc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw,
}
code_state->n_state = n_state;
- code_state->ip = ip;
+ code_state->code_info = 0; // offset to code-info
+ code_state->ip = (byte*)(ip - self->bytecode); // offset to prelude
mp_setup_code_state(code_state, self_in, n_args, n_kw, args);
// execute the byte code with the correct globals context
@@ -339,42 +351,11 @@ mp_obj_t mp_obj_new_fun_bc(mp_uint_t scope_flags, mp_uint_t n_pos_args, mp_uint_
#if MICROPY_EMIT_NATIVE
-typedef struct _mp_obj_fun_native_t {
- mp_obj_base_t base;
- mp_uint_t n_args;
- void *fun_data; // GC must be able to trace this pointer
- // TODO add mp_map_t *globals
-} mp_obj_fun_native_t;
-
-typedef mp_obj_t (*native_fun_0_t)(void);
-typedef mp_obj_t (*native_fun_1_t)(mp_obj_t);
-typedef mp_obj_t (*native_fun_2_t)(mp_obj_t, mp_obj_t);
-typedef mp_obj_t (*native_fun_3_t)(mp_obj_t, mp_obj_t, mp_obj_t);
-
STATIC mp_obj_t fun_native_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
- mp_obj_fun_native_t *self = self_in;
-
- mp_arg_check_num(n_args, n_kw, self->n_args, self->n_args, false);
-
- void *fun = MICROPY_MAKE_POINTER_CALLABLE(self->fun_data);
-
- switch (n_args) {
- case 0:
- return ((native_fun_0_t)fun)();
-
- case 1:
- return ((native_fun_1_t)fun)(args[0]);
-
- case 2:
- return ((native_fun_2_t)fun)(args[0], args[1]);
-
- case 3:
- return ((native_fun_3_t)fun)(args[0], args[1], args[2]);
-
- default:
- assert(0);
- return mp_const_none;
- }
+ MP_STACK_CHECK();
+ mp_obj_fun_bc_t *self = self_in;
+ mp_call_fun_t fun = MICROPY_MAKE_POINTER_CALLABLE((void*)self->bytecode);
+ return fun(self_in, n_args, n_kw, args);
}
STATIC const mp_obj_type_t mp_type_fun_native = {
@@ -383,12 +364,9 @@ STATIC const mp_obj_type_t mp_type_fun_native = {
.call = fun_native_call,
};
-mp_obj_t mp_obj_new_fun_native(mp_uint_t n_args, void *fun_data) {
- assert(0 <= n_args && n_args <= 3);
- mp_obj_fun_native_t *o = m_new_obj(mp_obj_fun_native_t);
+mp_obj_t mp_obj_new_fun_native(mp_uint_t scope_flags, mp_uint_t n_pos_args, mp_uint_t n_kwonly_args, mp_obj_t def_args_in, mp_obj_t def_kw_args, const void *fun_data) {
+ mp_obj_fun_bc_t *o = mp_obj_new_fun_bc(scope_flags, n_pos_args, n_kwonly_args, def_args_in, def_kw_args, (const byte*)fun_data);
o->base.type = &mp_type_fun_native;
- o->n_args = n_args;
- o->fun_data = fun_data;
return o;
}