提交 365f1748 编写于 作者: G Graydon Hoare

Attempt to fix os::args errors on various platforms.

上级 72b7a770
......@@ -32,6 +32,8 @@
// FIXME: move these to str perhaps? #2620
extern mod rustrt {
fn rust_get_argc() -> c_int;
fn rust_get_argv() -> **c_char;
fn rust_getcwd() -> ~str;
fn rust_path_is_dir(path: *libc::c_char) -> c_int;
fn rust_path_exists(path: *libc::c_char) -> c_int;
......@@ -732,6 +734,14 @@ pub fn set_exit_status(code: int) {
rustrt::rust_set_exit_status(code as libc::intptr_t);
}
unsafe fn load_argc_and_argv(argc: c_int, argv: **c_char) -> ~[~str] {
let mut args = ~[];
for uint::range(0, argc as uint) |i| {
vec::push(&mut args, str::raw::from_c_str(*argv.offset(i)));
}
return args;
}
/**
* Returns the command line arguments
*
......@@ -740,23 +750,20 @@ pub fn set_exit_status(code: int) {
#[cfg(target_os = "macos")]
fn real_args() -> ~[~str] {
unsafe {
let (argc, argv) = (*_NSGetArgc() as uint, *_NSGetArgv());
let mut args = ~[];
for uint::range(0, argc) |i| {
vec::push(&mut args, str::raw::from_c_str(*argv.offset(i)));
}
return args;
let (argc, argv) = (*_NSGetArgc() as c_int,
*_NSGetArgv() as **c_char);
load_argc_and_argv(argc, argv)
}
}
#[cfg(target_os = "linux")]
fn real_args() -> ~[~str] {
fail // Needs implementing.
}
#[cfg(target_os = "freebsd")]
fn real_args() -> ~[~str] {
fail // Needs implementing.
unsafe {
let argc = rustrt::rust_get_argc();
let argv = rustrt::rust_get_argv();
load_argc_and_argv(argc, argv)
}
}
#[cfg(windows)]
......@@ -775,7 +782,8 @@ fn real_args() -> ~[~str] {
while *ptr.offset(len) != 0 { len += 1; }
// Push it onto the list.
vec::push(&mut args, vec::raw::form_slice(ptr, len,
vec::push(&mut args,
vec::raw::buf_as_slice(ptr, len,
str::from_utf16));
}
}
......
......@@ -86,7 +86,7 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
// Load runtime configuration options from the environment.
// FIXME #1497: Should provide a way to get these from the command
// line as well.
rust_env *env = load_env();
rust_env *env = load_env(argc, argv);
global_crate_map = crate_map;
......
......@@ -588,6 +588,18 @@ rust_num_threads() {
return task->kernel->env->num_sched_threads;
}
extern "C" CDECL int
rust_get_argc() {
rust_task *task = rust_get_current_task();
return task->kernel->env->argc;
}
extern "C" CDECL char**
rust_get_argv() {
rust_task *task = rust_get_current_task();
return task->kernel->env->argv;
}
extern "C" CDECL rust_sched_id
rust_new_sched(uintptr_t threads) {
rust_task *task = rust_get_current_task();
......
......@@ -107,7 +107,7 @@ copyenv(const char* name) {
}
rust_env*
load_env() {
load_env(int argc, char **argv) {
rust_env *env = (rust_env*)malloc(sizeof(rust_env));
env->num_sched_threads = (size_t)get_num_threads();
......@@ -118,7 +118,8 @@ load_env() {
env->detailed_leaks = getenv(DETAILED_LEAKS) != NULL;
env->rust_seed = copyenv(RUST_SEED);
env->poison_on_free = getenv(RUST_POISON_ON_FREE) != NULL;
env->argc = argc;
env->argv = argv;
return env;
}
......
......@@ -13,9 +13,11 @@ struct rust_env {
bool detailed_leaks;
char* rust_seed;
bool poison_on_free;
int argc;
char **argv;
};
rust_env* load_env();
rust_env* load_env(int argc, char **argv);
void free_env(rust_env *rust_env);
#endif
......@@ -31,6 +31,8 @@ rand_new_seeded2
rand_next
rand_seed
rust_get_sched_id
rust_get_argc
rust_get_argv
rust_new_sched
rust_new_task_in_sched
rust_num_threads
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册