From 4d45c2dbcf61e3b68ce95aa085017b20d3d6e1fa Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 16 Jul 2022 16:00:31 +0800 Subject: [PATCH] feat: update wasmtime --- __wasm/wasmtime/examples/example2.rs | 57 ++++++++++++++++++++ __wasm/wasmtime/examples/hello_wasm_bg.wasm | Bin 0 -> 19876 bytes __wasm/wasmtime/justfile | 3 ++ __wasm/wasmtime/src/main.rs | 5 ++ 4 files changed, 65 insertions(+) create mode 100644 __wasm/wasmtime/examples/example2.rs create mode 100644 __wasm/wasmtime/examples/hello_wasm_bg.wasm diff --git a/__wasm/wasmtime/examples/example2.rs b/__wasm/wasmtime/examples/example2.rs new file mode 100644 index 0000000..33594a8 --- /dev/null +++ b/__wasm/wasmtime/examples/example2.rs @@ -0,0 +1,57 @@ +extern crate core; + +use anyhow::Result; +use wasmtime::*; + +// #[wasm_bindgen] +// extern { +// pub fn alert(s: &str); +// } +// +// #[wasm_bindgen] +// pub fn greet(name: &str) { +// alert(&format!("Hello, {}!", name)); +// } +fn main() -> Result<()> { + // Modules can be compiled through either the text or binary format + let engine = Engine::default(); + let wasm = std::fs::read("./examples/hello_wasm_bg.wasm").unwrap(); + let module = Module::new(&engine, wasm)?; + + let mut linker = Linker::new(&engine); + linker.func_wrap("./hello_wasm.js", "__wbg_alert_a5a2f68cc09adc6e", |caller: Caller<'_, u32>, param: i32, param2: i32| { + let mut caller = caller; + if let Extern::Memory(memory) = caller.get_export("memory").unwrap() { + let mut buffer = vec![0; param2 as usize]; + memory.read(caller.as_context(), param as usize, &mut buffer).expect("read mem error"); + let s = String::from_utf8_lossy(&buffer).to_string(); + println!("[alert]: {}", s); + } else { + panic!("Should happen, got non memory"); + } + })?; + + // All wasm objects operate within the context of a "store". Each + // `Store` has a type parameter to store host-specific data, which in + // this case we're using `4` for. + let mut store = Store::new(&engine, 0); + let instance = linker.instantiate(&mut store, &module)?; + + let memory = instance.get_memory(&mut store, "memory") + .ok_or_else(|| anyhow::format_err!("failed to find `memory` export"))?; + + let msg = "hatter".as_bytes(); + + let malloc = instance.get_typed_func::(&mut store, "__wbindgen_malloc")?; + let p = malloc.call(&mut store, msg.len() as i32)?; + + memory.write(&mut store, p as usize, msg)?; + + let hello = instance.get_typed_func::<(i32, i32), (), _>(&mut store, "greet")?; + + // And finally we can call the wasm! + hello.call(&mut store, (p, msg.len() as i32))?; + + Ok(()) +} + diff --git a/__wasm/wasmtime/examples/hello_wasm_bg.wasm b/__wasm/wasmtime/examples/hello_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1a65048a5a097d6c609733398d317ca0a2819705 GIT binary patch literal 19876 zcmeI4TZ~-yec#VzW_NaHmmJBmO^LE~W=zXuERu7-nUQ&DkrFK_G7`rr(1+!jnKNAO zE_b=JyQEax;<~xWtzY!u2N!TqKLm&$0wh5az(7@i1&lUr6TcK_3$zbLW3)jZ3O@v` zA6l@V@9%$Rca|4RYW+|k6}3G7bI$+ryL^9_|L=deUb1u3_dL)4xBL71-mz<*fA^Yy z*Si+n<*)GW-Mie=wx|5%xrg4h9IvvcZ@U}sT3*jI>}`8BXSZ|;{z!BC$IqQ#O*b~S zR_?IoxwV~VS61!}uCF8;>11~$X(jb>yE`0Kd&y|nPQ4)fOO1Lh7ly%dI3EVN`5;&d z76bnC=jIE!oL>m?A^-V7uITeuKF`D4JU>AY&iixuxw(8k?=38FS)haO=YHD=x#d6e zO#U~m={+&`53F(5kN5ZQdBypEqTAfu&GhEh14^zf^s-Tz{s~eC_4MKm2dv z?XR8=3U~dtgNwhYKan5*jsNPh7kQ@xuM)&19u(K&H@9`Yda@G6;q6K;er~&xzg_X; zaQpJIA9=jIyA%7{QEp8=cGoI%acNC6_;F#aoQwR^L7|e5=D4fOU0Dty+U;P;9z^+e z;4Ov4*i*;&FYbT!)#XpwvW$LnyBvy^TxI_9@&a87!A0H`Sp4#`7e7}nL}7gY{{4B; z9LCQ_{`HE#4t=*FCw?xX?e9*?1!j-Jbr$fVLLBU_#qS1=zRSyV%$jGc7eCEA|F%Zc zc<#!{-Ll>VA<`8GIjE^DMB!DI;<8RV_lDY{yBtId%vFTAr)=g0cwC5lSp3B8IJdnv z70Amc_2MK;&OusvF7lVXVwAtUoR9Kle`&rL8N=^}uP+xOm<%M|D8Cycv|S{^-TGuZ zYizHgj3e?sD(JD*|9M#vhE106+4!Ad}e=o#7QG1lXda@n-o?#G9z~usL zejiNCmwhLFuL5WVh=sK%xU!6d1v+57^bvteWSdRXgci7rd9%jCK& z@KAk`{dYpdXZ+=l8?eR2djJ(DO3wf=(=&b#bp=eT_WkGD!9DTMgYSpftIxwfog&hU z|A4*)`hp3jFw~(^MC5dx#|>&_$xld&_k)*Za?WH5@!v7@dE9?DTNDcYOdZl~d|KYf z1FQS6^@DH;MgiIqCMzc?vU8;(af5OB*O4OVk}!RY15p&#w6@J&F>fY=IIc*BT;I%y zG-4`13so|LmWYk=>t?-20UJC_5#HXDftx16a!&9yO_)NY0z{rE1Wg3YecU`DZtTFj zdZnQ`%utDeg<8o2vF+; zsEFbhV_iIpW*L?RpeT_0dQWi2SQnysg@xcEAf1zr7p@>FT7}A-z=%s@CSCM!$%H2S zBNy&-2BI8OP5p-~nZ65Au#TRTnFzfVxU;DV)$$Emg}>w>G3o8te;MPoDWrJ|F;dJ$^JfCDyoiGo)Rp~i_rWdnhOk+Oc&y3 z5gwZG<9R1znQBGZW|1lLS736%#1_9zW+Eft={jcXe6+bYPui4ZOp*s!oSV8%Un)@I zibl_Va>@c%V2%{hBZkH%y#{<5;p}c6rszKdbtZeOkPwXu9!YZIbKJhbT?ZS zD@WaoEJ=W+!=cZgLMV%D<{>mt)8=F!bDfY)Lqv`h;YZ~GX`XPG5-(6))m=_I&JA!(R?r@Vc!)gNc5opBV)Z3U_sQO) zg;!5j7Tt!ZAcgW5ddAkD2t5**0$uUvVceAy5$$CnMqFJhFU24*xG3Ae&Z4!mp4aza z&y0?lghbugQs5D~gBjZ9;}b@M7yB4da1qdumkC{=oXb3hCz?$eA=bzW=Cdl2Ah)OV zTDvmE+bnPj5g&hf+0q>$$b9Z}Dh3vLR$==SL`$@^6uUk;+9;&ULmMSOt*l=j`apx08GLfbw<7n1Wjk81JZ=v^2la=BIj9RwD<;!%*S72z9?^M zu}lpx&ZGSDJigLjGgDw@!;+gzTMC{Sd>o9GedUYA_-DU^DglgC8UN4Uy62TnqSK?M zfm@rJgw+19N%+nr$ZSDmS)@Y@?!G*SC5TSPO#YA=9CidVvJzuPawH{JY=R4ApYW71 zBm7O-kmH^*;DJUty*cgRw6gl)_YJ|CFyb$9Ze}qZWeLZ;Q0$epN5>nj;fv;r|9akE zx+}bw%Hg3+PFs3WAPq2GhX{{A6WXp*dr!rQeJh-7V8l+St3EZO|weMe1QW`qJ zEXH@&DvM-4rahy9BE>pHyO1(R7C$qknjdajmJZgVIhKquz_VVJ1fKwT#mab=7ljHG z0W%jQk4KA*efUCIAxAJGi}Tkgk|A$ew@Dx3yU5DJL}A#&dEiDQ_42&Mvrq~q)sQ4D z17FMxOa_B{LR3TuZS|dzL#nW^i7M80s>O;%XQ9-O^s0>f1RlL&faI&{E z%fz0myF3CNyaJgUAH}?v4#R2Ycvj6Q)@7cbx{t#E0Gj6Vww1ROS;5l)AjHpBo_x30RNNHGw0&|Q zyBErX!R$SlQ>r*4vfzV>OkM{!>PjennH&N`0ZKgOvZU4A1@#vWnT+pcd(2|-M|1w% zU9qKNxfg%d0)?3ihY&u7dy@FTW^D~0hjma?qh;@jwP%UtHg=8@y?I+DT#zn5PMn4| z+*(lf&5!#J_;JioB0Kcsq!HTiuIs$PpE?95@(2GG1r!e*ww=GHXeE_V<=DpjxLa2; z%* zxm2wRcQChn>Xa^aE(nA@&|^sB_`*n&IB9ANAkRh6(8Zz%ndDtt?J#_x8-Kss}tV zJBwOKKFZk7Wd_XrTxJN0!K0W7#f%D*0K_l;H18MgqO$N1u~88J<^8WJ8!6Fr$AMh0 z>MTV;vZ7oaYvZsE*E{_KkcCx`E`-wpX%sT15GGwBe|c>=dw znANi^Lb;;61uxqlPG=)rIM&gbTx3x4E996$v5!+Ufh$1AxmYKl;r2;tBO>V4lO^H+ zBm5Gf&5l&EioXOn<<-*Y?P&gxPgb)!cvi6j0D(YYF7t6hadMDmsY+SQvr1N0N|IIT z{Kslq?o`P7n7ke;PXU&LWCeM1;-mT*dpe+XL?I6ldZ4z4Iv&wnMx(=R+`E!EyWWfS&GNL*OAPn zP@xm`v1y8jA`5mttrX8G8JHaqM$6SW4pTfU(s`M6uoZ=J<$5ziOmL7=lo7e(LZ!Gi zMk$kxp)orqTSg|^$}&oo z%yR*QSVaUK(m8A>gDhvM5{s3LF$_qD>rAZ-$8s8FIF{PbNf{1AAl~BN1Z+T@_m$7Z zcj^m_5`{&7UB`5yPtT6H;Yx0eEh8Sn?L2X}Qy|lq42?~PIpRRRTKlESJc`G>IMZUf zb*ujCfR(J2n6&QJQ*}GgdH(zq_Kc7@9GIhgQC`zydzs&0Q^UsQsLlG>C?r6R=)9(s z7P`|HkcOktRC(03&o0=d}4_gVRjnb^)L z(B-K?P+&rbF16G&n#h%S%!QM{*|T})=0uy7gy!W*=c0M}{Maw&nFDc(%6Z9)vn-u~ z-F=Oy>7Ft#l@Jo5*e{)DWhIY(siiHo8x7cG8Q{eoFk$APj602Q2TyT5VYNvxWv4qK z7}XFt6V~NdDgcP!qAx{HUjYBkscXGs2rfjBmgUS!O^}&df1^p7VrC$zPBvq;om7JA%_`=T|mAzNsjZ~O-MFD_uI(T*peRs@n z#A0nRzLQxX{$!Tos=AMtHXbkoeXXWg2J9TGtZ4Qj2$o#86AD7^(8;~y#+@12EGJy@ zAT#3t*LQn)o#Ez+e;x#RKKyhsE5!0Yla(jEOYi>3`!Yt)0~t@uM_NQh9sWdUOKC}t zuqw(oJY*5{lCOi~heM|@HI0)lbPC6WqUpmZbiorJN9g?C{=I4Fd1Z*JoIIi_?>P z_kxS@Qk)}k$i4zIqdQE)L=~TS5b0gs#(W~&1#}xpqVXr0^mI0#1BT=swu2yXfs%rb zW)ioHwU;LN_%3F)pqeHCk? z%*K&r>3MEXX(!TMI}_T6DTq^EJ{SK0AuGL^wq$R)GhwxZIkVWkcP>__T>?*o2I~@r zc<2cGbKWYGR?i>4b5Zd{5;j1To(KSq=0aEcT0rTjl(@u;Y-+@B)7~XmGbzkahwzJJ z{!CFiYdm)3g^I*jm?GUBp@Ct>n$AZHdDzxp7=9QKjS|KN?RRI9VfELX`<2RL4R9 zG1z_a9iQBjx2QPBmVpat=DLm&n26_u6&301TW`o?cNh8m3HdgPRD!ct>t*{b#u^Lg z_N;JYbvrG0z7p7nS~RhgQr`doKxJ0=F|l6!e}|A;LGB=+_$bROeXjI^cDbb&OP|&L zOg4b8Vk;09u=1evd3hDC7nLJgW~BrxFT1dG>lAmuA>uB=?`g}xWZae3N+qv&+xMs7 z@U&js5IDdR9$WbEgb%~0hndHj;GSp)FA#e`iqft3*iy(yG~D4sEp2U1+q2WOBA%4i z;-Ap9^a-!H;g)5qN7!@$8h35lz>~hP7Jp0{3JJDu$xshYMWL4DE1dWbe#?=^o>Hs0 zVvSZ&D`Gu;N+fro#kM`+M1SJHc!%|`=uFw0Y4h(Lcn-e9QbFL+xwLx(4W&7%vi3gI z=H5=2Nm|i~2}8$BLD=_59J#5o{3ja7xUQcy5%MiP%M_vgvvNx%c(ey@(~li^9s;?1M5wteLW%TLpG{=MFoI=NTrh zyo#2c*>b8FbGYS1eC#)2@M!;;oxo%Imqk2>1=>!dt{6n(E?wr~2!GxY4h{BCP3Q(V zjUcfCkLJOPr|3pZ$%+OKh7@3Q`5CYHJgb>iU~%&4&O(@@q(ekADX-)gKPg&lM~Fq4 z&rt$_>Ya0bhS$oJco5S|6fLb;>QsF8A!4BvwiG9e&zLN^gO~S|Oo-c)BnV#dSvrBM z_&e|1^I{S)m(weK2)*J*p*mAARDKhOsjsRY{q!T*8s<7q09UCW3PpxQNHppck7u1q zpT=~8M|3FCIg(Dh$BR;oF;QAVzq)Iwj>1I89=KbuQKd6pamiXrGl*r2f;7{WI8e$Y z?v--IdHR$-s@L&%LAY4bBScxud!?5={Y`AtGotVV*Cp=b@4s_TOI`YpfBcjG@ZW#> zpZ>>0H$VRCKmA|-;-CN1e}B6eB3J$70L;-h5H%$~TM%{5OX|~6WcA9j%o#FXe;>I_3&)?h{L7nIQ7%HwX-w?XAMnCert}n{m zRq~o0J4tu;Hg;{O_Zs~~&woLnl4sV>{;lKrNpff9b~>czFu9csZ|uGmZQV{M zn(bz%*=_b()mE)lZ#7!YR;$%+bz0q4uU&1|+Vys$-E6no?RKZ#ZTC9WPOVe#G&;>r ztJCguI^9mMTkY1m^=_lv?6$h?Zl~Mr_Ii-mWBDFa_ZZgW5v)yhZD60p)3vbVeT?_7 z0Nm4Dr}tmxUOK;QT8qE;4rc!|8RGx{?{A|7?)~omzL(ofZl?a9srkD1bN|7&-x+PV ze^}k`AGTgPcs6~v+DXTqQ8(#zN6loMc1OXdgwTE;i1zz;CO39zuXcyyQMEQ~cakPP za@Y%BnCW!IxuA5?@83#B^iGCJIvBN*!KmI%M&nwpbx6Ts>yVZ)|0bMaX}vXSH%Im1 zu+<#YTH}1{v5TzS*xXI8Pm&FW)jFfmXgC-&x}#pFRvpiE57#(s9j=!B({e_(tHV*f zJ{XK@X|+3O4d-7x?0?ug967qNb8BlST^X+KZLTxE+8wqVNwwR<8w|(YPN8==>acY< zo__?NY}~j`Ok5ogs;zFdHR$1Pn(4T?@M((ynb@6Er`xDqt2alDai`TBwh_wW=Po>d z6L=@OXo5|cXlTPoqqqZzPvlAH>%aN4UNtE z@zo1EyFl?)vUy{;ZgdW}Hi?pZ>54sDF?fGTufLSMwXu~DAg2eiOP(inHUE#N&)2i00V z9Xv7kMUr?u#adUZ!)DT}wg<_uH5?7vohRL|TlmOSXJi-s{#VlBg)hSuc}Y6CEyJre zMjb4+o3UdaBdW{y5G8upDoYSgH zkfw>^$~d_}{wPr^OeY-@wO-m7Ce4qxUH=)SI$gS?1=y!UNgDLvsCwfrDMF){bWSX< ztV~85E1BUx-TxpqWca{L)7pT9quNT+ajVvQ=0l7fjM~Fyw=t?G-C-^5HBO#+H2F~6 zu8&8arV*c zIq0trn+RwyPDkBplH#gA`S7pgcuv2zV|eSW=mT+$Lx75UnvfoKnvEfL(iv3CA7bn% zt&`XBleFqdwcV*a;x~ePs+w`7)uhpt(PZluQdzmRkqm|APP^7hdZTW=J?{2K&EcuV zLyP=$(Lup{*z+&W2&mtGZEI*LGtPzJGTCHmU<_A#!`&^h*3z^oW}o8O(n04lef{Q@ zmF(A;^!v%?Tj-+Sf8}!grIlZMExy$6uRz!hS!TO7s@7Yb#-Q2hw5r|K>Gx%W?6%o# zblSrdA6{z>&J>J|t*x8C^x}mXcvyOP=)4TKFQtRM>zKF$aaYM}do;$5Mx(UT_-x$` zcRQ|r-)+>)C%C;D^bV5&nrwAzgJe|2nY{1;#*Byf>h@sJZjVN_UbTAm7{Zn_%na{b z{lfEKevnc^>PGU`0j*UmrpZRETd#GQs&RfPo5M6#{QxtxlUg(Fw!qPNSgVa1wJ8-N z_bX-UA0~v>N6ENeYYpqedaK)LC5>O1k^EsGx}Z(hY&?F+v8CNvwAZK~u-9bY*~6{1 z#>t>F9CVt^nfc<$^*wFezEbP=cUHIVtnBUF_0HvrsKb}_Xf8y(`) z3@)3$3DRpJIH=BBRbpd_WRS#?#gtt3o)a1 zx0Uv4?OwYvXt!#k&o!K!GUC6axP5hVyw&f+a%Q!wY`0SOekslrSKaMiXdSgrkc26^ z#Mh$Cp7Pw)HfGiv)CQd{`^Ng9`OB|7Na3$0cPwbW5Ti(Yne3)mcEA7CuMRi1c9`eu zUuUKkzif$UQEhdG^)7qO7c--InChG9&Q5Y&s}Is@jg%nmbw;gmtJnJcv z*&vKMmXMDdy-T$VGbYT?em~xn`R=}T3y~;nH*1KqleWgV%5Gyg_`>@SX*Y+%1{?Qr zHK~&#wO)GOB@~mbA%a5YgDt6Um5dPdcbdI4#V?H-mkAJtu$|q6%+=(4B|gk;4_k*> zZl-@r#AR(vTN`63je571)Y`39+J5={DQ=AiwNbMJ!NXB97!F^Vs^PI=X~=KnA}8tb z`?#vZPOWwID=z=rd25F_bMvN3WxK1m%F&82&Ccf4^sPhl+q#7u6zcl@m-riryPMUt zF>18I4tW@2Nqb*(32BDmQ94ejKF#`uX+qi@rD;8Bjd9ka0YUrK_hkVKsgIL!RY}W?}is U>bd&476V(uR(n{jH@av3H%JVAyZ`_I literal 0 HcmV?d00001 diff --git a/__wasm/wasmtime/justfile b/__wasm/wasmtime/justfile index f645fde..0e45702 100644 --- a/__wasm/wasmtime/justfile +++ b/__wasm/wasmtime/justfile @@ -9,4 +9,7 @@ compile_add_wasm: run_example1: cargo run --example example1 +run_example2: + cargo run --example example2 + diff --git a/__wasm/wasmtime/src/main.rs b/__wasm/wasmtime/src/main.rs index 5db05b7..9a7deb7 100644 --- a/__wasm/wasmtime/src/main.rs +++ b/__wasm/wasmtime/src/main.rs @@ -6,6 +6,7 @@ fn main() -> Result<()> { // let engine = Engine::default(); let mut config = Config::default(); config.consume_fuel(true); + config.epoch_interruption(true); config.static_memory_maximum_size(1_000_000_u64); config.dynamic_memory_guard_size(0_u64); let engine = Engine::new(&config).unwrap(); @@ -15,8 +16,12 @@ fn main() -> Result<()> { let linker = Linker::new(&engine); let mut store = Store::new(&engine, 4); + store.set_epoch_deadline(10); + let instance = linker.instantiate(&mut store, &module)?; + let hello = instance.get_typed_func::<(i32, i32), i32, _>(&mut store, "add")?; + // let hello2 = instance.get_typed_func::<(&str, i32), i32, _>(&mut store, "add")?; store.add_fuel(10_000_u64).ok();