From 12a5e17afb6a59d1eb0e1ce0444d7e4891f6391b Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 1 Apr 2015 23:31:30 +0100 Subject: [PATCH] py: Add finer configuration of static funcs when not in stackless mode. Also rename call_args_t to mp_call_args_t. --- py/objfun.c | 2 ++ py/runtime.c | 8 ++++++-- py/runtime.h | 9 ++++++--- py/vm.c | 4 ++-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/py/objfun.c b/py/objfun.c index 70b897b57d..25a835e9b5 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -142,6 +142,7 @@ STATIC void dump_args(const mp_obj_t *a, mp_uint_t sz) { // Set this to enable a simple stack overflow check. #define VM_DETECT_STACK_OVERFLOW (0) +#if MICROPY_STACKLESS mp_code_state *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { MP_STACK_CHECK(); mp_obj_fun_bc_t *self = self_in; @@ -176,6 +177,7 @@ mp_code_state *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, mp_uint_t n_arg return code_state; } +#endif STATIC mp_obj_t fun_bc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { MP_STACK_CHECK(); diff --git a/py/runtime.c b/py/runtime.c index f6bc7aa846..2bb9a02641 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -577,7 +577,11 @@ mp_obj_t mp_call_method_n_kw(mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *a return mp_call_function_n_kw(args[0], n_args + adjust, n_kw, args + 2 - adjust); } -void mp_call_prepare_args_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const mp_obj_t *args, call_args_t *out_args) { +// This function only needs to be exposed externally when in stackless mode. +#if !MICROPY_STACKLESS +STATIC +#endif +void mp_call_prepare_args_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const mp_obj_t *args, mp_call_args_t *out_args) { mp_obj_t fun = *args++; mp_obj_t self = MP_OBJ_NULL; if (have_self) { @@ -723,7 +727,7 @@ void mp_call_prepare_args_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const } mp_obj_t mp_call_method_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const mp_obj_t *args) { - call_args_t out_args; + mp_call_args_t out_args; mp_call_prepare_args_n_kw_var(have_self, n_args_n_kw, args, &out_args); mp_obj_t res = mp_call_function_n_kw(out_args.fun, out_args.n_args, out_args.n_kw, out_args.args); diff --git a/py/runtime.h b/py/runtime.h index a36f1b1bd7..f05a7d0a89 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -97,16 +97,19 @@ mp_obj_t mp_call_function_n_kw(mp_obj_t fun, mp_uint_t n_args, mp_uint_t n_kw, c mp_obj_t mp_call_method_n_kw(mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args); mp_obj_t mp_call_method_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const mp_obj_t *args); -typedef struct _call_args_t { +typedef struct _mp_call_args_t { mp_obj_t fun; mp_uint_t n_args, n_kw, n_alloc; mp_obj_t *args; -} call_args_t; +} mp_call_args_t; +#if MICROPY_STACKLESS // Takes arguments which are the most general mix of Python arg types, and // prepares argument array suitable for passing to ->call() method of a // function object (and mp_call_function_n_kw()). -void mp_call_prepare_args_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const mp_obj_t *args, call_args_t *out_args); +// (Only needed in stackless mode.) +void mp_call_prepare_args_n_kw_var(bool have_self, mp_uint_t n_args_n_kw, const mp_obj_t *args, mp_call_args_t *out_args); +#endif void mp_unpack_sequence(mp_obj_t seq, mp_uint_t num, mp_obj_t *items); void mp_unpack_ex(mp_obj_t seq, mp_uint_t num, mp_obj_t *items); diff --git a/py/vm.c b/py/vm.c index dc4f9c2739..0472901f23 100644 --- a/py/vm.c +++ b/py/vm.c @@ -906,7 +906,7 @@ unwind_jump:; code_state->sp = sp; code_state->exc_sp = MP_TAGPTR_MAKE(exc_sp, currently_in_except_block); - call_args_t out_args; + mp_call_args_t out_args; mp_call_prepare_args_n_kw_var(false, unum, sp, &out_args); mp_code_state *new_state = mp_obj_fun_bc_prepare_codestate(out_args.fun, @@ -977,7 +977,7 @@ unwind_jump:; code_state->sp = sp; code_state->exc_sp = MP_TAGPTR_MAKE(exc_sp, currently_in_except_block); - call_args_t out_args; + mp_call_args_t out_args; mp_call_prepare_args_n_kw_var(true, unum, sp, &out_args); mp_code_state *new_state = mp_obj_fun_bc_prepare_codestate(out_args.fun,