@@ -127,6 +127,7 @@ pub struct EmscriptenData<'a> {
127127 pub dyn_call_viijiii : Option < Func < ' a , ( i32 , i32 , i32 , i32 , i32 , i32 , i32 , i32 ) > > ,
128128 pub dyn_call_viijj : Option < Func < ' a , ( i32 , i32 , i32 , i32 , i32 , i32 , i32 ) > > ,
129129 pub dyn_call_vj : Option < Func < ' a , ( i32 , i32 , i32 ) > > ,
130+ pub dyn_call_vjji : Option < Func < ' a , ( i32 , i32 , i32 , i32 , i32 , i32 ) > > ,
130131 pub dyn_call_vij : Option < Func < ' a , ( i32 , i32 , i32 , i32 ) > > ,
131132 pub dyn_call_viji : Option < Func < ' a , ( i32 , i32 , i32 , i32 , i32 ) > > ,
132133 pub dyn_call_vijiii : Option < Func < ' a , ( i32 , i32 , i32 , i32 , i32 , i32 , i32 ) > > ,
@@ -146,11 +147,7 @@ impl<'a> EmscriptenData<'a> {
146147 pub fn new ( instance : & ' a mut Instance ) -> EmscriptenData < ' a > {
147148 let malloc = instance. func ( "_malloc" ) . unwrap ( ) ;
148149 let free = instance. func ( "_free" ) . unwrap ( ) ;
149- let memalign = if let Ok ( func) = instance. func ( "_memalign" ) {
150- Some ( func)
151- } else {
152- None
153- } ;
150+ let memalign = instance. func ( "_memalign" ) . ok ( ) ;
154151 let memset = instance. func ( "_memset" ) . unwrap ( ) ;
155152 let stack_alloc = instance. func ( "stackAlloc" ) . unwrap ( ) ;
156153
@@ -198,6 +195,7 @@ impl<'a> EmscriptenData<'a> {
198195 let dyn_call_viijiii = instance. func ( "dynCall_viijiii" ) . ok ( ) ;
199196 let dyn_call_viijj = instance. func ( "dynCall_viijj" ) . ok ( ) ;
200197 let dyn_call_vj = instance. func ( "dynCall_vj" ) . ok ( ) ;
198+ let dyn_call_vjji = instance. func ( "dynCall_vjji" ) . ok ( ) ;
201199 let dyn_call_vij = instance. func ( "dynCall_vij" ) . ok ( ) ;
202200 let dyn_call_viji = instance. func ( "dynCall_viji" ) . ok ( ) ;
203201 let dyn_call_vijiii = instance. func ( "dynCall_vijiii" ) . ok ( ) ;
@@ -261,6 +259,7 @@ impl<'a> EmscriptenData<'a> {
261259 dyn_call_viijiii,
262260 dyn_call_viijj,
263261 dyn_call_vj,
262+ dyn_call_vjji,
264263 dyn_call_vij,
265264 dyn_call_viji,
266265 dyn_call_vijiii,
@@ -282,6 +281,7 @@ pub fn run_emscripten_instance(
282281 instance : & mut Instance ,
283282 path : & str ,
284283 args : Vec < & str > ,
284+ entrypoint : Option < String > ,
285285) -> CallResult < ( ) > {
286286 let mut data = EmscriptenData :: new ( instance) ;
287287 let data_ptr = & mut data as * mut _ as * mut c_void ;
@@ -299,45 +299,54 @@ pub fn run_emscripten_instance(
299299
300300 // println!("running emscripten instance");
301301
302- let main_func = instance. dyn_func ( "_main" ) ?;
303- let num_params = main_func. signature ( ) . params ( ) . len ( ) ;
304- let _result = match num_params {
305- 2 => {
306- let ( argc, argv) = store_module_arguments ( instance. context_mut ( ) , path, args) ;
307- instance. call ( "_main" , & [ Value :: I32 ( argc as i32 ) , Value :: I32 ( argv as i32 ) ] ) ?;
308- }
309- 0 => {
310- instance. call ( "_main" , & [ ] ) ?;
311- }
312- _ => panic ! (
313- "The emscripten main function has received an incorrect number of params {}" ,
314- num_params
315- ) ,
316- } ;
302+ if let Some ( ep) = entrypoint {
303+ debug ! ( "Running entry point: {}" , & ep) ;
304+ let ep_fn = instance. dyn_func ( & ep) ?;
305+ let arg = unsafe { allocate_cstr_on_stack ( instance. context_mut ( ) , args[ 0 ] ) . 0 } ;
306+ //let (argc, argv) = store_module_arguments(instance.context_mut(), args);
307+ instance. call ( & ep, & [ Value :: I32 ( arg as i32 ) ] ) ?;
308+ } else {
309+ let main_func = instance. dyn_func ( "_main" ) ?;
310+ let num_params = main_func. signature ( ) . params ( ) . len ( ) ;
311+ let _result = match num_params {
312+ 2 => {
313+ let mut new_args = vec ! [ path] ;
314+ new_args. extend ( args) ;
315+ let ( argc, argv) = store_module_arguments ( instance. context_mut ( ) , new_args) ;
316+ instance. call ( "_main" , & [ Value :: I32 ( argc as i32 ) , Value :: I32 ( argv as i32 ) ] ) ?;
317+ }
318+ 0 => {
319+ instance. call ( "_main" , & [ ] ) ?;
320+ }
321+ _ => panic ! (
322+ "The emscripten main function has received an incorrect number of params {}" ,
323+ num_params
324+ ) ,
325+ } ;
326+ }
317327
318328 // TODO atexit for emscripten
319329 // println!("{:?}", data);
320330 Ok ( ( ) )
321331}
322332
323- fn store_module_arguments ( ctx : & mut Ctx , path : & str , args : Vec < & str > ) -> ( u32 , u32 ) {
333+ fn store_module_arguments ( ctx : & mut Ctx , args : Vec < & str > ) -> ( u32 , u32 ) {
324334 let argc = args. len ( ) + 1 ;
325335
326336 let mut args_slice = vec ! [ 0 ; argc] ;
327- args_slice[ 0 ] = unsafe { allocate_cstr_on_stack ( ctx, path) . 0 } ;
328- for ( slot, arg) in args_slice[ 1 ..argc] . iter_mut ( ) . zip ( args. iter ( ) ) {
337+ for ( slot, arg) in args_slice[ 0 ..argc] . iter_mut ( ) . zip ( args. iter ( ) ) {
329338 * slot = unsafe { allocate_cstr_on_stack ( ctx, & arg) . 0 } ;
330339 }
331340
332341 let ( argv_offset, argv_slice) : ( _ , & mut [ u32 ] ) =
333- unsafe { allocate_on_stack ( ctx, ( ( argc + 1 ) * 4 ) as u32 ) } ;
342+ unsafe { allocate_on_stack ( ctx, ( ( argc) * 4 ) as u32 ) } ;
334343 assert ! ( !argv_slice. is_empty( ) ) ;
335344 for ( slot, arg) in argv_slice[ 0 ..argc] . iter_mut ( ) . zip ( args_slice. iter ( ) ) {
336345 * slot = * arg
337346 }
338347 argv_slice[ argc] = 0 ;
339348
340- ( argc as u32 , argv_offset)
349+ ( argc as u32 - 1 , argv_offset)
341350}
342351
343352pub fn emscripten_set_up_memory ( memory : & Memory , globals : & EmscriptenGlobalsData ) {
@@ -597,6 +606,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
597606 "___syscall272" => func!( crate :: syscalls:: ___syscall272) ,
598607 "___syscall295" => func!( crate :: syscalls:: ___syscall295) ,
599608 "___syscall300" => func!( crate :: syscalls:: ___syscall300) ,
609+ "___syscall320" => func!( crate :: syscalls:: ___syscall320) ,
600610 "___syscall324" => func!( crate :: syscalls:: ___syscall324) ,
601611 "___syscall330" => func!( crate :: syscalls:: ___syscall330) ,
602612 "___syscall334" => func!( crate :: syscalls:: ___syscall334) ,
@@ -718,6 +728,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
718728 "invoke_v" => func!( crate :: emscripten_target:: invoke_v) ,
719729 "invoke_vi" => func!( crate :: emscripten_target:: invoke_vi) ,
720730 "invoke_vj" => func!( crate :: emscripten_target:: invoke_vj) ,
731+ "invoke_vjji" => func!( crate :: emscripten_target:: invoke_vjji) ,
721732 "invoke_vii" => func!( crate :: emscripten_target:: invoke_vii) ,
722733 "invoke_viii" => func!( crate :: emscripten_target:: invoke_viii) ,
723734 "invoke_viiii" => func!( crate :: emscripten_target:: invoke_viiii) ,
0 commit comments