py/emitnative: Support arbitrary number of arguments to viper functions.

pull/4157/head
Damien George 2018-09-15 16:06:58 +10:00
rodzic 43f1848bfa
commit a676b5acf6
5 zmienionych plików z 11 dodań i 12 usunięć

Wyświetl plik

@ -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
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)
// n_state counts all stack and locals, even those in registers
emit->n_state = scope->num_locals + scope->stack_size;

Wyświetl plik

@ -25,7 +25,15 @@ 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
@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)
@micropython.viper

Wyświetl plik

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

Wyświetl plik

@ -13,9 +13,6 @@ test("@micropython.viper\ndef f() -> 1: pass")
# unknown type
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
test("""
@micropython.viper

Wyświetl plik

@ -1,7 +1,6 @@
SyntaxError('annotation must be an identifier',)
SyntaxError('annotation must be an identifier',)
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' has type 'int' but source is 'object'",)
ViperTypeError("can't implicitly convert 'ptr' to 'bool'",)