summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-07-23 14:11:29 +0100
committerDamien George <damien.p.george@gmail.com>2015-07-23 14:11:29 +0100
commite45c1dbd6f4e313f21862c853d55499447c844e6 (patch)
treee5de5de200ac015d34ca033d83cfd316495e8d70
parent7693ef3bd6e4456105c86909174a00f535a19261 (diff)
downloadmicropython-e45c1dbd6f4e313f21862c853d55499447c844e6.tar.gz
micropython-e45c1dbd6f4e313f21862c853d55499447c844e6.zip
py: Allow viper functions to take up to 4 arguments.
Addresses issue #1380.
-rw-r--r--py/objfun.c9
-rw-r--r--tests/micropython/viper_args.py28
-rw-r--r--tests/micropython/viper_args.py.exp5
3 files changed, 42 insertions, 0 deletions
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