py: Allow viper functions to take up to 4 arguments.
Addresses issue #1380.
This commit is contained in:
parent
7693ef3bd6
commit
e45c1dbd6f
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
||||||
|
0
|
||||||
|
1
|
||||||
|
1 2
|
||||||
|
1 2 3
|
||||||
|
1 2 3 4
|
Loading…
Reference in New Issue