about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/rt/mod.rs20
-rw-r--r--src/libcore/unstable/lang.rs26
-rw-r--r--src/librustc/middle/trans/base.rs2
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 {