py/emitnative: Support arbitrary number of arguments to viper functions.
This commit is contained in:
parent
43f1848bfa
commit
a676b5acf6
@ -295,13 +295,6 @@ STATIC void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop
|
|||||||
// generate code for entry to function
|
// generate code for entry to function
|
||||||
|
|
||||||
if (emit->do_viper_types) {
|
if (emit->do_viper_types) {
|
||||||
|
|
||||||
// right now we have a restriction of maximum of 4 arguments
|
|
||||||
if (scope->num_pos_args > REG_ARG_NUM) {
|
|
||||||
EMIT_NATIVE_VIPER_TYPE_ERROR(emit, "Viper functions don't currently support more than 4 arguments");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Work out size of state (locals plus stack)
|
// Work out size of state (locals plus stack)
|
||||||
// n_state counts all stack and locals, even those in registers
|
// n_state counts all stack and locals, even those in registers
|
||||||
emit->n_state = scope->num_locals + scope->stack_size;
|
emit->n_state = scope->num_locals + scope->stack_size;
|
||||||
|
@ -25,7 +25,15 @@ def f4(x1:int, x2:int, x3:int, x4:int):
|
|||||||
print(x1, x2, x3, x4)
|
print(x1, x2, x3, x4)
|
||||||
f4(1, 2, 3, 4)
|
f4(1, 2, 3, 4)
|
||||||
|
|
||||||
# only up to 4 arguments currently supported
|
@micropython.viper
|
||||||
|
def f5(x1:int, x2:int, x3:int, x4:int, x5:int):
|
||||||
|
print(x1, x2, x3, x4, x5)
|
||||||
|
f5(1, 2, 3, 4, 5)
|
||||||
|
|
||||||
|
@micropython.viper
|
||||||
|
def f6(x1:int, x2:int, x3:int, x4:int, x5:int, x6:int):
|
||||||
|
print(x1, x2, x3, x4, x5, x6)
|
||||||
|
f6(1, 2, 3, 4, 5, 6)
|
||||||
|
|
||||||
# test compiling *x, **x, * args (currently unsupported at runtime)
|
# test compiling *x, **x, * args (currently unsupported at runtime)
|
||||||
@micropython.viper
|
@micropython.viper
|
||||||
|
@ -3,3 +3,5 @@
|
|||||||
1 2
|
1 2
|
||||||
1 2 3
|
1 2 3
|
||||||
1 2 3 4
|
1 2 3 4
|
||||||
|
1 2 3 4 5
|
||||||
|
1 2 3 4 5 6
|
||||||
|
@ -13,9 +13,6 @@ test("@micropython.viper\ndef f() -> 1: pass")
|
|||||||
# unknown type
|
# unknown type
|
||||||
test("@micropython.viper\ndef f(x:unknown_type): pass")
|
test("@micropython.viper\ndef f(x:unknown_type): pass")
|
||||||
|
|
||||||
# too many arguments
|
|
||||||
test("@micropython.viper\ndef f(a, b, c, d, e): pass")
|
|
||||||
|
|
||||||
# local used before type known
|
# local used before type known
|
||||||
test("""
|
test("""
|
||||||
@micropython.viper
|
@micropython.viper
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
SyntaxError('annotation must be an identifier',)
|
SyntaxError('annotation must be an identifier',)
|
||||||
SyntaxError('annotation must be an identifier',)
|
SyntaxError('annotation must be an identifier',)
|
||||||
ViperTypeError("unknown type 'unknown_type'",)
|
ViperTypeError("unknown type 'unknown_type'",)
|
||||||
ViperTypeError("Viper functions don't currently support more than 4 arguments",)
|
|
||||||
ViperTypeError("local 'x' used before type known",)
|
ViperTypeError("local 'x' used before type known",)
|
||||||
ViperTypeError("local 'x' has type 'int' but source is 'object'",)
|
ViperTypeError("local 'x' has type 'int' but source is 'object'",)
|
||||||
ViperTypeError("can't implicitly convert 'ptr' to 'bool'",)
|
ViperTypeError("can't implicitly convert 'ptr' to 'bool'",)
|
||||||
|
Loading…
Reference in New Issue
Block a user