py: Allow viper functions to take up to 4 arguments.

Addresses issue #1380.
This commit is contained in:
Damien George 2015-07-23 14:11:29 +01:00
parent 7693ef3bd6
commit e45c1dbd6f
3 changed files with 42 additions and 0 deletions

View File

@ -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_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_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_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) { 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; 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)); 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) { } 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)); 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 { } else {
// TODO 5 or more arguments not supported for viper call
assert(0); assert(0);
ret = 0; ret = 0;
} }

View File

@ -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

View File

@ -0,0 +1,5 @@
0
1
1 2
1 2 3
1 2 3 4