Skip to content

Commit 365f174

Browse files
committed
Attempt to fix os::args errors on various platforms.
1 parent 72b7a77 commit 365f174

File tree

6 files changed

+42
-17
lines changed

6 files changed

+42
-17
lines changed

src/libcore/os.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ use task::TaskBuilder;
3232
// FIXME: move these to str perhaps? #2620
3333

3434
extern mod rustrt {
35+
fn rust_get_argc() -> c_int;
36+
fn rust_get_argv() -> **c_char;
3537
fn rust_getcwd() -> ~str;
3638
fn rust_path_is_dir(path: *libc::c_char) -> c_int;
3739
fn rust_path_exists(path: *libc::c_char) -> c_int;
@@ -732,6 +734,14 @@ pub fn set_exit_status(code: int) {
732734
rustrt::rust_set_exit_status(code as libc::intptr_t);
733735
}
734736

737+
unsafe fn load_argc_and_argv(argc: c_int, argv: **c_char) -> ~[~str] {
738+
let mut args = ~[];
739+
for uint::range(0, argc as uint) |i| {
740+
vec::push(&mut args, str::raw::from_c_str(*argv.offset(i)));
741+
}
742+
return args;
743+
}
744+
735745
/**
736746
* Returns the command line arguments
737747
*
@@ -740,23 +750,20 @@ pub fn set_exit_status(code: int) {
740750
#[cfg(target_os = "macos")]
741751
fn real_args() -> ~[~str] {
742752
unsafe {
743-
let (argc, argv) = (*_NSGetArgc() as uint, *_NSGetArgv());
744-
let mut args = ~[];
745-
for uint::range(0, argc) |i| {
746-
vec::push(&mut args, str::raw::from_c_str(*argv.offset(i)));
747-
}
748-
return args;
753+
let (argc, argv) = (*_NSGetArgc() as c_int,
754+
*_NSGetArgv() as **c_char);
755+
load_argc_and_argv(argc, argv)
749756
}
750757
}
751758

752759
#[cfg(target_os = "linux")]
753-
fn real_args() -> ~[~str] {
754-
fail // Needs implementing.
755-
}
756-
757760
#[cfg(target_os = "freebsd")]
758761
fn real_args() -> ~[~str] {
759-
fail // Needs implementing.
762+
unsafe {
763+
let argc = rustrt::rust_get_argc();
764+
let argv = rustrt::rust_get_argv();
765+
load_argc_and_argv(argc, argv)
766+
}
760767
}
761768

762769
#[cfg(windows)]
@@ -775,8 +782,9 @@ fn real_args() -> ~[~str] {
775782
while *ptr.offset(len) != 0 { len += 1; }
776783

777784
// Push it onto the list.
778-
vec::push(&mut args, vec::raw::form_slice(ptr, len,
779-
str::from_utf16));
785+
vec::push(&mut args,
786+
vec::raw::buf_as_slice(ptr, len,
787+
str::from_utf16));
780788
}
781789
}
782790

src/rt/rust.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
8686
// Load runtime configuration options from the environment.
8787
// FIXME #1497: Should provide a way to get these from the command
8888
// line as well.
89-
rust_env *env = load_env();
89+
rust_env *env = load_env(argc, argv);
9090

9191
global_crate_map = crate_map;
9292

src/rt/rust_builtin.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,18 @@ rust_num_threads() {
588588
return task->kernel->env->num_sched_threads;
589589
}
590590

591+
extern "C" CDECL int
592+
rust_get_argc() {
593+
rust_task *task = rust_get_current_task();
594+
return task->kernel->env->argc;
595+
}
596+
597+
extern "C" CDECL char**
598+
rust_get_argv() {
599+
rust_task *task = rust_get_current_task();
600+
return task->kernel->env->argv;
601+
}
602+
591603
extern "C" CDECL rust_sched_id
592604
rust_new_sched(uintptr_t threads) {
593605
rust_task *task = rust_get_current_task();

src/rt/rust_env.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ copyenv(const char* name) {
107107
}
108108

109109
rust_env*
110-
load_env() {
110+
load_env(int argc, char **argv) {
111111
rust_env *env = (rust_env*)malloc(sizeof(rust_env));
112112

113113
env->num_sched_threads = (size_t)get_num_threads();
@@ -118,7 +118,8 @@ load_env() {
118118
env->detailed_leaks = getenv(DETAILED_LEAKS) != NULL;
119119
env->rust_seed = copyenv(RUST_SEED);
120120
env->poison_on_free = getenv(RUST_POISON_ON_FREE) != NULL;
121-
121+
env->argc = argc;
122+
env->argv = argv;
122123
return env;
123124
}
124125

src/rt/rust_env.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ struct rust_env {
1313
bool detailed_leaks;
1414
char* rust_seed;
1515
bool poison_on_free;
16+
int argc;
17+
char **argv;
1618
};
1719

18-
rust_env* load_env();
20+
rust_env* load_env(int argc, char **argv);
1921
void free_env(rust_env *rust_env);
2022

2123
#endif

src/rt/rustrt.def.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ rand_new_seeded2
3131
rand_next
3232
rand_seed
3333
rust_get_sched_id
34+
rust_get_argc
35+
rust_get_argv
3436
rust_new_sched
3537
rust_new_task_in_sched
3638
rust_num_threads

0 commit comments

Comments
 (0)