From 982db0281cf6ac3f9c52dbb4238b9ed3f06a01df Mon Sep 17 00:00:00 2001 From: Syrus Date: Sat, 15 Dec 2018 22:43:10 -0800 Subject: [PATCH] Added support for 0 or 2 params in main emscripten function --- emtests/printf.c | 2 +- emtests/printf.wasm | Bin 46714 -> 46706 bytes rustfmt.toml | 1 + src/webassembly/mod.rs | 26 +++++++++++++++++++++----- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/emtests/printf.c b/emtests/printf.c index 3f2ad8b71..55abc0ad5 100644 --- a/emtests/printf.c +++ b/emtests/printf.c @@ -8,7 +8,7 @@ #include #include -int main( int argc, char * argv [] ) { +int main() { int x; printf("ab%gc%nd\n", 1.23f, &x); printf("n=%d\n", x); diff --git a/emtests/printf.wasm b/emtests/printf.wasm index 0d4197a24a39c24322e8b7a0bf5e4adfb76a4b39..bd5c1ebf4b04041778c8b30ee9b84665fa0e8a9a 100644 GIT binary patch delta 1000 zcmZ9KyK59-6vgMYkC}bVK9X!Unc4GYH`&c=ldz&#nJXzQM6~jMn99~_7A#b>5YkxM ziA_+_Xd`Q71Pif{AP5F5L?ei4B#qv?GdqN>&fat8ckaix-|4aO=h%3D-O!Ew8^!}& zf4%#~ycxdB=;y+gqxvm}o)|&fX*sRjHEWv(*UX_$_l!VQSqH2Y*1vk7T-HO@66;IW zBI{$;0_%WPxZhf!9M-R_HtPr0Eb9SlhIPoALfEHnpe&vds4`1EPCi)7(lQ-s z?6X>dn!*%?Z)B#=9?Fti^r|GeCHXX_>CvZ7H1n<*%v{c2;LVmCuZ}ud!v6AL37d-9 zl(4gyrMI^vzUw0;aVCy45;xF@;*g&C$Vi@z^Q`1^n2U0@dGkExlQbVF4_;jU-bYqo zJC1FEefTkK3*1CANf`zZ!#{o4q0mm8J3=d{n0AC-z(SHT-9js-cbjko&e6BgmF5I) zqn(TlFJdtn8D7FtGV%>}(4lYy)3Ax0lofWKe!tTDr|fO{hYNCmF1iyYqsv&HF!|lA zVCAeyKbj~=X>sfhrL-uet5}W9P}#A|t!r4D_>^1Mv3}O1`#@1zOJjF*)RMIJ&>Neh z(vrNB4Q!0f_)9L`#Aak(jrP+Epd_s>rR2T2a+zD$B1fLk5#UN#p;O3w0#szK(&+Kt OQK-t;-`BIZ_x=M2{o6eN delta 1004 zcmZ9KyKmEA6vb^PX&mSMPSZL$U!6ATD}6U&A{TXFs1Qv24<0K114m*21OrkQMmEG! zfx5sJ7RbN=45&gvqKE-Ok$^6!3*4JH5z6%QJ;&!<>+|>f)Hpvio?JEb;L$bXuCBlA zehggq-iGyE&#_d?vFM@U)-1FqHi@LJSxmB}+)m1mS(m13k^Wuc|Q{CJNShe%Tf zG!=lZf(Y+vn%2o3o?W~U&=4lmRV9=V+BG!l+X$!HWrP}rrlw$FO4N5YELQ2*MoQc~ zooK8hzfVC|O=Fr~$V?w>@v!9|9yQp^R5}pT#B`LvniiBi&+Xv_J`g5 z70P-xYgQ61VW^C|#iH|8n@<%eHa5R-7+ zx8o9?!yI{o-K=xkfit!_T|>=Jf3F}e>4a}5Bt4ILe|18_3s@Mt9Im78hr3lIB%Gu# zgELG@xPiuS^jPQgA{NIsrtX?COzJ~b<) zo7fzQ-e6T$ZpIe2MymfRw{By5B+8rg6v#?zj^z3>_%L^{Lzdj26CfvMfzBcG8Bmb9 bNQ2vYQ=uqht7egwjD9}Q`{q&5JUILZQDon` diff --git a/rustfmt.toml b/rustfmt.toml index dc26521c0..4a3e0232a 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,3 +1,4 @@ ignore = [ "src/spectests", + "src/emtests", ] diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index 5c679ba48..d91ac003f 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -11,6 +11,7 @@ use cranelift_codegen::{ isa, settings::{self, Configurable}, }; +use cranelift_wasm::ModuleEnvironment; use std::panic; use std::str::FromStr; use target_lexicon; @@ -226,11 +227,26 @@ pub fn start_instance( _ => panic!("_main emscripten function not found"), }; - let main: extern "C" fn(u32, u32, &Instance) = get_instance_function!(instance, func_index); - - let (argc, argv) = store_module_arguments(path, args, instance); - - call_protected!(main(argc, argv, &instance)).map_err(|err| format!("{}", err)) + let sig_index = module.get_func_type(func_index); + let signature = module.get_signature(sig_index); + let num_params = signature.params.len(); + match num_params { + 2 => { + let main: extern "C" fn(u32, u32, &Instance) = + get_instance_function!(instance, func_index); + let (argc, argv) = store_module_arguments(path, args, instance); + call_protected!(main(argc, argv, &instance)) + } + 0 => { + let main: extern "C" fn(&Instance) = get_instance_function!(instance, func_index); + call_protected!(main(&instance)) + } + _ => panic!( + "The emscripten main function has received an incorrect number of params {}", + num_params + ), + } + .map_err(|err| format!("{}", err)) // TODO: We should implement emscripten __ATEXIT__ } else { let func_index =