diff --git a/src/libcore/rt/mod.rs b/src/libcore/rt/mod.rs index a7b3fb1355c70..0f2a6cd7ef9ef 100644 --- a/src/libcore/rt/mod.rs +++ b/src/libcore/rt/mod.rs @@ -48,6 +48,7 @@ mod context; mod thread; pub mod env; +#[cfg(stage0)] pub fn start(main: *u8, _argc: int, _argv: *c_char, _crate_map: *u8) -> int { use self::sched::{Scheduler, Task}; use self::uvio::UvEventLoop; @@ -67,3 +68,22 @@ pub fn start(main: *u8, _argc: int, _argv: *c_char, _crate_map: *u8) -> int { } } +#[cfg(not(stage0))] +pub fn start(main: *u8, _argc: int, _argv: **c_char, _crate_map: *u8) -> int { + use self::sched::{Scheduler, Task}; + use self::uvio::UvEventLoop; + + let loop_ = ~UvEventLoop::new(); + let mut sched = ~Scheduler::new(loop_); + let main_task = ~do Task::new(&mut sched.stack_pool) { + // XXX: Can't call a C function pointer from Rust yet + unsafe { rust_call_nullary_fn(main) }; + }; + sched.task_queue.push_back(main_task); + sched.run(); + return 0; + + extern { + fn rust_call_nullary_fn(f: *u8); + } +} diff --git a/src/libcore/unstable/lang.rs b/src/libcore/unstable/lang.rs index ff96029bc0e31..dad990c0f97cf 100644 --- a/src/libcore/unstable/lang.rs +++ b/src/libcore/unstable/lang.rs @@ -127,16 +127,17 @@ pub unsafe fn strdup_uniq(ptr: *c_uchar, len: uint) -> ~str { } #[lang="start"] +#[cfg(stage0)] pub fn start(main: *u8, argc: int, argv: *c_char, crate_map: *u8) -> int { use libc::getenv; use rt::start; unsafe { - let use_new_rt = do str::as_c_str("RUST_NEWRT") |s| { + let use_old_rt = do str::as_c_str("RUST_NEWRT") |s| { getenv(s).is_null() }; - if use_new_rt { + if use_old_rt { return rust_start(main as *c_void, argc as c_int, argv, crate_map as *c_void) as int; } else { @@ -150,6 +151,31 @@ pub fn start(main: *u8, argc: int, argv: *c_char, } } +#[lang="start"] +#[cfg(not(stage0))] +pub fn start(main: *u8, argc: int, argv: **c_char, + crate_map: *u8) -> int { + use libc::getenv; + use rt::start; + + unsafe { + let use_old_rt = do str::as_c_str("RUST_NEWRT") |s| { + getenv(s).is_null() + }; + if use_old_rt { + return rust_start(main as *c_void, argc as c_int, argv, + crate_map as *c_void) as int; + } else { + return start(main, argc, argv, crate_map); + } + } + + extern { + fn rust_start(main: *c_void, argc: c_int, argv: **c_char, + crate_map: *c_void) -> c_int; + } +} + // Local Variables: // mode: rust; // fill-column: 78; diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 0947dfa93fee2..15238f168944d 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2247,7 +2247,7 @@ pub fn create_main_wrapper(ccx: @CrateContext, fn main_name() -> ~str { return ~"WinMain@16"; } #[cfg(unix)] fn main_name() -> ~str { return ~"main"; } - let llfty = T_fn(~[ccx.int_type, T_ptr(T_i8())], ccx.int_type); + let llfty = T_fn(~[ccx.int_type, T_ptr(T_ptr(T_i8()))], ccx.int_type); // FIXME #4404 android JNI hacks let llfn = if *ccx.sess.building_library {