diff options
| -rw-r--r-- | src/libcore/rt/mod.rs | 20 | ||||
| -rw-r--r-- | src/libcore/unstable/lang.rs | 26 | ||||
| -rw-r--r-- | src/librustc/middle/trans/base.rs | 2 |
3 files changed, 47 insertions, 1 deletions
diff --git a/src/libcore/rt/mod.rs b/src/libcore/rt/mod.rs index a7b3fb1355c..0f2a6cd7ef9 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 ff96029bc0e..3bb723abae6 100644 --- a/src/libcore/unstable/lang.rs +++ b/src/libcore/unstable/lang.rs @@ -127,6 +127,7 @@ 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; @@ -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_new_rt = do str::as_c_str("RUST_NEWRT") |s| { + getenv(s).is_null() + }; + if use_new_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 0947dfa93fe..15238f16894 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 { |
