mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-17 19:01:20 +00:00
Fix main argument handling
This commit is contained in:
@ -165,9 +165,7 @@ pub fn run_emscripten_instance(
|
||||
let num_params = main_func.signature().params.len();
|
||||
let result = match num_params {
|
||||
2 => {
|
||||
let (argc, argv) = (5, 217920); // TODO Fix
|
||||
// TODO store_module_arguments, cannot borrow `*ctx` as mutable more than once at a time
|
||||
// store_module_arguments(path, args, instance.ctx());
|
||||
let (argc, argv) = store_module_arguments(path, args, instance.ctx());
|
||||
instance.call("_main", &[Value::I32(argc as i32), Value::I32(argv as i32)])?;
|
||||
}
|
||||
0 => {
|
||||
@ -184,23 +182,25 @@ pub fn run_emscripten_instance(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
//fn store_module_arguments(path: &str, args: Vec<&str>, ctx: &mut Ctx) -> (u32, u32) {
|
||||
// let argc = args.len() + 1;
|
||||
//
|
||||
// let (argv_offset, argv_slice): (_, &mut [u32]) =
|
||||
// unsafe { allocate_on_stack(((argc + 1) * 4) as u32, ctx) };
|
||||
// assert!(!argv_slice.is_empty());
|
||||
//
|
||||
// argv_slice[0] = unsafe { allocate_cstr_on_stack(path, ctx).0 };
|
||||
//
|
||||
// for (slot, arg) in argv_slice[1..argc].iter_mut().zip(args.iter()) {
|
||||
// *slot = unsafe { allocate_cstr_on_stack(&arg, ctx).0 };
|
||||
// }
|
||||
//
|
||||
// argv_slice[argc] = 0;
|
||||
//
|
||||
// (argc as u32, argv_offset)
|
||||
//}
|
||||
fn store_module_arguments(path: &str, args: Vec<&str>, ctx: &mut Ctx) -> (u32, u32) {
|
||||
let argc = args.len() + 1;
|
||||
|
||||
let mut args_slice = vec![0; argc];
|
||||
args_slice[0] = unsafe { allocate_cstr_on_stack(path, ctx).0 };
|
||||
for (slot, arg) in args_slice[1..argc].iter_mut().zip(args.iter()) {
|
||||
*slot = unsafe { allocate_cstr_on_stack(&arg, ctx).0 };
|
||||
}
|
||||
|
||||
let (argv_offset, argv_slice): (_, &mut [u32]) =
|
||||
unsafe { allocate_on_stack(((argc + 1) * 4) as u32, ctx) };
|
||||
assert!(!argv_slice.is_empty());
|
||||
for (slot, arg) in argv_slice[0..argc].iter_mut().zip(args_slice.iter()) {
|
||||
*slot = *arg
|
||||
}
|
||||
argv_slice[argc] = 0;
|
||||
|
||||
(argc as u32, argv_offset)
|
||||
}
|
||||
|
||||
/// Passes arguments from the host to the WebAssembly instance.
|
||||
fn get_main_args(
|
||||
|
Reference in New Issue
Block a user