#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: EXIT;