rustpp_main: Fix exitcode semantics
This commit is contained in:
+17
-10
@@ -11,20 +11,22 @@
|
||||
|
||||
type Cstr = char *;
|
||||
|
||||
/** The main function: does main things */
|
||||
fn rustpp__main () -> i32;
|
||||
|
||||
mod termination {
|
||||
class Termination {
|
||||
struct ExitCode {
|
||||
int code;
|
||||
fn return_value () -> int {
|
||||
return 0;
|
||||
return code;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/** The main function: does main things */
|
||||
fn rustpp__main () -> termination::ExitCode;
|
||||
|
||||
mod option {
|
||||
template <typename T>
|
||||
class Option: termination::Termination {
|
||||
class Option {
|
||||
union {
|
||||
u8 None = 0;
|
||||
T Some;
|
||||
@@ -37,6 +39,10 @@ mod option {
|
||||
public:
|
||||
makeSelf (Option<T>);
|
||||
|
||||
operator termination::ExitCode () {
|
||||
return { (int) variant };
|
||||
}
|
||||
|
||||
static fn Some (T value) -> Self {
|
||||
Self op;
|
||||
op.value.Some = value;
|
||||
@@ -51,10 +57,6 @@ mod option {
|
||||
return op;
|
||||
}
|
||||
|
||||
fn return_value () -> int {
|
||||
return self.is_some ();
|
||||
}
|
||||
|
||||
fn is_some () -> bool {
|
||||
return variant == variant::Some;
|
||||
}
|
||||
@@ -117,6 +119,10 @@ mod result {
|
||||
public:
|
||||
makeSelf (Result<T, E>);
|
||||
|
||||
operator termination::ExitCode () {
|
||||
return { (int) variant };
|
||||
}
|
||||
|
||||
// TODO: destructor for Result
|
||||
|
||||
static fn Ok (T value) -> Self {
|
||||
@@ -372,7 +378,8 @@ mod env {
|
||||
mod prelude {
|
||||
use slice::Slice;
|
||||
use option::Option, option::Some, option::None;
|
||||
use result::Result;
|
||||
use result::Result, result::Err, result::Ok;
|
||||
use termination::ExitCode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@
|
||||
// rust.hh changes language semantics, so must be included last!
|
||||
#include "rust.hh"
|
||||
|
||||
fn main () -> i32 {
|
||||
fn main () -> ExitCode {
|
||||
let v = vec::Vec<i32>::new ();
|
||||
|
||||
v.push (10);
|
||||
@@ -21,5 +21,5 @@ fn main () -> i32 {
|
||||
std::println ("{}", x);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return Err<int, const char *> ("Oops!");
|
||||
}
|
||||
|
||||
+4
-1
@@ -11,12 +11,15 @@ namespace {
|
||||
}
|
||||
|
||||
fn main (int argc, char **argv) -> int {
|
||||
int exitcode = 0;
|
||||
program_args = { (Cstr *) argv, (usize) argc };
|
||||
try {
|
||||
return rustpp__main ();
|
||||
exitcode = rustpp__main ().return_value ();
|
||||
} catch (panic::Panic p) {
|
||||
std::println ("Thread exited with explicit panic: {}", p.what ());
|
||||
exitcode = -1;
|
||||
}
|
||||
return exitcode;
|
||||
}
|
||||
|
||||
// Environment
|
||||
|
||||
Reference in New Issue
Block a user