From 13bbd7af8157fcdf27884cec45056ee7a21cf50e Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Fri, 10 Mar 2017 13:02:53 +0700 Subject: [PATCH] runtime: use exitStatus == 1 if main finished with exception Also update the corresponding test. --- backend.native/tests/build.gradle | 1 + runtime/src/launcher/cpp/launcher.cpp | 14 +++++++++----- runtime/src/launcher/kotlin/konan/start.kt | 7 +++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 582a42f8a14..e584e74aad1 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -1141,6 +1141,7 @@ task spread_operator_0(type: RunKonanTest) { task main_exception(type: RunKonanTest) { // TODO: cannot currently check the output because the exact stacktrace strings are unpredictable. // goldValue = "Uncaught exception from Kotlin's main: Throwable\n" + expectedExitStatus = 1 source = "runtime/basic/main_exception.kt" } diff --git a/runtime/src/launcher/cpp/launcher.cpp b/runtime/src/launcher/cpp/launcher.cpp index 209814c59d7..e2b864d775b 100644 --- a/runtime/src/launcher/cpp/launcher.cpp +++ b/runtime/src/launcher/cpp/launcher.cpp @@ -18,19 +18,23 @@ OBJ_GETTER(setupArgs, int argc, char** argv) { } //--- main --------------------------------------------------------------------// -extern "C" void Konan_start(const ObjHeader* ); +extern "C" KInt Konan_start(const ObjHeader* ); int main(int argc, char** argv) { RuntimeState* state = InitRuntime(); - if (state != nullptr) { + if (state == nullptr) { + return 2; + } + + KInt exitStatus; + { ObjHolder args; setupArgs(argc, argv, args.slot()); - Konan_start(args.obj()); + exitStatus = Konan_start(args.obj()); } DeinitRuntime(state); - // Yes, we have to follow Java convention and return zero. - return 0; + return exitStatus; } diff --git a/runtime/src/launcher/kotlin/konan/start.kt b/runtime/src/launcher/kotlin/konan/start.kt index fa750bb3da7..9012016d6bc 100644 --- a/runtime/src/launcher/kotlin/konan/start.kt +++ b/runtime/src/launcher/kotlin/konan/start.kt @@ -3,16 +3,19 @@ import konan.internal.ExportForCppRuntime external fun main(args: Array) @ExportForCppRuntime -private fun Konan_start(args: Array) { +private fun Konan_start(args: Array): Int { try { // This is kotlin program main entry point main(args) + // Successfully finished: + return 0 + } catch (e: Throwable) { // TODO: may be add some more info. print("Uncaught exception from Kotlin's main: ") e.printStackTrace() - // TODO: should exit with non-zero code. + return 1 } }