diff --git a/compiler/src/prog8/ast/processing/AstChecker.kt b/compiler/src/prog8/ast/processing/AstChecker.kt index 6f5ba59d3..890930420 100644 --- a/compiler/src/prog8/ast/processing/AstChecker.kt +++ b/compiler/src/prog8/ast/processing/AstChecker.kt @@ -1054,6 +1054,8 @@ internal class AstChecker(private val program: Program, } } } + + // TODO warn about unreachable code following a return statement??? } private fun checkFunctionOrLabelExists(target: IdentifierReference, statement: Statement): Statement? { diff --git a/compiler/src/prog8/optimizer/StatementOptimizer.kt b/compiler/src/prog8/optimizer/StatementOptimizer.kt index f1ee57e9f..7e1138cad 100644 --- a/compiler/src/prog8/optimizer/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizer/StatementOptimizer.kt @@ -588,6 +588,8 @@ internal class StatementOptimizer(private val program: Program) : IAstModifyingV statements.removeAt(statements.lastIndex) } } + + // TODO remove all statements following a 'return' statement ??? } } diff --git a/compiler/src/prog8/vm/astvm/AstVm.kt b/compiler/src/prog8/vm/astvm/AstVm.kt index 350f359b8..402cbec66 100644 --- a/compiler/src/prog8/vm/astvm/AstVm.kt +++ b/compiler/src/prog8/vm/astvm/AstVm.kt @@ -996,6 +996,11 @@ class AstVm(val program: Program, compilationTarget: String) { else -> RuntimeValueNumeric(DataType.BYTE, 1) } } + "exit" -> { + val rv = args.single().numericValue() + dialog.canvas.printAsciiText("\n") + throw VmTerminationException("program ended with exit($rv)") + } else -> TODO("astvm implement builtin function $name") } } diff --git a/examples/test.p8 b/examples/test.p8 index d18dbf90a..cbeb9747b 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -20,9 +20,9 @@ main { sub sub2() { c64scr.print("sp2:") print_stackpointer() - exit(65) - sub3() - sub3() + return + sub3() ; TODO warning about unreachable code + sub3() ; TODO remove statements after a return sub3() sub3() sub3() @@ -40,9 +40,6 @@ main { } sub print_stackpointer() { - %asm {{ - tsx - }} c64scr.print_ub(X) ; prints stack pointer c64.CHROUT('\n') }