From e45c1dbd6f4e313f21862c853d55499447c844e6 Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 23 Jul 2015 14:11:29 +0100 Subject: [PATCH] py: Allow viper functions to take up to 4 arguments. Addresses issue #1380. --- py/objfun.c | 9 +++++++++ tests/micropython/viper_args.py | 28 ++++++++++++++++++++++++++++ tests/micropython/viper_args.py.exp | 5 +++++ 3 files changed, 42 insertions(+) create mode 100644 tests/micropython/viper_args.py create mode 100644 tests/micropython/viper_args.py.exp diff --git a/py/objfun.c b/py/objfun.c index ff37da1463..774d8e64c4 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -397,6 +397,7 @@ typedef mp_uint_t (*viper_fun_0_t)(void); typedef mp_uint_t (*viper_fun_1_t)(mp_uint_t); typedef mp_uint_t (*viper_fun_2_t)(mp_uint_t, mp_uint_t); typedef mp_uint_t (*viper_fun_3_t)(mp_uint_t, mp_uint_t, mp_uint_t); +typedef mp_uint_t (*viper_fun_4_t)(mp_uint_t, mp_uint_t, mp_uint_t, mp_uint_t); STATIC mp_obj_t fun_viper_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { mp_obj_fun_viper_t *self = self_in; @@ -414,7 +415,15 @@ STATIC mp_obj_t fun_viper_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_k ret = ((viper_fun_2_t)fun)(mp_convert_obj_to_native(args[0], self->type_sig >> 2), mp_convert_obj_to_native(args[1], self->type_sig >> 4)); } else if (n_args == 3) { ret = ((viper_fun_3_t)fun)(mp_convert_obj_to_native(args[0], self->type_sig >> 2), mp_convert_obj_to_native(args[1], self->type_sig >> 4), mp_convert_obj_to_native(args[2], self->type_sig >> 6)); + } else if (n_args == 4) { + ret = ((viper_fun_4_t)fun)( + mp_convert_obj_to_native(args[0], self->type_sig >> 2), + mp_convert_obj_to_native(args[1], self->type_sig >> 4), + mp_convert_obj_to_native(args[2], self->type_sig >> 6), + mp_convert_obj_to_native(args[3], self->type_sig >> 8) + ); } else { + // TODO 5 or more arguments not supported for viper call assert(0); ret = 0; } diff --git a/tests/micropython/viper_args.py b/tests/micropython/viper_args.py new file mode 100644 index 0000000000..ca2a5e6704 --- /dev/null +++ b/tests/micropython/viper_args.py @@ -0,0 +1,28 @@ +# test calling viper functions with different number of args + +@micropython.viper +def f0(): + print(0) +f0() + +@micropython.viper +def f1(x1:int): + print(x1) +f1(1) + +@micropython.viper +def f2(x1:int, x2:int): + print(x1, x2) +f2(1, 2) + +@micropython.viper +def f3(x1:int, x2:int, x3:int): + print(x1, x2, x3) +f3(1, 2, 3) + +@micropython.viper +def f4(x1:int, x2:int, x3:int, x4:int): + print(x1, x2, x3, x4) +f4(1, 2, 3, 4) + +# only up to 4 arguments currently supported diff --git a/tests/micropython/viper_args.py.exp b/tests/micropython/viper_args.py.exp new file mode 100644 index 0000000000..0ca0f4e906 --- /dev/null +++ b/tests/micropython/viper_args.py.exp @@ -0,0 +1,5 @@ +0 +1 +1 2 +1 2 3 +1 2 3 4