added argument type annotations and runtime checks. To do that new opcodes were created (PUSHTYP, PUSHTYPTYP, ERROR)

This commit is contained in:
cozis
2022-08-14 16:25:47 +02:00
parent bc516f470a
commit 6bd60bc84a
18 changed files with 571 additions and 68 deletions
+4 -8
View File
@@ -1,24 +1,20 @@
#source
fun add(a, b) {
return a + b;
fun nop(a) {
return a;
}
#bytecode
PUSHFUN fun, 2;
ASS "add";
PUSHFUN fun, 1;
ASS "nop";
POP 1;
JUMP end;
fun:
ASS "b";
POP 1;
ASS "a";
POP 1;
PUSHVAR "a";
PUSHVAR "b";
ADD;
RETURN 1;
RETURN 0;
end:
+25
View File
@@ -0,0 +1,25 @@
#source
fun add(a, b) {
return a + b;
}
#bytecode
PUSHFUN fun, 2;
ASS "add";
POP 1;
JUMP end;
fun:
ASS "b";
POP 1;
ASS "a";
POP 1;
PUSHVAR "a";
PUSHVAR "b";
ADD;
RETURN 1;
RETURN 0;
end:
RETURN 0;
+33
View File
@@ -0,0 +1,33 @@
#source
fun nop(a: None) {
return a;
}
#bytecode
PUSHFUN fun, 1;
ASS "nop";
POP 1;
JUMP end;
fun:
PUSHTYP;
PUSHVAR "None";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg_annot_not_type;
EQL;
JUMPIFANDPOP arg_ok;
ERROR "Bad type for argument 0";
arg_annot_not_type:
ERROR "Argument 0 type annotation 0 is not a type";
arg_ok:
ASS "a";
POP 1;
PUSHVAR "a";
RETURN 1;
RETURN 0;
end:
RETURN 0;
+37
View File
@@ -0,0 +1,37 @@
#source
fun add(a: int, b) {
return a + b;
}
#bytecode
PUSHFUN fun, 2;
ASS "add";
POP 1;
JUMP end;
fun:
ASS "b";
POP 1;
PUSHTYP;
PUSHVAR "int";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg0_annot0_bad;
EQL;
JUMPIFANDPOP arg_ok;
ERROR "Bad type for argument 0";
arg0_annot0_bad:
ERROR "Argument 0 type annotation 0 is not a type";
arg_ok:
ASS "a";
POP 1;
PUSHVAR "a";
PUSHVAR "b";
ADD;
RETURN 1;
RETURN 0;
end:
RETURN 0;
+37
View File
@@ -0,0 +1,37 @@
#source
fun add(a, b: int) {
return a + b;
}
#bytecode
PUSHFUN fun, 2;
ASS "add";
POP 1;
JUMP end;
fun:
PUSHTYP;
PUSHVAR "int";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP annot_bad;
EQL;
JUMPIFANDPOP arg_ok;
ERROR "Bad type for argument 1";
annot_bad:
ERROR "Argument 1 type annotation 0 is not a type";
arg_ok:
ASS "b";
POP 1;
ASS "a";
POP 1;
PUSHVAR "a";
PUSHVAR "b";
ADD;
RETURN 1;
RETURN 0;
end:
RETURN 0;
+49
View File
@@ -0,0 +1,49 @@
#source
fun add(a: int, b: int) {
return a + b;
}
#bytecode
PUSHFUN fun, 2;
ASS "add";
POP 1;
JUMP end;
fun:
PUSHTYP;
PUSHVAR "int";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg1_annot0_not_type;
EQL;
JUMPIFANDPOP arg1_ok;
ERROR "Bad type for argument 1";
arg1_annot0_not_type:
ERROR "Argument 1 type annotation 0 is not a type";
arg1_ok:
ASS "b";
POP 1;
PUSHTYP;
PUSHVAR "int";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg0_annot0_not_type;
EQL;
JUMPIFANDPOP arg0_ok;
ERROR "Bad type for argument 0";
arg0_annot0_not_type:
ERROR "Argument 0 type annotation 0 is not a type";
arg0_ok:
ASS "a";
POP 1;
PUSHVAR "a";
PUSHVAR "b";
ADD;
RETURN 1;
RETURN 0;
end:
RETURN 0;
+69
View File
@@ -0,0 +1,69 @@
#source
fun add(a: int | float, b: bool | Map) {
return a + b;
}
#bytecode
PUSHFUN fun, 2;
ASS "add";
POP 1;
JUMP end;
fun:
PUSHTYP;
PUSHVAR "bool";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg1_annot0_bad;
EQL;
JUMPIFANDPOP arg1_ok;
PUSHTYP;
PUSHVAR "Map";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg1_annot1_bad;
EQL;
JUMPIFANDPOP arg1_ok;
ERROR "Bad type for argument 1";
arg1_annot0_bad:
ERROR "Argument 1 type annotation 0 is not a type";
arg1_annot1_bad:
ERROR "Argument 1 type annotation 1 is not a type";
arg1_ok:
ASS "b";
POP 1;
PUSHTYP;
PUSHVAR "int";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg0_annot0_bad;
EQL;
JUMPIFANDPOP arg0_ok;
PUSHTYP;
PUSHVAR "float";
PUSHTYP;
PUSHTYPTYP;
EQL;
JUMPIFNOTANDPOP arg0_annot1_bad;
EQL;
JUMPIFANDPOP arg0_ok;
ERROR "Bad type for argument 0";
arg0_annot0_bad:
ERROR "Argument 0 type annotation 0 is not a type";
arg0_annot1_bad:
ERROR "Argument 0 type annotation 1 is not a type";
arg0_ok:
ASS "a";
POP 1;
PUSHVAR "a";
PUSHVAR "b";
ADD;
RETURN 1;
RETURN 0;
end:
RETURN 0;