From 794b78d5db415503bad380423d824d66dff9d2ab Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Mon, 12 Nov 2018 18:50:58 -0800 Subject: [PATCH 01/29] Updated logo --- logo.png | Bin 172648 -> 101105 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/logo.png b/logo.png index 24b26a8156cda4d4203016bea39e69c709b46532..ec6e92513f295d7dee64f1722ea3154c3dd026c7 100644 GIT binary patch literal 101105 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 @Ic;NxPt`75v3O#@?%sxA z9OPARSXx_E>0?qs{M z!&dUEm)c$$4yCU-b~#-mW|o5k2d}#tywD!D66mOt zY+SywkY2ald)Gwt;Oi~B(@ZuGdk@v!NwwI*FJG+FiH9uOc^)2|C}(#(``M%x`)c!G zb$y#`J4g@h$&wg-;H1#q!S+^(RT$`-OMab75s=J0!$}p{nNAhC|6Qv=u8s3qU|r=I zO>f{%*(vu-tf!qaD%z_hh&0V2#lTDFQMxF{h)GuaQcHC;4>dkT^v7d;ZSyqZn;ZrC zx;qA9EQ_m_uM3F0cG?Br#>`YX482HUaf6&XuJeUpK#y<4D7v-Dtn2WU7;UeO)tEfo zbrJGTP7sweGhcAN!-MG0b6KARig#4N^_ zPqQ@&)}*p_q_9&K@ofL?Kv@#INv(3Bij&a}C6FTiwys_7W95!DJ)mz2lN>qKMr(k1 zVC-rr=@FKoJXq58{LR>~pE}u`LUYlCqjEJWMkwR8$_v%9IroG01K;EN6b9YQ0aU1( zt|*bpVc}M5w8&T24=S|Vj1;7t6o%m@bsX1wFg+Tqd>hp2X$>Q$D=R|}!dwe#YHEak z@nrc)5H8nY3fCMBaQ$prTEInHj(HiUUrX45&o;$1})Zs;ZfIHB=$lAqPtLd3jztW9xj+XUZc3jcT0?baz~|3*Wl7leBW&in(U{&^CsddR2zSxWj!zE2hbJbK z8_nw&P-Ubt*RAo!kt!OB+QGsY3YJ@GbIo4&K8X@61I7_fBHd`v0ihS}6CTa#!Q#dV zsb2`FeQ>nZAG2%d@MQP3Xu=m384x`dk;t83$z&Oo?EpEA{P^b34$4yF?;pj3jiai3 zGc07emXNLvKRkR$tT=?jyjYs21;u@$L^?V;xGL-NEo3u(UI#5O+k7;LTg}nSPp~3g zwJ2v>Jsq>6=TK#O9?!RxlM|pO-MfvOaaZGd;FDpG>-^1S@p)mx_!cDdqKDIN92I-j zajhg-bI;5ye$85(9`**#?=MRp2p@iFO=!#i?wBR@hB}dF%`ZNln9KLA7uBJ7kzG?i zA<;oBL~c1sUW&_q^-86kVP*Hk0-gp^R!*rWaKkptwYR&zdHqdso({*$mxUrTfzNOq z;v|9GMmb@e=By8YTXZpB_)TRRy7h69Dy~OV@yuzw@GW@74}nxCe?nCjdjY{fyKVGeYs%9(RDDs3YJ~5MP)XOaq(;NQ z3BqL6Q=YDBII#JoC%4+U8V{V-UcmfVpCa!1PkQ9{#qYi5x`mmob%4(lYu(s`YgII? zmu31(xBAPSGm46Kc4{QPxR~a9=U?0Li$ivJ_X%C5LdEQ-e-SPGnlq?w}Xc*&YL9Jrt}E19C;%1b;jXcl>mQwOgJSoSCKm%3y6xI`5KC5K=#<9 zbTQG1b;>MOS}#y*{>S5=a=MZXq)_PlauMECfb)D*JY>wljfozGsg!4ezb?uVSVQx+ zL+K4W5qu*&>SqsQY{txAg1#Rt5Leh7^^cprZ}PXZ(%aeV1CI*b!Hfg_WNhK(Ybk-P zPP`OWu&r^W(LT7d5S{ek)tM}ah#C1Kxd0lzaf&tn*vZ+P3GG^MxMz2}GydmsNvYZ0 z@3jl*Xz^m}US3S1KInV$UVRQ>=ajuC-M%i$2aQ*hx~9kaoEqHg6Laz3WN3*oxVt|{ zgf-NhyQc}y!cBRZxaw^ozG63R>SSR8F^i1{ zDGibH5?jcYtd^M0EFN3<@nlSBwSH1!-Ia)2k0C2*&eAt}Nz*<`l4pLDB8P3`0=bM?;IFPQPmc8h_rgyl6^srN1G#Pb+jO@n zKipo5HjHe{xRNsHb71!U=U&v#Soq8~y|K*Z<4st7%JqBPVV6_dqPsy1gmMD%34)z`v=(gCwUtF%GW<&P z;4zGy?XKvU1y5?#TY|8enj)Em31zb)NKfz8aBwXibt*@~Fm>z0$G&vba7=^prXSk1 zRx@vE&y$;^&ZPx-(T46HN}Mb=zP<($j^oUZ*_FJ~yKitAKL^WjmxIt^N-(by$Lwp+ zlJ`WB^^RL?x5^D=-xcBC_o6I_W#*Ob4{y(muFuE=?pZMBs#T~D#kE*rKHM&#&cCl7u}JWV*py-!fwa?jJawq73Pq^>O zSOIfURALwvNw8C0jPmQ39xssLmZO`-$nK<1Vi0~>UE&z>;R6o!ua4J7f&5IQkP0*l zva8t3>IBWk_qe$i#Yc(tJ6PTf5>uF~(OfY1UlmqO6~Q%@gn2r*N_Z3+{|Lhxcacol zblaR14TgJndoWhKpm3Nw`yCF?R~}x zI=)MsO_}TF<`Gl2b}U_F`;xDa^H&ftX`0_N`9}5y-5kdj34NE~uMxj89fOdWv(+gH zPqLm=jUmnCHzy5YO!_bUo_#jYEz_5H_4S>JzY27z#e#Iq#7gy%j?|_*Q^fS>$iV}l z2H;MZ(_%i^+jS~!OB=TZ4DykW>lxor)?J;>ms~7p+c;!EMxWX$_y2k~sRh^Eu6wPX z%5OIb*-O*}i@w>&TRY{(MR^fh`BKkzC3#JShJcuS%ri1d$)E4;h~ z4t}T~;nbL-MxQP;jXPA2Iv|YpEgBx(dAQQnwlU1c z^=`YyI?1CYW|25K`4+u4Tlo@XzSV(NqojmdKjpggHGeDmH>a#AcV@W1yZ9}~%*>8) z5&K$nJQe>*5{7E?m3~z6#8*hSIYy8tx%!J)3Tx)B7vpEY_dk2%gzMO;Q`S+PcF0|> z@^ROI78t$;i?}k7OMQ; z*ecy6IlVfGWm;qwejnbJ8`q}OVtBDBx z3@d)yvw1w!ors9{j>Zu2heXEckwZ`bwQ`o2eDWMd8sS&^32h;l8C(g!E7n#Enf%&?7?e?~VR`jY1pKBh|l ztOa*ZL5eaIfkF0k}_f zRcV7A_a$qFpBxHJgOeqMxjT7W%moo#(r4$pGIri%QcsivgluKta8D%CmyA2k^{3zT z6CtwrJMHhsj?=Q|hi-Ru(;pBiZdxLbRSGR)j#Z(;xtsQAP9IpW>y+ zS4<)VzVHsRoFE<3h%$7EE=7H+YtOue?LPGz58zbAP+?yh>UFQAAoO;Yv%tK;Ov$DYPvwMXWaIRPR9uG^*?)a0gt?ayjC?wJ{KwM|9VBsh`%fFPLpJ{YL-TJ5c5BJ2 z%@NskZSUW=l0Rq$GFaQbXk`qXWX<8qf`-~qbsTNAnYz=ZnBiDPI?h`%5X^j9V~smY zAqhV$K9rP{$Y)Ds;O##g=-o|SYbWmOsCkk#R7G1|9VQ48zw_`1^+-s~4THwfy%baM zr~GRvPhRgmV0$1WVaxl9yXExN`A7OHG)D4ildsQ|kb0X<_xqS?X^R z!Q#qw^kH$)+2;kJ3feqpi(t!%sb$y`m3zMv(VAElKxC=F{>#vsb@x*~X=`*G>A~=7 zEmed*dyrM-qv=rrPV1bhVmcUhP@F-cCU1UWHPl6C$n8V)Q2!qNtp_`^3T@DdZ*!7* zdg|q#A9&WhAWJ7I5xNFM>U+MYm8NW^{3#cCJMjWYh+ktw+3ITFAU-ZWWms z%p-5B*NKR^$H2#6)~=bK=spp$#B`8M!S<@XwA}?RiPQDmRxn~_%z2;gp$t%M1GsmY z*=VA&qxfk(RVY1F!{m!sYz!qgLrv`oRrrU4KBEEbE>9i1u({C63=tlkxO)=m-`{daGAJG2BPaW@sDzi9Dy|F6DcxgHerEY zTPv2>#viwB^5=ppvZY^dVgCrTa(i{!H+*uVd$s;2q zcKnczjt*B=*R6#*>K!q@oD0WV@Rzc7^wSd!vx1uEk&_3@JVzueNGfXNwUQTv!U_v* z_pR@nJh|}m6xl%=mu( zyrHdmAOeNgSH}zVK-1A%m6MNlv=1gl`&;v(I7-TDvI<>K*lbBMa&p{#kzX`r>yuZ* zIY?YxQn2SuZ% zP52mD%1yIqXRay9PPj9~xmLwhOv;zEXdRCDQ^oPveg8=8QzJ1MhcKV>3mHi7U$&Un zi0h3M5lUd#kzed z(qU%^=}DFJ;x*!QLayF0$$+pIa@yI~>vcRwm0MU)5X6wj;D1|@#rmU@ySyLBewrjj zek8es>doPj*3Y+Gt!J7`1~EF`%gjt+=lr=~~hV zF6jbaxCGDBaz#A;RcpV~qU1@$)>-@Adlq3%tfTXXo5;-Pe8HeZ-qNJJ|&V+l=E` zEu47j`KlCD`t@ik+Tt{qA;={CWi13Na z2c}$xD$l~wRj*<1m0MG`xaR&Ej^Ca=*i9)Ovx`mI>D1O9eh{2A$FJkTn)#%|yi4KT z2UjMr->4pcK=sE<1l+0=F}=61>%RqV89+pCQE|R@D;LM=%)~CZM0MD`56Ag8e$ceNR(?!qh<%)t3dN!@+Pb_HTxu;+FJ#-QcUPz~351wG<1)?;U!E1I5 zn5Q}H6~Iout00N|cB3(pwp?#CO(e&`Yipea{ zU;}`~&CpCtP2j4n`f-JtPy|}oM~zP*BW4qV9y0Y+rg6S=NanEzr!s<;J0D?YnxC>Y zO{j?&2ov`9>8TA^?3%;h22FfrIO~v4V6VdJR`sP0xP%^dXRtUcA~>izZi24ddhYnu z)Y%Lw_o8X-=Kyw`lYo$Kvo&uwzAEI?R^MqJCh~6GkDk8CGkV}nGV0Vcb z)wV=+Za*N40`Eae7pvkfXYp<)1)aaJ-}!!C#bWNUl+kzQ5jdf6%VH_o8c*aF6x^bh z=IMWxyj~LFn*}z-(+r3@n|>%-5ICC!AKX))91iF1PUf&N(Ab zvE9^+9Ucu$O2817FSx|m2akO@TwZDNEc3oheVXch5mk29gPfwD>M|mte}1aU=s^@L#%|x2ll}C*4F` z4W4AsJVZr6?S~1Au6T~-7=Rjs5CWQvaiky);Y$cz&e(#Bo0y8pfT_L-lFiIi6fv3H zJ1ug5zuUmjcNo$#mFtx>wKTq&GA*9C33-VVdzC+xH+ApO#6z07j|K0@J&h?hXw4GQ zWYK?zIQ<9+4xOLtEI47z-qx3k_U`E{zn8y9yVRN05$fFU%MJg2nO_cpx+XavDRSnh zm)jU89%q-{tqTu1;_#jj*4U7+9EyK&EM^g4tlzBQWj;u2FA1KB4DCxRt$0x)SXN>K z-oa?(eemt?agjBRr}f>7d7#qve6J%AP8fDBiAb?Bn7)@MZ?f0Xyziy``eeYjmp=Gyy6VQ<_sDjs9{FZDTD@^-rUxD%d`KTDF-dig=5 ztU)Vc(MNou37MYl+~wft3!73O?5#Hg&wKG0bh~jf2?G!}%q-7b>+PRDK zUZ&IXG9ep#0%+CMxHaNHWutmjqP(uIGUKQ7e=$~PmxQd}KULWuaN|nSX5hJxs`##x zD1EG5t7QI`tOagpmKBt&LUtO?4%}n)n)r+ScUVca?fhX8;h~;7OM*&}bG`POYSdt9 z{NY(b)l>h*{+Jo7i?2Wk$-p5zIFX|pXH=&oN0wALb15A7(#>=W-lEdNl0x!2={9bI{oF-jYIYH-7~zkMpO-0*O_5&P1)xAvwHp$M zMZAecL41cMTDDAZ_Fee6#5j8)4{+Gpn;cS3Ko1MZO)O~a3vsvH&j;#c7OZ$heWwW+ zK}6kwq3?fi1f}x$elZmBP-kA&57FN}fpc^M9j#Akltg=H^n7K~6Cbdtsmjd-D`)cdhkzlJ;z`JuvLR zRTri=YwTLPGq?E(9{*?Or8CoF8q$Ti3R|=LMagbd@wKj323CG6RW2!%ISn3d z{&^CIR2#`gl;5xprisD z_YZ8WluLYD&{53!B55%+N)k9Fu)E`6aB4&_j5sJODheTB^Vp5}0fIy?9q+}_ zj+O+jx|%B1|ACF;ySmyTV^eJV+eOdcZ+K2^hU*@@e(Iuav`GR9BUkFa{*yyk!;pwv zY`1Ci2(t|LS7M>r)r73v=s7rvbALjoo0hF@|E%7wp@H7Z3^rhC8)&$S*9}w8DG`hJ zxtK34_4}Kef=Z6!rbZeXuTn>gRafGaiw$v(SH{zxC#Ssx!)8uA$eBu`N;dp5Vtw7f zzCng@Y87|Emjit%kl#y*5baZ!b7*6IkONwRjg6waF)_Oy;&l{` z5C9bh1Oxo@%taRzf3*dfhFF_P1Ek5BFsJ1o%Q&Jy3iQy}rwNk5-(t9h_E)HwY{rVf5&UM}R zXMi!$q4h~V?Goy@C6#GMmNFFsG zkp+H#iih#^oold+YBJ{+mfsfapLGYZF+ie2Lpc(9M?8_Kg8D}FFJFx^>5b(QtPos` zm1W{iWo%QXPF{T9BG)Ca{v<~bwUVLufl^V~koyRe!$xn_Ms9o5IcNpBTjkvyVN1pk z)ImJFO2jHHElDNj8YrZJpJOGOeT$W`_ZKUZu$*sseqR)-8egmMgsTeT;p?X6bJUp8 zS#Pvo@8-zvyB)T?Pg(Hf9js3%Abof7!a14DA@l#lfUhYvVmkHE?|FRBWxU&E}v{shN^ zR?q)7SM@g=Hk-%wQ@g3H66`pyADFLDnI?P1-xY$YdY@GY;hW$?SlSH)o~$hU9z}(A zuRVMePZzfd>Hq$aTnc2S30#xI#46HA3$eOaj6MYDaq@3HrRApe>^_@M{8ZDJ`qSub z$qD8kT_G*v#Ufo-_`^x^DXbSTZDcSU8!u-$@Kg3 z1~(0rsEZ`p$K?A|C-NQU>nyFL?KW&{f%d~bRm=bIQSZC>&vgkYqtup6Jz(h&{|jgU zY+3yXLQSDlM=faiOgxwu^}d)tC7asW%4SJw z$IPDbSrOw`lJtCx8qeiuYp(<#e_j?*6nrF&K6&hBc{>a9%}2{Wt~p@0=e}cz0GZI~ zw{4Rd3PFwRKO@x0gd74S6Ta6prv?&ybr<_h2($SE=1&|~wuq$nhfegDq+@}PQ|kcpw@ zTQ|$*v&xGRLLLX7N$MgWc`Zy}R=(UF1i*f5V)OW4Cj&Vvqx&6Ge)t7g^(~}VQBIzL zpPRd1MeQ$A5tGC=>CDP0Iw!_Ts%Zzw1d_?B0~SWVS3Foo zk;UN5kjba_cxS7QjoW8TmBIh5?r1zY(edPd=ivoFF)>tdl=K)UL4D7?TWX8d`!E~f zaG$8^v+;In@7uP6`i~~#$$r+#rjM@DFK1-F{4#RBLlQ#FclRe;ATVup`oWzr2dE_H zPHLi^#aZ53*~0g#+-IoARJd+P$l)wrWvEMV$5LTVoC%^FUh#iIYO5#RYan zEsDGBe#jJyIO6Fr+(!+^B+wdx`hCOel&?#djQw9xXD@u#HGJz_%--^~kb->yJ~VLZ z{NU~QCs#i+QrhP~2S`A#aCsa--cDDoZRe21LEPr%S;zoBFC*R`P2+Q$2^dVbmJ?h~q!|DKU>QDR=(fQNUN8yt6S$~$Vi=hXQn?0VmJruU-SHHzJ zUrK7mHV=_if`h&OB%rBj$vRt7$_izgHFnws$E z8#%5Snj=a3$BBTkZD^Qzd<`OBV{zYArB`X^_--3gb=J9t)WzT?Lyr1dlYcJ6COcf? zv;Zw5X+q^zQiHLJ^#Jd{l?rw@tE5fc6DA*oz5y?KR=(|wK;4_GMo{9a7r5>p8pCUl zj1u?wu*NXXsB*#~QL6=YR9i|ppT}J3X^wVwe}MENT6(XhYR4$_u+J~S7IY~8%K?u# z-A@Mpmw(HviF@PMZvNmP3UPK{q#N0O6!buRQJ%ep(3d`oan6!~!PEgU-{{<6XLjza zMqj7K>amMF%XU{I=kbw_KwZ^iA$xFPDK0*~t0-*Wqg3)V4;^&yN>Gq~gNe`ttC3`)g{e&PoXYU5u5su&~gk^^sAb zg_>s<=sqRO?014Wc>yw|DbJ5FfaOv7i5fC{U_ABVo> z-b&>)(%ptc^H&(SM!e0e*~_C0k&EZJxt_LGs&Q0dihM?{kZfSu>Q-vnM>_#g8bQx% z*5`uDGZ2n~IUX@Iy_%=GuvuT-m>7;(df?$h-|hcTGAzp4AIOsRdg$7~E&GnMJJB5E zCVSd>?px*D3^AGOGujF7{XFd)Ot#R-b$CnNr$J5r;UGSlB{I9Py4#yRnyIG8ib>dW zG5CBNNja~BkHa+p1Lh>LAWE0!G>5O`8`@ZC(o2(BP)c%+SG~DdnKIFxuk%|c7_(rF z_M=)$NLz%bS`py0W$NtAd_@!b7iooXkB>CFRia;GFQO_S+dgI{M{`tK1JniEsMOAJ z(06RGL-Xv-3&0Xz<)&KEjaVf~)W2QqKtD#>#3^=%iyN)}^jj2T+pK0~0Loj~^*Aq| zglQ@gRJ~`q%M@<)%4tvS&vH>;S7e4WhhmB_bneUN62hEVN+mpt+II$ARTS2rWG3)! z2?;a^o^x$(algjsT!oaMDTV(0a>&)p|LPS1O(WZ*90h;P^#m0Gn>kiN?0H5CdsLo* zCA<4>s@PHgn&9Ao$&lv|pn2fF>pU!yMI=o2h1Ea(_U&l)|1<`EM&PqWNGdbO?R8CE z4wUgl`cBTRj}evRiJvklrkf^o@%cM&$=D;NDV;9o6duhyAC>^lqn&54od?Cw$4x8} zFl^&&Szr^&3uo8PF!y;${%!i5cX;^iMAoHcHa0dJ)RvDzyO2lPQA4V2T}bSopf9D*+vjS)^jr2Y-gfvbFA08lcsMcj?CwvV zhdXxBU9O9JcK!k2A5&Kec7(d%y}oG~8GH%TNS>Ylw)@)=2-kz8_N*N+`$}CuX!Erv z2WxNfewEJCed1bRH-HtK5&CR`Uj0gz@^Y2Rcz#VL@l3i!-{?W@A-=Zg?NRh@vz}wk zkGLVpSN7a+BH^JFsb!y66S8yx+<#P=n0oW5+L;-z_-*aK3uzX$evo8N>3qOh3IF!5ZriiVrAf7Y(r@IHm-TF`4 z{O54|(u0Jng!EkZ`N#9pD#1CpLG;EE$K7VqaVOYGCPm)bDD||UAiUdkeszkWRYiGLh z#Ai`Y4SZ9#URD{lYG|47qPb()JB!P*|~RS!SucTB&h zIBZu9lTNBm3Ag=7E=>WS#@8N%lk2O>A|g?{t2gClS*?m!x`HF?YD*1b zZEw^K2bF~-o$gt=f2+z*M5jyXB01bhQ5!F(>*~sE6)`?-ZbV_qjBg}H;BH6^=B#8r zK+>Z8qP*&K@1z0w&}@5~Z93k7(*)dN=M`I=xX|(fX7mMaAIRN{u}reNI1@4>2`+m?n`;?-LASXdFdw^h)|Y-y1^JXxky3K4ZznR))3cVkC~ty58pnZ;E_ zfifwEdHLIElS`XxexB|7b~m`_h6x&(yrn-?3eAMJhOCF}l=;qf*)T%3m%}-z<5Nn0 zmT59*9{wyg3yNVqqkrGKD7P_KuG<%)GuBiK>j|z=DJ!~MJH>>HVP}325{0p6PV&ne z4T>@l)OhutT|KE{aQ}eoFfH=v`AMqLfLtdy#36Z^f-KPju;4nSzdoI}EMwQb%R88` zp8A*Bu3NxH_WIo)_21;(-e1}0iN@A!YO8C;oS_v@GHhR$7Y6jdSZ+l7s3D zi57?@Ra6B9vl4+DR|8MoK`+dw3TINtBw&Ka$)$=ko*4_Z?vom1a7rVXWRR18T(K{T z4MPIEAr*$ezQ-W0Mlzo|)r~niGx3O1n@P8BYc)iseavOt zPMypJH*SR*T!cPRrp{7x+;j_SqIQgQFo+Vw6Hy;BKoshxZtIem&$AUe4!boGH?YN~ zWfTn|5)POd@yOTlUTNL?Z|~MK#t|B)7L(NnX&h8h!%y@rXPx9RTuv_svUx)7>OVGr zQ*xC>$W)Cacl2f6Q2q2KgWb79Nxpf&w;4BL$8D9CqQc%RJa>}a6bmO)cqc#ec;U~F zW)W!q4Rx>oY5|}wAP0Xe>crh$R_x35ig^!aXyjD~qctYyp$WzeUd88$ektC*EuJ4s zn%J5xWEU-Rrpwvjm*)FG&4$s;Uv;0BruT{I*gWN01Pw2&KrX`l&6nqD9fA61E$s>Nk(Er8AEX&M@jMrY;~Nz+t#0u7jqgTl zNYzf_(0SBICP!>h6n-b%`V+^16w`Cx%AeI~-pN z_+v$jxPM;p8dQB1oCR&2Szq8u@hw1)vZl4)I60d*D^HmXW#Z$Q&naQlE3M`~PCKc$ z>3jIJ`Xa@7-g~vuDgc8Sf5tm2+jZNLf4p!!+i~}{(G&MAQ%pX}X+7}XNZPztJBwXD zMw5!iFS2&re!u@h9)Dg`SL(UX>3Oh`DfHkI@q4$3w#+#YLCv|Us4N$)E2cnMu>rX5zOZLrzARd(5Q;h(uz);id$9jwAeUo>s8*KbiSKFkE{ezbN zbDtV2nNxnpLdjd!EqzGdWdY__%(MCNOfnoxpk}aIp1{TVKY5Fas0kluhB_1gX5O{WlVrS zA^F$>%sJGyf0HkcVEXIfeqi8>w8~>X(8i@9Qj6p^$M8+!?@IT3q<_&$Fi*jbt*Ld- z$L_jWC1w(?l9b$4U;0`E(@-=aTs=KRKEqr^i*JiRu940G%okU8I;%ErcZ{tT?|aSo5MM4@dU#)Y zgP2X-yn(w3_y5000uN?r>^${XG3OBWvs<<5V>;L;9)A{sUri<|NeD=tU3R(pD8J3u zv?`ic_<3fanC{0pxub;`N+B~@)vkBvlh58QD@)f(vW0$`E6e-2+Z6L%;$^|9W~n@q zV?I=Q5?1J#K{ns(a!XA|7VRVO;ddyw%@%by2vU%6d)g{J&PMoA|J~`In6}OCA5ZD7h8xL zBfg>x-1grm{sC{MEoi55cVtPhlP!g5Arep2}q*M@Ti$DEOTq&M`&s-M2o{wx${7c5r+LeeGDOGdiSQe`RiVr zCc>?85~uH)9ORY4OI#9x$~qsq8N6-F_&X=!Wcd@m^)Q>>IfC8q{xq~$m76=h_Mw#9 z(a-|H6!XoiNBIpe%%^are^7k|{<@rYE8-y@j;X@eXL(59s(<^h<^?-!rnW0m;3*3h z|1e2NE9Q;6TN0g7^RNJn*c$5UiAZ#4w&B4V;>o{rf&LQGGAfEZzT+!=BCypSq>KZ>RG| zAnwd_(n7GThKZB<0|q)Kv;CI#12xUpRDJ%LM%T`+to{qHoxz~pm#4z5eMe1CJTp=? zO?2I>7g3g)$Qm10sAA${?zKCy$Td^MR7+PAF)P2{ae1l%Zw8ez{Ee3Sm(%l zPLAo>m(L4Njtq^g`gs&{68jgAyB-LeeNrG~&Em_JX#yo7=_)V3orX?68Vz7_P@8Fw z2!P{tWIXb(D~SUJ+?}uiW{_X8k2vYG+VQh6=v=po;GEi=<>fB$b5nJt|F!6jQO-Pe znxh$=+r(*wYhINX*&gHBfQGv1R`431n8B%`1gN+DZiVbDkbXgp9Awcm@4u3L zd_PR;+^X5t!t}QWjHGnJxqN=;ufqmXH|FilF_#yZ<;tMK`0J?166tgO2^V0J7*m&6 z*&ib>P1`e|VSgX4^@~=gyQr52e-X<9b7a?|Om3{g@3CSMmcSg-PFz)q1 z+FiGMwp67Q5?Df=*%2>WyT}DSzPDE&)*;GZz^B8GlQTb5`beU4ivJ}IpWf2TY#jtn z#d{7%Qa6fY%U#REgr7@cKb=s$^6~L`6C>;H8O)Mxymu73mw0)gshLjnLP!Wx*O^it z;#vmG%WLx&xYKFoIrbv?`5S3TBC;sj3wlJnN~C1M7A;xOx95{Zp!!_}O{P|HbCsx%k&bBt&wRUJ3!|h0)gFO+y{9 zJCu+4Bb1y>2`-%8-r)OZ#ap+Grh^ zCwCl>Wm2DfufCGiu(BGU-=~c_0jRH2?uXn!Zfd2?C*QwWuMG5oPJffDM0>F+e+^2(Y~4?3_-Zy&7JJHEUUo% zj_7|fYCQqJ2=do?3iafq>(Jc|)6=>`sZ{1J0xoCusMqKRucnf0P3D4)_m$3jf34+K z`AWJ_w>1H|f0j1g#f; zm4XL8Y&;DAT#Fx}n^Jl&;@ADhuRar;5@f72FWT?1IM4a!mYNOToGr7;IdsS%LkO*wF$R^ZZoh4fW({y{ zZ|i*)eig?$+bt&=@!kNeBYYHBRAt@fiWm-Hv;6ypkq4hv)X>oEAYqFwNpe)VfQo8k zR)Bes40ZH1UG%-kce5^=5Jb+I9W@eBTKL@yqK z8s#JA8xGg!d&e+y<~sTxHFXA>^D>lmyQHaM8$-mCT(D|Yy;GRr0K5R?$l0MJ&a!By z*SzUzyx>|xSA0%PfK-IDr=6X%^j;l;jpQgZZh_@D{*2go_S*XiF&&T>Dd@eM zuhS{-k%VNtlp=Z<^?7QT->8nqK$P1T?g?6k5eU_qJ7k zJX+@B3>BkA`9jP446c^%iS4-y30VlXEO7~r??Em&haazP^BPU*3zn1t3G3b4&=j90Qlmoa?m3#XKF*s@MYpISY z`rX;c+j4|`vPl~~HBgk31_NI(r*WRq$2L)pL*d7_$<){;i0pr9bKdw$n0{^fmKx%{{rFh0CCRI=CXF?I>l)+fOY!`3u+zR(Bl9z|@qLF*nelH1u z+j`XS;J>pIAAbG}`evu6nz(l1unRhxz`fv zhJ^eu#p11f2dgrP-)4*z6H-_7l3EhX2F5lwMVxHy>};{s#)|1z+A*onGlM(^3&lfB zu3cIAm9&gZC_^V9xGS!x5f%)_F8$&jf&@VDDokR6{DdQ%ugnEE)XO_E77`TW`x7Lh zdmXpGO8>z}%6b*LI9x54MdKF~CHqLT&O&QOSFLekkQ#wgYg#EI`4A~|e>gym?(-<+ zZ8=^YsSmjI?+u3W{#j>uI_+(?eUEqMb+LI#HtrS)GZO(|;u${z$)10#*8e1cq8fqs ziXw#-h^hy^t^3fkpB3F7k1M!);4KfJE5TV?0-kX9+3i9x)!{Lfh6Mpj3O zRVM0rC?I9waPI=g=5*(%^!H5pl4}*JZJ&INyK-yYEO?r6fCqz_XPKgK1`z`~-f}WB zGMqt{C8a+wQ*W4~`FoFop3uQ+g<4h*vbsUSE_me+IN$l}+joYJdGCGNv%U+CJWft- z1a0LcXN4s*v2?zvjagG-VA|r6pHFnnCh74+S`~3wHdAitpP6Pm^#aP6fIxl)iMEKW zR5(l`OCghX+E}8rYIiGTJ|%;!N$lYIm2cdMl2+FX+xf4eivMRqrG908ZT{A8v zYS^485?pOe?rXelIG@6x;t&*FKUdgz#bXyLk7Sm&GY8Mk!H=cN9n#1mf>UTsE9+Ks_to9{!9Nxdmgu7$u>`tpntVQ+g(Sly z(WHF1TFj19^v)d{ukXKkSft!1L4bECuXC$g5ImGC`KP5t)b#6grtinXH{bHGFqc=4 z=f<{@#aM@q+U|2dzt(B>1x^9064>P%FD+eo z8U1o9H~@Qsux3Bgd1KdDBiY3|S*es#-$w-E=wH*Av_4x|7Nu@nnIGdLU&ncTw4nf8 zPDRtNNR$O9`8s5I9tM&48}}nXD``iq?^@gVmnq)v31&KW?0=gqA@VTQrITMw08nAh zi7mQTmKMR~tm)$ZEhHONpAYpdWYFri?zaZh`dS~=aYqtf-=)DIJ~#nGtx(5x%qHgU z*abS&O_XhAqxwWzU*==zB(hQwOi~ic-TB$JKRdDi>i4qd!a~SkPW@E`vk96q>GcQE zUT1Dn;#Z7OmA|etA?n^$ek3Owgk=nNc-1I61=A%HClzU~d2?Bp#)?%#aK($KeUhEp zv(EF>iqmIc$NML%8>TFMIdt(#&ccRPj|p$Lr1s1NM{2ovZvc!7x=SauZN*$G18ldmE=y6E{c4X z;xwNlv+ioeCDqyDR!#3#e;AO}K?x4W;wHv@Bf||U$Y^^w36D~elf8U6xj1AS+q7s;Bh!vANhp6+Kqudgt_iEHtFpJTD4(v$!N8$elwCu~j zi{XMM8nf;mJ9asxON76|eUGIB?7_dUap{0No z@|PxfLO09)NOA3^@3jF#5Q2lHV5&B2F^EJ%j1snSm8?*X)xFYBCoo)6cyj0Kf|_Kg zx}Ckf3V}g>hO6gM*1Y(3tKGt$p3a~op}u@?HlVjouY~{pGLqgG`@In!_Auf-;62gI)VgVqlB=R z(E+nuQnaYP2?wWm)>G4J4PlGxJ6Q*8p?>H4{cCw{M*Ii)>nM3$6UykIsfg;gb{OVo zKos)pvouf3D)vI6_!gxB#wgG|MMH~{&Uxl2Ib_|SYA0NmaFHP_8}rlqht}*NZlqT2 z_#EgU;oplN?uVjI0JH}}i#vOgq5b^eoN)`?ROWM>B&gUYKDY;|)=B59ayJjKuT6pg zdd<#wK!YlUVvf9dM@XF0Zhx~d1J*^yFdKKGFDU!3xh|~j>o1_|5s5FN;jro^+}tZT8yiotm7(lZ|B+O_X9<`A zvPjUJu5;+QALc}OY8+KOAQXcZch31hRw7!Y>Hz7 zWhXL@2v7_Y#-o0^B91$|l%M}g^OQbYF*DM<9dhl;7YSC=gqB$#!YxAPJ6=KF>Y?gS zGh97-{<0fi|JnlZ^iQ=auRVPf)c>{~&%#UtWC_Y(P&=}*1*o=SdxZ89of)WsIUv$} z1S&ZzJcZM9w6?4wjU}z_TlC^Py+|p=KNMK~=q*CStESp)+y#uZefV?-NH2gk^=r57?`a3RaW6ht{4_jrVm?&EKl}1YeaA+TLa)u3%-~!Kd7xq5>D)1HB>uT_ zaq*fqsl)K`aYXJRc-9Ozvh&54cQ3jdzI5=l3`C2u>E2EYhg56ishAwN2>0>k2;{4X zRC?#{;u1BwnnVH^2<|Ao>rY5f!<}D36=-(OTgCjK(h48gRQ`o0pYGJufuuP7vfD)N zBtK8oOO$OYDz+MW!f~_dIy%w4epH(u@87-t)?m`h6jTl#9;mkdX5_}0vWX+u70J)B zSZ)qxhBAMaeoW8|lc5(M)VrafXO2o0PdORP zDm^99E#}}4YkRjr^+i8-X%y4R<^_HB-9$W)Cc7`K)-sVL+E3j>ReF_v8$6wmVCL?m zRLBBqQ>?J+9ctM7+#=~@6~PCO)iNy_0)+XTm1B(T!$N=jbFEb@jN{=vF`n@Wmig%I zgiW6eL3r;ZfLbL8d{J^M?dC!>t^U1N&VMvPOHKEuwR*23tyOdUK{Ob3;YOTCIq0t=ucH$$ySLB^v2?YC zR_Ki2L;U?5M_es6GrTkGuwDaJRs3iFeAqX=%u?r_T*$>P=)Hq~s@)Vn%*RGkF71qa zP3AX!XY%1Xvtlv_YVDPi$3@FrI4+aNxtQCsS!~9-;GX~aeMbLuhVE$H>yOI5BR=8M zs~lNk>`|Dgg7wPhMj2<-c)3ob=>xN7vL5WOs%Ui%d8gb|d+eIAv2&hn+>mZ=lnOa| znBmhha^r2rr)g}Yl#Woz;zW{-YquFgf6S50nVSm1v2DTa?E z`c@lAp4QFHv0!!N=x9QOX^$YBe_0i-FE<`Ai#QGz$`1jb`H3KdUJjnB{{|`g1|Gfc)!vd*?&1~ zIf)0Ln`2P>M?SKo**>EMHeM^K5F?)jZ^B>#4+#A6sjThnz&kHbMUALg4=|LTsph8M zjrATeg2OEhRaDVCKzf4ckYXLRGKtY%T?A8X*;gK4>F4eJFpnly#Yfm>&!?Q5!x zT&xJ{DLbvV_Vh5gQyI>Gb=+$~bx%5iEaApHWsi;PpM0h8qOc5b*U*aSWZ$4h2LrCi z3=wYr)of^b4S99Dp5x%H{+w0K(ON}^QtH3OUy>-0U%ZC-VsBq5lh(b#f$PgbHBG4` zJ0(w3G#Ko6a7IS1vgm9GK>k6na*qp|q-rXM7pf(%NU=pv!At1r(Pv--asT8)>ZvJ+yd9%U;3Wy_aUl7o6V%t@C}4 zR#(5A4O9c~o{bh=j{BklM)HV>~5KMdVZ1 zg&co;Z6WbQ+_VIvB6t9s^Y$vq z_-)a~I4V z3=jd-RBaJND=@&2ic9@^aScd6j{J2c#Ond}D#+Ml8_%cH)y|>wsYSnC6i64CrNSeq z;;wk#zATm#=x$M;AkGO4=KOH5N_&{eMh*H6_&-6%AB$qP7heGc*c4|{qKcALVReC% z8C#S^FWt^CJNa$0$GX=>6@2vWN>4S72GL{%g}_-YeW-!P=II4;7^(eh$ck2lcfV<6q(e3uPl9l5}|dghJ6S-GRpX=icrewtd&<}cC&4lU*{xPA&jB>h6YyJxoz8YDh#JbqsmFRwv4 zzs?$eMq55~oeY>)(uc?~#^JM$$au~W(E$H|2>fogN;xK+o6=X$t3dsTe3PwlkwLwGs%qCq`o!;pE3BQJA-~n&tL^AqP5~qJ{8MEZ!g_i zhj%s{d@oY-z2$-y?qlIk<6XPMvh}yzB=D9-YXH^rQ0C)=CHh2~ehFGB_LaTC98 zCWt~~c10^M=dW2#1YoI0%Y?Y^|+>~ba(D;x` zWb~{VomyBc;r3T1^FD#0STgNO|M12kA^O{EYbQ~MxF+nd34;-}vQ>sRatbI#BDtMW z@V1KIGNdlS+3Jbrfh!eYfLvqrd9RB5t6S zds$pV!>H-Q#c5ZXE+LXZMO77%qS}_q+HIGvd5SM$T6nD6S?5UquuQ@f1h>NniteBC zo4Z@M=mZ}>uo}_$Yx5p}VE6}?)rzl?C{scp>e2jDf5xymVU|F@%O2z27rf+c%Kh^h zfch%GtI}O_p{dny>zkFmtidOJXVyJxIy2R>nsuY-j?N>b_j+$y<@7mC$V=^T1}1&^ zEm;8aI%*8+{*$L1*==Rpm(Ac7j=TJW%JOm?2x#Iv8Tf98@?OepXZOx7EGz_RJ3J=0 zcg3VCjW-?9!TR{>`@grH-d)k9?U6nJTB~U6EpqHvZ@wgpItR z?PRP~u3g1XEfHnxhcMXsA+Y&$r+@>s@O$gV1bgrC4?bN7h@T4&`Ev)Ox*C_37M~FH zpQF~jtBIjx3Ps4T;l*USa}qP0IER5(kY!93q(xJ>fwSIfe?!M(XgQZIBW7vEX(Yl~ z&8R#1_O1HhHKK zMF8mbU}j`=jLV&Lx<4^P>c(HIuXbLOG4qMLN!EVZFFdguykoofAn!fCdP}!3Q{^llUT()si-ie`Jy~{vAIu}N zTv?ZB+<&^M7H+L;cK--2o64R0p*fqceassV>B~(8^)KJZ9mFG7@1)gfIZ#=>@?Msu zm!e2?HWJfSX8!h{31D56GjlDcHc4F;V?}wqWW9@%^^tISe+MQ|x>Be*s7&-CJb@!V z^|+@nDD|qxEHdYemNw#KJDv&-hn`ONJMW>&{8)pK*q?qTlIH>smf5dZ$CvFV*oNi} zjZ#d9f^-V`x*7;M!&*3vB=dB4j#1jOJ4#6!ZaYj4%7WJuF%(V1F)n4y=gbWVj`@?)*`$o{f>ysEzcs!akriOcAohzjyEy83 zSJMdha{JM};dW7beA$ptIkIy@+`(X(Q7@bU3roE_(999`tUWPFrbj{!^1T7uOxQDwcpCkXTVLE zj(XH+J#_eYZNW7({F4;-^h9%$4DQu6a9rb72AA`SABqi~Dp!w54zMlZ(=6^WpaluL z8qnns{(jETxZ)8qVbGtzdz8oiw1;7Xa3i;tGo0NYrDFL&w=3h4Y81(m6DhCs zJA1sA8xam2l>Z_*1M-IAjmOmDiipvxx6Y9`*R)L`<&`hTVpZB~oy-6l+Nhsl;Wgle zx4$aSTfm@5a^9EL(`HXN*H2I2C z;#(-4ys6#~{2EasfQ%7}g6q6F6gO&%vrD-_>@pugbntJjXks2CH^pHVZYuAc==ek( zFJjm3PZ2S1^jXCJfhj;4%q?^MM0QAn>Sww^)q%z1J1MM^ho3b$W@1d*btFj+QUD zL)7rjnz8*$qJ;kg8<`o$oq2-+jz$dHcwLp2Tp?FGCJ`S(dStN&pO_jwEN!-D41fKO z0D$ONepUPf?SJw42kG(XPXZWSAy~j?Oj3t}E!#KtO;4wH6Dh^$H|amgTU%0$rs<$> zj1!-N3PRD%2?+@xc3OJ(-~gS^0M@VVV1D$Gvi~ zKdEwT#UMtw;&EBcsrjONXdObO18^=!b08@|^K9bE?z0uWLBrCF`%gvnCFK`qM@Igv z>MdLUqlJFn!H+?o*M@lu6q?6W*QZ`dSVEgStfD{bO2ujPJ`o9m&HgMP`hSI8c|6o# z_pgbJN`z3dWDOyuWFN|!v1SQl2}QPKA6wHS$~xI4jeW@$S+YyAX3M@4V`s9C-S3Y2 zexL92Jmu$)dD-s$oO_n{J)e8dxrZ24MYJJJM|b_~0T(vde^edA&D-ebj!Lpc8;r4c zvdRSM?{s;sWVnNDe+=;!-yn_L**t4i6M>Pf5nxlgI=XzG{V#On`P*hQgywGiU=DFYp)vfPup z3Zq+_+VO*Ly7cwmjZpjNh?{F{&(bdEJkN(7_8<&`fgnV+Eb zn@!3KX?PbLm9Xz-+@OQ;v-D_PiuWo{`Jb;dP_Y~oP{?bH?!TrH+pT~1Jk_Pa0kNB+ zehxEBQ~a@&cubI?uk10fG%X>Xx?&DPy~~Ch5sirTk(Qoy;=XKm3^~FlVLL!Xo5GCY>WChn0UxsiID$^7SJC?o#BdJLUzEwlxC)UkYm7pk z>@7RvY9)oexU4~_)E_bxw+USZ2aQvK1QTaQYl8}s)I}?Bl6ogFgC+vJQ?o2wNS$E2 zl5<|cgyM%3Z1UEAin~-vt8YRkclF#kw`Q`)%lX`CXp+zz0AX%szI=R=oD;sB569eC z#p-2>$~D`)k7051C2xqOzi^Sd(AI2GB9|hlUW53NMt?d?XnAUE7A4kKN ztmDOPn5oZawx#7R5;Lpb6J4X++^1+tOnJ>B7hAiNu*cNy{su@Zx%7R(+RM}X1t&6U z2$AVrm!^2LpzLtQ-Th0M-2)@K!noqfM~(UF3Q&x^H2>~+0U@Yj9oy`2OXsbGBsbn{ z*4clifA!A&;IgxATO?+h;h_`zI$eb>E9I^O%IAF!1b~NFFLil^4%ayvT7V?5^tz}7KE(^*tA$1uf zop61Q-BVXe9Nr#utACDNnOM48A0xXlL+T(Jw6e+N#&jhY=Rsk++2%tQjFZoS7XD0g zsMt0k*w;RrC;`j|)WR z$^pJJtENE$Rrr4(8_Sz5_l4~jV>+X!ck(m3$Qq-*Nnej2dd>+F*Z15s@2%P^Mz{Kw zto3icTHV>QOB*n9{Q*F}ApAoMoP&z|9^m2DI^-weW*GEfouPJ-lOSRsOwaRlPZ`<@Uo{|3V$rADs*3xvR; zvoo?I?PEJuO2*=C-`IrF*V(>`kz_jQp<#XmB1{=af(#l>ry&3q*c`TBx6B}2x~lb( zowwL>oJ$f}IUAnmVVz_Y1fiyKFrS63XYRSnlm=rv?X!ltE-PopPD$vi`Fcq>#G-`* zTTetHKPG}yoxS40_o_2%23&qO>$sDdPC5Hq`BmhkZX!Y*X709XPv+>0p~Z^08m0Zr z^xT`TJ$bb(yIES|Y=|?(c}Ut-SLligfv&|KV8)Pmd>2ODtGDv zt*~rrh*)c9=q^PsJ7{@2O#0K{PqF^^(Rim^R1hm&sct{T$9pYz0^T2`LYG_?pRpmu zj3eS^WuGeKL>iEdxao7Uvdg4mhmPiclmepe!nPOJMulEJZQt8Au{id8_)YESY*XWI z;=)29H=&eR0aZ1^0b2Hrq6W8_7bvqGMorl9#`ZhdYMsyB8?z5d3a#i}s%?3Q3vCd& zYLM+G`{QeLsai6@v+$@DQxraGck9GkBA&Re8)mDm4t5hHAY$h{r`2-l^e4s>j}CHO zp{Z51E*)AgcMA993|ZebKBz#y=zv%i^{-X9kU8kSbzQRL0WFPO%J}mu$kiBD@96OwdOC_Y< za<_XF2fSE1dJa-*3*A6D5^w7H1g=xMQL(h}gNXO0v()(syTl@pbf>sdCO7gp?HD`@ zB$cO!h)&TbVjoc1=PB_DdKfWO*0IJ><>3>9Zs1E_k>YFa^B7!Ev6%NK036VM){`|N zJz^}D<#ltC8azQFg6YUsCxm_Bs*a>gi@l^nOP|S^$`Uw&?Jfw`y}48{gUhzeuHtLU}ccX%W$~8%kjgLu7VKx*Jzw| zs>dcT^DW+ewaHs}o72TNPVufyZd)%{-J|i*S>dg116duPcZwV{%SA?lZdDYdO2%W^ zsenzl5~4niY;JSOky|sebHyP_VHa6e=Hz_*Z6cj^WqdaF`ab!>cQAzdznw=HvlQgw zva-? zxw-jcJk0dyPu4(*_}(X*VC~h@^=+r!=C$@a-?2W#b5K6Cv~G#0#MU)5R?iev@F?s# zTYSK~SYdX%LV0<4#Y>Mi_?tE9`tW@R*=(lwU|t(#Q30I|ARO-vuX1$Lw4!HFt9BYx z57g#M$}XGA9iJY0!yP3vP(EH?ssew6S1yinosc(fSh5B?|BudB|86T=OM|W~01ZxT zBF5io1X?PiSNp~kGj5q~PUPZGKR8+3o_gmI(%?H%-{y#mLxRR?QO|vz9uf`F0_r@_ zcc}epkzO-;pIl8_SS?HGu8&$^BN=AIir8W=_ zE`TFsJ{$H@CwlvBBWfW=A+8KdB02rcU9HauT9z&ckn#!(V!D-z%;! z(ovo^WP0sKg!H^%s0;3$1i2;>sF{u_mEPjbsI@Dk-$YOg3?PK}`MJ0k zL$1XxJb02fSJ0#7*iaxYlA`NTLwXvubP^3?s=Ua~jHWtjGRT{2J?B*a#c$W1@<{jt zP2hHDx!P-O4E8yG8+?5h%4`()bg;d0FMC9jVS@OsSAU}i+__cTtoLtR_QeA!E`Mf1*E|GA>R2+O5G#c$?g3T?d0Hr9`SbVQQ&?g$!U$ zqa8@}Dj-}dI{TA_>*Gz5fU89cxYcsGfe6PwTHw#D2c{D)b^nv1P|$IYT0%S?kCCmV zn3^Q)QZ;G{Dd4*OKFzrV9f6F~{t!h;2qrWsBWFh$O>81fw}@}`EQxG`c+Ur0C9=b) zu2My1vbXtat-e|j4OUF6p#&kI1uz)Ih`!O*JAr53_5h(~-Mx!Fj+K|1QppVJR_38- zSZfeZ^1jg8F1oc3v^PXmru70XZGS23DwCKA0=w7!`*t>IOK~sqYxEb;-_%ppA zfP8}}QzeevX4P>m#Q}7)g*QgcfrzCAfyt`o5M$sniE~80{pJADipw;(>?hkC%Z3r4 zx?+*B?5|4?eyerQD4?1Uk4yDkw1t(t;C5T~c+WvFRu=dd)lo1eccm?4DxPmYN_{b_ zHfSHjmSO1^%Cc48f@#B8;i893Tg8DYgU6A}?#Y*P&B60W5)d9) zY~viK4C?HOs=3jvq^t3D6A7U)4`xiiD<^hZ-0H#3S%Umqq^Sk%Av)H3S(O3|B^hlz zIi4D2`s5|s_ycl8oh4BmyAB2-i)*Oc|U#;z*w2kbCq)0OdI0J*KHi3)mu#s?Uv zTp^AIf_Y3+IdFH?p}?#A`qp@3R0shfo;E|CzlJd(mH0%k>3t%`NzNs%+ii}V6CFRn` zu%L6n(*kDJd+pkVn>Y&!*=+^0_mTpx2v`J@J$Vn{>vUWCVHk750Q?WlFr=resK;UL z9sl`6nsa7;d8))REOEe3z`<3$s;TPelOyZ*N5=ECo2J=;)%^eX0*2mll#kYa+hZ4$ z(YyfqS--!S;qnqz3pST)DWK9C|2Fs06A&PP_kZkZf(uY}^t)c52UC+UmL9r6oC9Ir zRtmn3AsXKKs062X1E#~PD zMFNDEL>y)Bw+z1dkId16`&=u0D&(2!+>Ix}iE^=Iz?!{YglOpaxVs0WXM3 zFt5W1LH*xJ>)>}uKxE?AQ(=WAv(Gm2LFvmqp53D}@ry+2T;blJPO8MiH+ye_bHqlU z9qdJFHbo4iYa z7ycjnE^jri+>b2L_0T-$2)i*CZ{-F!Kj3Cn>zC;{ysYS)TC7?6AeXJv-*@0G(bi*b zf;;%zjppDXc|2g&(h5}AUM}$fex@&agB-Xa;)>^jESP7DbG(U=i@_+vGy3k;%h$r3 zaOigSgkxqQFedcquOp=23yk%sQk%wriA?XC-vT-IgYTQSEn!u%k#%qYg2uFPi* zoIr^Zqw~XmeVg@mV-#KNg>ffS{+UcbD@p?Bk?WqUj=OP>=a3Cfn?1S$Jv_7N_+BAy zs%I(b`tK?E3$Kd7lizNeQ0Nd{70a)ftq#JU?{V+DRA6g#RzppT;Lbk}mp)9xLBXC* zT-wtCgU9el;c#}_Y|s9ERsUJ%d0V7gMM^+%(&!cQD~IUvPbI%{`zhn}E!c@QENEk~ z)P%)HPAsKJJ3=)|XHbkOi87goufmuDc&v0m>PH0D@yh$J?qbC|HK%Yl+cbxYng(ZR ziB-il|7c8q|3R4G_O_6tc8>}Q(mfpa+c+y5JrH))t&hph__jRxYW2;Q{KMc5IO;cn zEI!?vg2S~9sYP!_-!+UJo|&40CrbBHP)=VIGxrWS%&eJ>3c$fh26^!AC(yZMc+WU- zjW%3BVi$b^zvV~oMNq&UG>#Th(|1+dj!yw+kHVa`=gll`$;as- zji4tF(Re_8J|P>+ZF-*E{pSndN5$fIQj;o}`(8C;erO`(#~|AFLje@p%MS?HGYJzq zV}Ka3bII!&v+T`$uRIK$*u(m1QsYSZQm5r>`%@hA2s1vppY<^#SO9^~#q+ULt{T zsNaC`&qOEIg7leD7CJ)EEC|??tkOo^#qBvI)FJlHZqPDIX#`7ohe|_?EZHN_QB8_Y>>%&qp9}v_<*XtB6G$+td+$OBZ$I<{13B8V9=emt z{2wI0=dyzLt->=0^*O(_gr93e2Z41ssAr%!B3O#hVASmcqfO7?f z@}JRhP}|mnOS_hXURfWGlRCr%pUyp83f^i!h;+f{1xPsFo4<-q5^{8JG+$AO7A+Ti z@28RWf(Us+-s;(*c=8l>9_Ug>)qM>j33r1!Qr#H#+9(tIEGdY1kKEI(!)afJgXdQ; zsP$7tRmsi5@3EYzZ1^}y1zK>`RBug+ z8h;cbN}7flWl%4NDJ0=|+_kw>oDHgeI)Ya-)G4Pu71U4vKbul1*!)(MVa!ITFSr|L z#Sse_$H2XhS5w$JW`PZI*LfaJJ@gd7LJt?(2o{Q{Dsb;j#pg6&h2?y)VC|`iUw%bO z|7e2&ykN8yYa!@cg|ciF(nO?;YbAHp1qgge)KmigIz#v2+QW>l0J^{0+-}kYnUBVQ%1-06TiYfgMUUgvboc>Wo#9Wf5$DYmPr#i?k3{^%%zM|^tnTFB` z0^%F)&`+<$rD~cxU%T*J-wnev=p8%bB=;f_6*oo>@r z;T^igo5#TOelqxmcH0vbk&bTfTt=nS-S4|)O4DIlkW4VDYst7~8##>UE24{ph4Tsx zjfgEEP}ZLog-S^RFgCWY?p(4{Gsy%0T*&+W-YpO1eLJZ|&v_$Hu25D(-vE#qm=IAz zx?Hd$@A3CUAq0rMIdgCe(*)6&gz^G*ULzGeC97v&}a1;0N-mg+}*=hj+ zq!mx8ybr#gmpeeT?v45SY9SSnkrDc*Y<6CMik0{ooj#j^Zv)`FMUfHUZP@> zETb=A{ou@XTk}?H9ueNidhqusvy5;i^^nFQMJAU2Vtn(XYv7Q@DqAfa&rg*Y1<-TN(@ z6y1cKw}HwWEv%j(su}9WEP#zC8^yn%a(58`cx|Ktg`J$tj9OqyTB7HfKPviBcJ@@r z6CsGsIreHW0!mY|$XUQwqZx^YiFHaU%d?o1E$0^}IK+A_Re1cs;}R&5ub-NcwWLYR zH(0PGX}XCE{%k&QIk*=65y*yiKX4vMjixxaN|RLf@VT(-n+*x5MnIr|65$}vjUNEO z@RNuUD%#`dmO1x?H0k7rY|Mg|zQklb2ZPHNK|%WWQCy4ikc+p$OC=F8w`fZ8$%@NU zS)gMoC=dB~<0IITQv0TiFEA0&ot||pkAx|OyQ78?SATejh)$R)VuTh_qpQv6bhJu# z?JbHS6~|`_W|=>9mNEZ3=0#Otx=&y+LNEjBkRINpI)$VSKxc; ze&Cl+Ym&(oY^1FL&s81v6so2*-g$tU8}@=I$kfiFr%!P0MKwxV_kG953G$c)4CgPp zT)fqjoI(QAOO?u^qUh|{p#{^lF=$O^`O%gs$mLoY_V!`MvZ>U-yE9H&T!c<>n3uBD zT=Cu76=gJ4yy%=R;Kv}!<56HB_A*NXJ*${J%PTa zFyDpa3Om?Zs!J+vzNpC7a;^!D@rSHq8mF4kWY0I6LC0mI$&Ip_iwRZ=@^>OEF$YeN zNr%KZW9*OpPSeiG*ET65E0Y%5Sz})F_FEJQ!TME88B>_TyaTAqyj9`sq7|sjhYJgnWzcD&Z-%SS8$ADl{YWB0(v zC1ImmntWyp0j9ci7UXuTS25YGF{F4cXBj&IQTe?Rl90%7o|@!ll`SWss4 z;ksv$JC_vMOgognn$>A8H}2`KG2S+*{;v=Pj=8Yyj*&iDoN!R{^WdwILYVt-&@HON zgvZ+%oSZZ7cKIL`URv^Hl-0w_ep;e?q2~6DE3|pQ zlInDhY24l9wx(T9exG-UGHoDb{+TOw`AO0>Bq5{pH0Vpl67GvWQ>u2kRH(6lYkoeLjUJvLMtPaXuF${Vxch@oUX__;AQ{Fqp1#09zf2RDtYWhk+h|R?( zpD&H!ivRMlM95yd>#TGY#AXbpqNgE)&y)QJm zmbRJ@DK_!1vX~-Wse z;9MLm8Bk)|3l9g429Ae3lT+&k(^xnxoTwN{;&mG&=DMRq6$Oj=>GNN0)>92;aHj-k z0_%4O^K@OtydPA}+n)<$oDvlX;pFk!sC!yKK;6~jB<{Ldx}+KF{Ikw5Cv8Rnhm@D6 zH6Q57n_zl8ybakCRHMRd+qNz+c56u=>uFs2@t`%Pu+pUoT$WNnpJq0NQk%uwOL#={ z!izSSD<_k=ol)jJ1Ad2;%JTex_VSly>xDlgRRz7zPA7&GR}EBV)dFO9b?1&TiO63a z#e;h*CqU48h?D6uilC&3E8Y&xbh>@pEAwxVF^lTNfa@*KXJ5EY?WAG$8}MfE5m|H{Gj zExE{JlNvwI<&fhzqiNdE%8?9Mk2|$^bQRD^U2NW5{@U8yiD@h9xO>!7>{e*o?dNtL zM6!u<3kScpebdE_+k%e~=Gx16g04O}Lc>=bb+^tG z$%t|HLK?0<;37)+cKX4ygG6RJ`@bPdRi+p$ydS9@{lMLRFq^I?Z>dTlaxKw5)B<^I z3{$lIh25f1wPviM!OtC2!h%SbUj~IVz6EEyb~?WI>SlicdQQ${k^EQP|aIxhRPJW-Y-MXd3vOldKgoZ(#XWO-b4C>YMR zA@<6V74h{|;7QW%HhS!@q~XlYZerq_<3b31_gi7^z44WSF1;vY`f|n9?Gkq#Ugtw2 z)R3X@rb>yKPJsi;gn_55j(&;hYQO*17=I_GoZ3-3^$!Yr59p~gmvV;J4oswvd zb#gz`H+L2)ob9o&pg?qarzZ+{>TFh zFAwSmnqSqp{TV|-SYMlM8a^NOFzCW@*e!2&{jh#Zbh2> zonGfGWY6wN;IykNbAXr(yb3jx9T(r>Cr*o&5y1p?aY6|!yt!-A|E1d?X@0k8` zC0^oQEM_s5Eguj_i72i-l9jNq?02o}*o+Pn4VGzULg z#PEHzFsZ9V#c<8;=`k@HL?KUx@{tu)#3o%vwc8YR8x-Q89^76+cWilpH$+p7{rc*0 zSYGqKO|8lECE-^bM~NIxs3BwmhAzI<6`=L)H=@0ihrj~!o$&)UZuEVMrtSTv`b;TXk}{53J5qEhiPmjLb4f1( zOdBT%QRojvIi#X?95ys(O#OM!GJW1FE`h^%@sBfB!bW|fi`u4pU}duyJ0HhJwTTkE zIFD*=Xd$A*Lf3|tSwGzk>bJ_m1AE9i ziqzE9nO_fS4XS2|B)>c^lE-JU-&d+Bp^G?I~jgchbC;5}Fg zFDSVfALHO_Te};iz;oYE`tc>lg#SCG`jX$5QBd=hC2Vd(dE@3_pTg?f4W+^8Un4^oY|=&+V7q9Ko&$_1iP~cz{Ci z;rDpj*%>qUQ9a`1ZSda3!UtaTf{6fQ)56I2)_Q>+&d)HtS5JgCNmP)28Jc^F;tf2d zh2LXirzGlqI^I1$x-%dsOKb$5pi&O*WMV?yy;lyzX``X01ui(7_9fEhcDqg`Vf``( z?n&$bJ(2rOT9#|bXq-^driZgd{X08pzX9}};iaE0>&pkCX@Z8+`&RzDpH+rD#g*NW zgaL!&_nfAf3Uo8DniiKnnTGnfP!Sv7Ww43A9NYPxm-mThM<*rBAty$4#*0|52ycHg=5RhAAkbL4^h7@x*-*$IVQWp zd$^plAvSxUsPY^X;8p~bRlH)g&1LM@mQO@CmkWLX+z`P}422OO^W^gu(S~+*(qHab zI-6qlF`x%nj!<U-=zuT=1$7(jxzuyg_NAbNq>VIQXoGti|MA z2=F)pV!wct?>&wG{o{XJy7|AL4*lE2@iV)fQtZg9q$IEX-;&ES#O6>1(~USEr5Rw~ zUAYWvL>TbBVwRaCy|3v%97uS|swTA<$R z26ZUJ#P6Ll=BM3FvJDjm<%HAEHwqZg zyeH{onx7p|T_6F90j1yA>*Xg~9X`+uqPL%3CIr;k2sU4~SrIiit0ZGnL_5B?586-S zRAY#B=s4XZ#PRK5Qyx(3iNAaDkrCPf8(*CB7-Chc*Is=VdkKNweOSig6@M$pcR^Th ze#pg@tm`;?o(L{ul}VZRx%TdOglLKiRoSSAyVP@2aNuQ|nKQ$G@g3-HSfiV<_yT#JZm>?Rq?XLmi~0 zv2n2QY^&~_*%T(Si5!5biH$Q|wQy41oB>n8#<@jq_tClhh7jXCY={f=HBH18IpE>E zefri`hF}BQtxJGE#8C}C((z*P+0^f_juojy4v?)wPfF4?=t_jmA+fLqA?D%$VT0oL z1`CU&w+3i1aph|8ejyV{Kqs^`wCmJwH(TvKbdO2G!jm{8_XND>ghA+F7_B2C>-@?9 z8!rG(zk7!0a6gIYKl;5O*U*l{ zRWxo-O^BaHq@l{5?2K;5Y%JA)KCBx%l>KxT&6HEzml|kwwR2mRCH$N#JkYJdUGFNd zXzc^CN|~+LZky35q<`zfQVC;&i^4~FT2=!TYA>g#big)(LR@WPdo@-20qr!`%k2+# zG&V%NgL=28V7O7b)7Jcym`RX3-I;d!7Wu8Y#heYD4L#8<)OxH>9zQ201Fq?D!aX+p z=iH&&=m3)S5G z89PJZu112bPJQMN#Gl2+!$OD4r=3}haCU}bi4ftfh1Kz9^*rr%ueo(aNy-B%!~D4o zssR5-Udr)=S1Kw+AxptY%#aD;+X4KB{hEIK47Q%x>HR4Bo|k+&E!4#<7MHnm%kSH9 zU|&<=_7>O=g=`c~K=YKPRdmOj>B2Fz{-k}soFiU%NuSdB&yc$2>@NP zc+1m*VRFJ%X$s4QbSH1ZCsmOO?Q$w+-d^@#OhL9{5q@l(Qf%bFT)ZRJeXRYV>r8%P zMI9?EzH4_)E9t$&bY}e}ZG6zneKbC9m+9I{?q0mJpn7NM4pYKnTW1XA_XPR=tOoB3 zXxedqRgvq@@>#!rkfONoEtOg_%@`k0$sYnqjOR)L+)Ic;LH_bB^H1q-Y1vXgc=tse_WCD{6UA&cqiI~dWt zJHw5*DTw?yk-={%(2ncXuaUXJ>InH-Lj{T0DZs+mj%nX;%qiW~Wh&YWb8C6vJWm_@^KjW$ zuoXzdX2FN6?2I4eRpcCphBA$IS7Uqr8WKmjphg+umJaqlJakb5JJ3&4ireU{yM)n^ zd?riYOH0!O_N6ONzUfxT+y!%m-qdN9$@g6Sw)L0vkVdRgf+x6-p3cV>61WbbrI zj%wmsY@ou40^b#2eHYWX;UEvWzD?WbXS-@>tUlNIP$T~9V2zep`&7!Y`ca78XiXN} zq`#8N4P-59BbOBNz0A51mf;yE(0Hqm>N8U3BV$m}?Y*;JISL&gIhfX(4ez8ZeoA#k zgme9QR>Qym`y!6AQ%*!3x~d@jv|VZb%zp>13eR=5^t=vnwt3lDEh>8H_Rh6i$H3J0Dl21k zcb@gkDgB)pbZTEQaQ48OL++}F-&7UeZ>gk2;WP*Yi{8fx_DxDc^x>?1JELong>lYv z^~SUv6mt3}rz{_b_Hnf(FRJBKE~&<)VRQ-SSC2I{Qx7CuyS)@^5+NS&X{{u*sjJmK z`KX9CeUrk~zMZlwv1FZpZRPZpdjDx#QchdP@dKr0Q0=Ox!L7CSO6OVkyF?pD=;NbY4J_@5~@D#t09rGi$Hp6 ztg<1E+cCZ-P>D0fdUUPqhyr@J`jm!fqD}SkUZmi0thQGyaw**XI)ggry)+8^#{tRZ9bxxJyR2^xZ9ITC! zs;YX&=uh+kV~Yvcf20d!Gi@sJuH1l+$Q^LO2dl~H#0&e(xB}4+c6P`q8pq1MHd7Q1 zLlt&##*S=~Hk(Z3+RbLq=;h}a-ssY;m1I{EC34ZB2G^YFKJ*SD|KJKJHLMTfGSs;< zbOd-F+QyvwF2m#~z#e+U#vmx~p2VkDkxO;VEQqMVt7q~nf_nx{HwB^!h4u*6^`;<; z1tEvBVl=t$KRB~;f4G}eIVnoV(8B~^NRC(;=*~K=Ho^=?PxzblW*oK#Le^o}Ap5;k zj;ZMdSh1|L2o`^6iNg`1Dj3<|GZleTP8Q_#VS{7T)2!VayV7a>cw&FgsAqeiHAsdU zBr9u)0(ydSv%h8aP8Fqxcm`J+y=NoRQTyR*Qim#dnqXRI8JLSim!$0N^`bWk;aRYj z3R-Y3Ihk%&i!5xlu9~+PlS&DKyj6%q!*GUYX!x_kkc;21x>hIU13CI6;jx@p@%&1k zqk_Q%X@Q;{slX`Fu0JfbN|{yR1cz{wSxt5A^l(%$M1s!1znQhX4Z256+~kG(fuP-; z**R@>Hn$p)TIz>EWv0c?q(*3^x9d)#N0JWMTH47lsb2{L?MW5SY^7_T18VTw%|*Jj z3Uk`p&39!ooA!l=>}E~;0%PL1J7GX%uiH1=?LXv3ao_sgs z0ds6&W3O{hh7o`NNS4uUkydv{G|~d}sP)Vh*t=?6UwwSYLZVJ`7BJUfZ=7G$-8JMn zN#h#*)yP4VU4ns*ep_b~FL5{VEz(%v@+p|rHC7!aBUBQ};8J7z zwIlkOJr{4hvv1D{0-0N^PVJGCcMm_i{`ph+EgZLFH^Va#c20c$SBD8FRj$Xzca;Z< zm!?f_I<_R_2ZTQKg$L^%A)1*R2`7~hD+4e)YA}|2`2eyw*=si(I{O*z{ z_smuM5qJ{89w1bAbZs{(k8XOQXk5|XE?<2o{kU&`X=$-c(=>to66!MOeLXR=jdsK2 z9`be_YpHR@pt6>ENdeotqH!&qAVf6Ti%;P8%{wp1)c3hzvaMVic#g^1LDBd9$Lzu3 z*Al291}yy>1-t?cWbyvE-Xt6vo9jb)Qj{|GsYBP3QL}f$6WJreEvt~)hXzBDKCfQt znAQ@Q8?fkDTU_*aM59ik^Ow1}N#n@)8Tes-e*{Yj*1qA1d$M9UV$FT`g40_pK_YZg ziJ_#V*I)Sww+iyQ@<7M3Ure{nY%%B^{-ZWjXJ#3auYN2 zE?P5oHVIxSbY+~*=7Sl2)K;sAXJ)LdvuCczrH(HX<(3usNm#FNy8?Zrofu|mjzw?A z$4E`87&i(VQ>HXghUA2Za)7sAH9&}1l*-senNJcHPKvzW84-Aw3cbMAluXXx=1zU4 z2~w?8U%$!@G`<>rKU`K+;2-f0MK|(3cQ86rp$7;9&Y8>jG_>r3WA-@v9x& zU`I)TbAp6k)#0Nym<~~;V*Yw{wW}{fe_(xBL+#XPv&r|lCiUxHzXj;w&>VPavE%0~ zy};Q({{}oU>Tc&q4;}&An?`Fhnqut-Yaw}wnd`00L`WRnz^!cez}|+2Y|X4%bZDs4 zTwEe-Yz>_607h*=AY~f4@xUYKHrUO#%SS;TFYGG+-=xgT@0Z1YvgD5JL#6a1B?>ocu z^etN==UxQmiOfz`AocwcDFqvgF+0lBWz@^Gp(Wo_9a(&^22(itg~8=Lbu)|=DMSv~ z`>4gjYSVJ!f8Efse)c=Jt%JVK&emYp&n{x;)_d^kUZ>*0>v1-;Lo7qg)u^qqgM4l> z@nx_aUMBi&g&Gz0@d$R7)=h!Rpm4k)6-Q%UHYNa=0x5`uSa;pDv8C>p4v}ZrB^qS< z-Vy50lp6dxgLD!R{rhEYqwaZG>6`3ofS0|)#)D}exVttN%c6$no?&?d9k<7b-&Mye zT$a%Hn(x+dx(ry3~0`3H1UI0Aj3-qgyXT^@UYifW*OvT|35O| z?;DGS5MzUP&+QEZ?c-3}pP5nLh|d5uEB|1bq!AfY8uX4JR3FRlv@#KGb(zvUavO93 zk^B}s|J+3d+!f(H@u|yXY}wUU3tjjT_;*~~hpC7gMl@$UZjPj|K*fVa=!UFJ*{yypi3I;3Q>Df)t9*c zUKe?UVfP&p+Ul?P-@+yX9?(4`XVl979?9%b6se~w+X*jO+xnI7RFw4i5+oWVN*$Ci z&;h{z={zxA2M2brAEWaDJ}MM^dom@!;wk-bvrhfVPGE*PXq2wt=cH@Bo{bNuhn;6AG*q#{`wN_tT`f1CP0saClsC+qSs#V+POsg9X68AmW=(9i$(b#(AOFWBH^@u=fng+67iP z9ucDOkZZ&Il8^ps1^Lgg0Rs6wB6k)Gz~jB({j__z&8o$;a0;4bk~U`hR&ipT+LDPK zbM$#F9yZ5f&V#@Gc0#*<@@n>eB!}0T#3u-B+Hu`%pt1Z}=p!8mRI56VeF?(qazD{s)UlJ%*ZlA$9qlHa;Ho zHi%TX`Qo$DL74``=V*O=H}Uz=l9O@Pq$+8(S`FU$(e~|Hd0xfZ=C|aaWUA_a$pC2AT}7t4?+P@HTEzM)?~WRME`9sB*Wo z*5V0j9MIl1>?Ge=kB8@mqC7dLTpEkj3VlLm{qJye5l~rdk4SK6oTQ!9;+>K6*lORb z;yhDxrCQDiO6L7ZU{&ar9e^_VclIJ6x#3e;gi0(m(r7q7b){kBwR}= z#6wYFg~D6#C1623V)}OBM_>Ndv9IEHhUR`L1Xh-40>6u@-rnBP+~ii<1B#*d9J}E; zesN~PjF4(qhUcG?@9X*gdGUOZ^i2tNQS0g>D>`?bI&9nw9%gBKQBLxoES8kvC{UpV z<^A~6EpaVuc9OVojASBJ2uYk2%}Q>WVpOjd8xw z8uCtK;X~f~?t{!9+Y^=K0TPA#T z>Fc~_hHbcBpB3zpSwPEog6DXWl)-OLjJNPP0|)`ME5+n}Tk8Ze7%_7@^)R zx0hJI@DcA6>qS4d4bS)UCThLL;uvo)kt^7KT{tumeme1O+i`4+QUY`|a$FIMCG(8* zj&-+fR-omEvCP6I+?cxbke44AC%FK+g~GKK>DXi*+RMVPKWjE>r@CES;13uF^+lLi z{4z7=E;%>`ne8_wdZixW*z#ipe5zj=D4wR<%DmXloRE+w4h|kNXc?XrxEoFRO3sY& zb)|m)$?dy1Iw88(NpX3KJ-wr#)R6=!$?-<@3$mQ|%gKu?f>DBa0xyK##N;6PP(Bn8 zON~-ngCwkfT$@hFg)&B`F6rYhMbQ|8O$>WW2}mP)>9y+$v7{n}yDv$4-#K;N>Or$C zf908w;*T$^9%F9J+YVKzyU?DCa^lQB8|19Jvhh*T|9-^}Vd|3;Q&ens9vE@di)q}r zsFYl9C};8fwS{k3*hy<-wj=zpdo*>+F!>vZ=Z7bpGR9=k&2LY3!Zdj}a{l=U52s2~ zPN{yGUi_qu0(<{)b$Z=vVaB7}I?TOuDoSUc=Rkd-ups00WK4i+^k{tl1|uxbA>pb{ z!OY3{D4$2V_2Smz7rc*#U#_PQw9I{peN&2|SF&Ag<-;%72KOr27Al{Zko$UHn|3}^ zNvV)}Jb4Y}DBzG6q`?l}DNPAskPZ;&$FtOD*$qE<|HMC^+KF|vbb{P)kLx-X**MSD zl0=@02JJ@B;mb`j3M0?`2yziPX&0)Xp#Rvhiv)v$vw~ z#jrTrfxgU2Yx=D4N$6RC!<}n?g)+ONQ;4o<^GtF?9pUU5_b zavO(1i*j8-5LR=WCHLBNU-Vl!Tr;Ea`y5z^mVTlNd)J9ML$uFlu3X>Nros&G|;^+#Qak>claP7b$%q<33uU7OnKt)#@ndlvBF>LAOnn z4=U-j3K7_#+A!y_#arrUX*mVv1NHIc(@&RRKj*n$;)TkJEMgtI6z#MKSEfIWu6aF@ zB1f!Nu611{;2T1V#fUSB*3^{X8FQ;f2Db5WwDde3qw#(r7|TYZ98+eU*j}cKEN^(D zL`km{omYG;IGDuF0Ot!fpQt0nY{$rZNAS|Pkor~Edj{gA%WABI1U~&b5!1q)2O*=_ z=N;uar_By*?IL0+{BynU*>)-Qe=P#3O<{iiH7mSs9`d(z3c9F3=~(fowKsIj zy=D*vV!v(oVavLr>io2~i1NaynSX)3k^Q!gEF%g#E^2&B)Lrfs`q)uoxAf0%^soVW zqam(uF?y;50*Q@Z0+~I~BnvnA@*f!4IPJRc3KH!vwH`F{*BqE!1xqf{5&7PN^)eK+ zM$aUk-_m^ah{gF@%ue_Ivt_?{bJtCD9*XKbT29`_EIm@U;X1CiX8tO9ItwY+rBT6A zscS=eToWN$4$G3(LPZ5n+vu0j_B1*@axlNH*uKdbzZ735KLh={F!L&pYa)u~^P=;^ za40J^*0bUoVV2>h8;!u=AE`YD_yi6a=3i8b$F~m1q<>^*{17vR&H1b1gbVWeRN2^# zM{-$Q5?eQ%Rqlix9AQ^R=^Kxo=fWCa_{@#Qd%=D8_uvP+xrwmTcl3u#^=tIX&}*ov zgGVed=`;1*GL~Etz|v1kC(;nVg!eK9Vr?SUe`f`{&>rQ4_O%W*)p>7flE-V~Hl^;l zV!zJ@1V>fcgd$eltUzJDQZSDGqx8*4jI-(L*=N$`mz3siK$RqNl#qM#7f8;xFE&j! z_&5iiVNl!yCzOPgvq?}9RvSI+6`$C3Hcfx4w~K{Me^8K5jAP97-Y&#re?ztTZT(@t z!b=O@K7CGJp*GVfTRGFX{<8pX(>&EjJ|RgNeAm`N?rmMyy5bUD&#{nEtf5!Ak*Vte z8Xjd@G+2EO+P8bVlk&uBOuH!Ja1LjQcRLf8szTd`ij}QxIklB`)8qOYv_@>by$eZl zyQh09+)U8hqub+rD9jx$QQH*9_%J4G(x7VN>Y?g_aX9Hzj?fT`k&?@#wSH`yy;*u! zi^4HpJGl!FEmkS6^i#qhmaE!>D_x{f2_phaG$hqEfx7m@xptF{e*WSp^$G#vv#DL} zD$a>|BEpG|pFI+y&PE&3sN-y{ZWFY#S@G@16{)Ny8;}+-$B8Do`Qx<645o9j#)P%1 zb^DN4*S|#`9|B{ zX-=_Df8hV3_$Eq^vt^{JXdl{i9j7r5uDBBcuj#4<5_iyiOe|a67dZsEWOymL5lg?hNEIg)M1aB!RJGgX=Kz zD3NHNRc{_U)>D{pIginT5Yl|A?8I#s0~%Zfb1$qp04&cHuCu|~WY$*4z?Q^jUw}}w zO}$aK@*TaxmDII|YOC@VnX|EI@9k!OwU$?%I=cw(F`o;m&cFU{>dth#n zDlZ{-{*hUFTu0TuI6y_uN1&Kly?zSgP06!wT7WFY?iWGI!)>CZVqlQzRVHg9YQX?; zn`fm5ZT*P(1)k(z0q=XX@=rAJSMP1BuuG#p2=mFB*IaWgS_6AV8D$&i#gk$&X}S50 zTbJ8t5A}kL$yv`+%i=a9qz6lndQD)E4)CzxHt%^_9S_I&P1rus3Zu>5okB!Jn*zmp z56g^QRGnqq{@-K-h$y^At49^><|~p=4##Hp$ThIF`6w#Dv3nW3 zWA^;)v4~sN?NITN-T9neql4)YaBL#X>$CD4z2z}D)?*#R@1&&-tOMfQG*IL6*i2jL z^%n4P>N|^w5~6a@#>k6oaUP8b4n2u6I2!rnDi;O1%hJ01Vf~YOY(6u7k|Km0Jst?c-twVr8hWrc zCEvpn23oaUo9InVoPLb8Bn0KI-f&syhGK zfWGeC8rao_5>O^=Em=)n)_=?rjLgi}%RkXqGRq#)g!}Z3ZP8w3tL^&n4^=gL@p$MM z?xMaz@aw}HaSv@_AKfBEmlji4eue3mOCaT-LJAYS)~25aKfc_xo(l_@Pduj0@ScG6 zTa|%6d}n3!j?IBEvcH$W^X<4QeNdzGH3C{+{0kPzOdyzvC`-2J2QfBzSu0$fV>*d zLLI(7c-fHR&#&uG8T!ReP;l&btUaFK$jmW4APcfCkw zzy@gSn3MWBf0JG3@^ur>)v9=<$Jh>ee#@Tyv$%76(pj{L6KwnaCL6TGbmyFAmU9|7 z$W?GxB}q>WUiXp(5!NZ@_TfaQiQ)`5szpchNuwpcl>2Mt?iJI14Z7Qp##}r2>cl`J zZ2S|C{eAVyhN9>O=2u`%3!NFl#RX3XmGLt*A`sEgWu-;A}>&+ z-}z#7wgfpT*fr%ZFYOc0G`$S9wFaw03txWLb;h6(WI5#HJ*myTd7D5f@vET8BRr+& zBi0H)H^2V;b1eHzE1rkU zJfJcI*%)^r7l2Za0Ss4*+WgXI8!b>q>P*b+gGiTdjOirK$m_*qt!a9ZvFu@-UL?GW zspigC`n4G^NQZBpfSmk7roqViFtHE5maB;$b!cA3NQs$Wg%)TL;d-1r< z^yP51*;9kKBbW45X2mAk+^EU!N*JMj4L{LPQq8&T1*}aZ(Os+UCTAm z4|)zg36Z|nRQ1|@kv=XvNDRqej}K5K*=zI)7y2CRr1}#*rLVT+9e?f0_JgV-YRa4G zADjMy#AWS*Utd88Xm zZY%Dq$yuYiKWdvG9sV*}si_@GS+U?$Y%<;t3P42{a~I}V+bgyoz}%W&yW_) zsrA9TiI`8P2K4j@y>pcYGn}9talorHPkiXZ!!-9cqrr`>Gwb=8v*$CZna)of6>-L1 z^BwJf_r#p0lqTN9RMl3M4lB;&puzZ-L>qI#`XWVE>>%*xQyH;W{M6a#`%9N2tu@K; z2&Vg;(K8=YUGL$nxX;+_a>I|40J+uv8g?4Ew;oBXQgbB?ti)879EFW!{p_U<-@Cbye_MH`iOXxd;0XF$@x}37PKoY z?w*aUoz6gZ#RDJdyBIhLw?`T7OKAu}GRP4#Rb#VGkEUo2AiUeimC|&=&7rUv18J7`au@%qn>Q#jUSmB20qp{7HcJf_)dhD| zP3x6ePQ-?Pz6GGOp3uLyY9Zb39Ao};EQ$j2uX0J{gH+&M*y%Cmu`nliM}1yEVNVIV z4eej+tZ>!+SU(K~(jcFqoh>5&l@`*I$)1o7fDGH-?5`$H@4v!aDaeBywtDT9${yb4 zw)Fi}cTbJJKQQo*RLQ{M*GGeWtMGH^jc&WkuumVx(Py~LOr*jxkT+@Qf~IPrvts|w zQ2v%+?`2|ci=QsgZlUIjtybv3n~xUT6_BAf^Due0C%HjiGBxu5mgkk@88u6r zPAq#!z8o&C%3s$2`<5mli=XHIu20@9_SA_j_Ba)`V?#$V=H0g*FiVrv;*HLZ-dDf= zr>BHLz>*7_^e9US`Z+eD14;>MSU*&D6KVZFL5~5cGrWLG*C(r2z^U=xukG~R zcts^qzAZ5p-*mn)1ty{Xn?lRx1vV6%*Q>@^ ze{pUr02UtaoiFJ@?!NsvJta`?dS(&&CXD+p2!#6^me4A7I95=Cq{i^Xga32n<3CZr ziWrN^8u6*B|D~Q{l4g_8YOwU!a;)Kfrv4v||BpldogV+h&;P&S|GVUWG)lI$e}5&V z#d>n^uD}Wr5BR9apI{V`M5>Qu{-9)mgk5%Nn!u~ZFXewK z26d`TvlzUF@&CQdCh1Fp>d5pmN1FE0{f9$ZWl+TM{%gX7VMMdhynQG5AksLa3O^(% z%e7x(@^fV9AM?NjSjD3<3Kc8spBv&dKeTp*sw5dv>HhV`$RtXGLF?ycVO#c&6KuVf z+WRkK{0Ez!tS?D$<-yg3Um42U*d!@;cak{L-!)kzyBsCih{0-@RnXJ(qM>OjsQ8f92YwpRE^Y$S*@6dfw)bHiN@8SJr|BRqaY>bJ7GfJn&#C?zA9(;cVcTB;=i#d|64WYq)1>3r zG(;bs|Gy(xy>FtyOI3Op*iI6-(J&?iN-OApfz%t38GPIG75E|XgV_{+Jq;i!0YX*k!Cs7v`k2V79SxCsm*o7MW6u5Qt^W)< zp&tPAM{9O$FmSTxx{M@^xuvn6<@&ASO2#+QKYgJZ2?F}*ue0)Wc2&jyD?9o1ORd%T83t=Nc=% zme&3+rvw7-MbC><&X9R3MTP=4W^UMTN%Pi3^DwsDji_}1^dcED79Fn>9p_W3e_y~< zBS61%5+o~i7%duhW1B(!lVRx*0`gmwtOj0tCu>dA5VzLpmutL(xI=U}uSr+Fcm17) zc%kzDi@mRYh_Y+?7bFFwR9eC%qy^~~r8@+qm5}akP%!AF8<8%lrCE>$>1OF>N$Fg^ z7teF!ec#`g_dj@l5XHT&bLPx^X3m^BGqV8CxJw;T$=grWqj~FAN<9?i$5iYp6a|KG zp}_RT?DOgF-2Rp9@l>Dh-*BNO8eo-}2V(BvAgtz;J5!?U^rNiC?15a=cD3V(yf%M@ zfMeodU~=-LGEhEsvqSdFG+Iv^b)z8d)1N^cfXXsr#qBQpWiP|4xdpbFL##f?Mq+G= z%f1bFVvk~ZJ{DvC$mT4ft$yqxHO;;2AD+t!V3>ZDu|rIR4SAOmtYE2ChoM+{HeCay zAZ+V8f-BrJG&qsxDNF~hsGCtathwLk0UtZz^JI#%AxaY1lrU(7rx?rP z6~!Nr1HG$2*t9!#?ImzVyKCnVk-n7vpxGGAHvp4@oan5J~tb)jqm1_x(27-sDx6P%Zag zm7xSaqzq@Y)H__LozeKn`-QYQ9TvsC+f@0@8Sgql@;}cRMBTv*P)=%9T6tdR@}L=P z?(xhcaS)Dk{8~Wf+s$s31_Na3c>Y-Q;xk5vg_TAh-Tl?sy@i)w@cuqwq0%bleYkG^ zG=)ZBC;6t*THB^2>p7=rV|@In;$3s4zb(N%$uu?0fN$B6fg59TyYT+|wJQ6a^{NyJ zN`Gh40ZEiV!>d^KoKHpxhElZm#|kI*vqJF)Z;ai4<=9WB)b+to_|0lFAQt0f)l{~3 zJ+$GgMA^EO|H+#C%XUO1igpqPitj=>>P-Vz$tHI`ZAfKJ2K>Xih*A;w$pG;D9+YA; zz8_WFGgz9SI3oo9(A?-RhF=NJ5q)&SRsduzD2&nUIo`I+t9)gBJO$JHlLW_KmB+wS z3B#(|1}s8wx4j+54B>R3zWFZ-MAOJo7-QLg8M-7X=Cz0+ssve;ifT@Zd{W*KzRN6L zjjJAIG$Yn?gvSFNxBtbf+Q zQANGuA66>LS9F;WtrFKH)kag`_Y;>|vRDq--qUKKbuisq{b3j8%BS&n{F%kzI)Xw@JU_w}7|SMS>=Rn1Dr%ZcePQ?PP7GywU$= z)YJ`MYgn~Sj3mPN$GNTr(3<-$DW1@I=4jrF-pP74Hank3T}~-B3~DZO*f;uz*H0t* zbFO*R(WC)Bled)rRu$ZszDlMr8YS@$u~8`kijQ<~y(!_{k<6&l+eogLHxu&`6(`02 zV>$2m)nNeYK~)@yc6tJvrbtkxh-h3u5V|%{(=a96C>l`Id+m<(W9>DS5plrqkko?d z1ZVN?K9c_*8gFLd3^Dw11yZ`P&45?-0MJu$F@dbaDR}O258ZvC3WW8&M9sh7eG1SJ z^)0ccxwFZS(5)d|peBLg=2HfIV3Q_Jro|QU5tML9FejKhMU%Jv^fze_fR|f*8F59R ztib1Vpfm#X!`HNkKilOUl)Wc_DW>#bmZWNQA)^uf_P3`Z6#-BtS2b2Vv7a7C^ZdpX zUt>Vj4D%prbU%sQg?Y8-?HLPSd^I45GSbRU>>F|)YFc;NnSr4 z^AouyC0F*ckA!a|zO)w~Z*@FIh(QCiV>X(2tgtm%@20vR_B!UC@vi0GlI)_;jB&h~ehxB>Zh zbXH^LM>}$%A>O~f_d3@&9x-Y30hwBw?L`@iyguv0hmW%C6qvLpw|(*CK}F%O z-iz(wlQkS=Si6}E;&heGbq?Jld$FU%jOqL=-$?(;o;;qWVvADe_f*!1=X3egKWQUo zlWX6#ua5DB4A&^gBTza&JFO~2&FW>3m*$N%@P|hSysB^j8Ud!#{@%*T2$Q7=Wkz{R z$S~yh)Y&!@|5GZn)O$j^<_%r@-cO`dBhUgc>T>>6&93*Dx6W+Ydy!S`w$7i-WbFwX zWXtWlyC2()@XLyDsuwO4mQCMu{-mbsm5dGnN^(=-XX~+q&>c1YA-P8;UN-#t35QcuAzPu0w|y6}}&0KEj1w#XwY3;m*-|o-(?lt`^Yo zZ>)HXe@5mT&x4U5pnqW4ueQm!naApMTh99dW|J}e8*GtmMU@_jgdS1)c{@|3G|cFM zuTwZ`+4y?(O_sw11#FW_C$39|oUD%S7oDs&d+UGC7nfA%#Vk^CCSuh(eL-7H`PwLI_sboRsdSmSav7rEq?{M_{0?Ia*i4~n>eG51Vi@TQyWT+Yh+zC&QHC&e3XlSgOiqZwy3TW!mrqV?E52Z6jDt&<$jh*r8nrSxGAoAI*qlo+9GmCqM0=-%&eR!~@=C91^V^#|avn5@Z{L?- ze9A^stRPHLL@Ad+842H9@=&=nV==MpbrC;Hxv2Iz8k$ z`s~bnv?(8F?|lkrje6Tlm6S)dXOJ&1pVlR*&on5>?~97a

^#&e*z5Z~XmhDD2?y!PJ%5*(WLa0zUG^xp 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 z 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%0AA4gO%W8Im{#uy8|j++Z`jN% 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 Date: Tue, 13 Nov 2018 10:28:50 -0800 Subject: [PATCH 02/29] Trying to autoplublish releases --- .circleci/config.yml | 52 +++++++++++++++++++++++++++++++++++++++++++- Makefile | 14 +++++++++++- binary-name.sh | 44 +++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100755 binary-name.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 9db1b0aa7..86fe2453b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,11 +12,61 @@ jobs: - run: sudo apt-get install -y cmake - run: rustup default nightly-2018-10-07 - run: make test - + - run: + command: | + make release + mkdir -p artifacts + cp ./target/release/wasmer ./artifacts/$(./binary-name.sh) + - persist_to_workspace: + root: . + paths: + - artifacts - save_cache: paths: - /usr/local/cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps + - target/release/build + - target/release/deps key: v4-cargo-cache-{{ arch }}-{{ checksum "Cargo.lock" }} + + # create-release-artifacts-mac: + # macos: + # xcode: "9.0" + # - checkout + + publish-github-release: + docker: + - image: cibuilds/github + steps: + - attach_workspace: + at: . + - run: + name: "Publish Release on GitHub" + command: | + # go get github.com/tcnksm/ghr + # VERSION=$(git log -1 --pretty=%B) + VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) + # VERSION=${CIRCLE_TAG} + # VERSION=$(./artifacts/ --version) + ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/ + +workflows: + version: 2 + main: + jobs: + - build + # : + # filters: + # tags: + # only: /^\d+\.\d+\.\d+$/ + + - publish-github-release: + requires: + - build + # filters: + # branches: + # ignore: /.*/ + # tags: + # only: /^\d+\.\d+\.\d+$/ diff --git a/Makefile b/Makefile index af631c70a..88ed6525d 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ spectests: WASM_GENERATE_SPECTESTS=1 cargo build # clean: -# rm -rf target +# rm -rf artifacts build: cargo build @@ -15,3 +15,15 @@ install: test: cargo test -- --test-threads=1 + +release: + # If you are in OS-X, you will need mingw-w64 for cross compiling to windows + # brew install mingw-w64 + cargo build --release + # mkdir -p artifacts + # BINARY_NAME := $(./binary-name.sh) + # cp ./target/release/wasmer ./artifacts/$(./binary-name.sh) + # cp ./target/release/wasmer ./artifacts/${BINARY_NAME} + +publish-release: + ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/ diff --git a/binary-name.sh b/binary-name.sh new file mode 100755 index 000000000..98a3a8497 --- /dev/null +++ b/binary-name.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +initArch() { + ARCH=$(uname -m) + if [ -n "$WASMER_ARCH" ]; then + ARCH="$WASMER_ARCH" + fi + case $ARCH in + amd64) ARCH="amd64";; + x86_64) ARCH="amd64";; + i386) ARCH="386";; + *) echo "Architecture ${ARCH} is not supported by this installation script"; exit 1;; + esac +} + +initOS() { + OS=$(uname | tr '[:upper:]' '[:lower:]') + if [ -n "$WASMER_OS" ]; then + echo "Using WASMER_OS" + OS="$WASMER_OS" + fi + case "$OS" in + darwin) OS='darwin';; + linux) OS='linux';; + freebsd) OS='freebsd';; + mingw*) OS='windows';; + msys*) OS='windows';; + *) echo "OS ${OS} is not supported by this installation script"; exit 1;; + esac +} + +# identify platform based on uname output +initArch +initOS + +# determine install directory if required +BINARY="wasmer-${OS}-${ARCH}" + +# add .exe if on windows +if [ "$OS" = "windows" ]; then + BINARY="$BINARY.exe" +fi + +echo "${BINARY}" From 6e351b7e8e1b4b0081ee1fb915480b542722b09e Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 10:51:04 -0800 Subject: [PATCH 03/29] Save package version on artifacts --- .circleci/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 86fe2453b..b774ea1c0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,6 +16,8 @@ jobs: command: | make release mkdir -p artifacts + VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) + echo "${VERSION}" >> artifacts/version cp ./target/release/wasmer ./artifacts/$(./binary-name.sh) - persist_to_workspace: root: . @@ -47,7 +49,8 @@ jobs: command: | # go get github.com/tcnksm/ghr # VERSION=$(git log -1 --pretty=%B) - VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) + VERSION=$(cat ./artifacts/version) + rm ./artifacts/version # VERSION=${CIRCLE_TAG} # VERSION=$(./artifacts/ --version) ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/ From 549eed53fda20639149593caab5e57dcc3b7bd6d Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 11:36:04 -0800 Subject: [PATCH 04/29] Trying to add macos releases --- .circleci/config.yml | 51 ++++++++++++++++++++++++++++++++++++++------ .gitignore | 1 + 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b774ea1c0..1a60596e1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,7 +8,7 @@ jobs: - checkout - restore_cache: keys: - - v4-cargo-cache-{{ arch }}-{{ checksum "Cargo.lock" }} + - v4-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} - run: sudo apt-get install -y cmake - run: rustup default nightly-2018-10-07 - run: make test @@ -29,14 +29,51 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps + - target/release/.fingerprint - target/release/build - target/release/deps - key: v4-cargo-cache-{{ arch }}-{{ checksum "Cargo.lock" }} + key: v4-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} - # create-release-artifacts-mac: - # macos: - # xcode: "9.0" - # - checkout + build-macos: + macos: + xcode: "9.0" + + steps: + - checkout + - restore_cache: + keys: + - v4-cargo-cache-darwin-{{ arch }}-{{ checksum "Cargo.lock" }} + - run: + name: Install CMAKE + command: | + wget https://cmake.org/files/v3.4/cmake-3.4.1-Darwin-x86_64.tar.gz + tar xf cmake-3.4.1-Darwin-x86_64.tar.gz + export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" + - run: + name: Install Rust Nightly + command: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly-2018-10-07 + - run: make test + - run: + command: | + make release + mkdir -p artifacts + VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) + echo "${VERSION}" >> artifacts/version + cp ./target/release/wasmer ./artifacts/$(./binary-name.sh) + - persist_to_workspace: + root: . + paths: + - artifacts + - save_cache: + paths: + - /usr/local/cargo/registry + - target/debug/.fingerprint + - target/debug/build + - target/debug/deps + - target/release/.fingerprint + - target/release/build + - target/release/deps + key: v4-cargo-cache-darwin-{{ arch }}-{{ checksum "Cargo.lock" }} publish-github-release: docker: @@ -60,6 +97,7 @@ workflows: main: jobs: - build + - build-macos # : # filters: # tags: @@ -68,6 +106,7 @@ workflows: - publish-github-release: requires: - build + - build-macos # filters: # branches: # ignore: /.*/ diff --git a/.gitignore b/.gitignore index 53eaa2196..d7ae9e0b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target **/*.rs.bk +/artifacts From 8750fc1cd6510278a7cc3a6883f26b677f01ff0f Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 11:48:34 -0800 Subject: [PATCH 05/29] Trying to fix mac install --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a60596e1..b933ed23b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,7 +46,7 @@ jobs: - run: name: Install CMAKE command: | - wget https://cmake.org/files/v3.4/cmake-3.4.1-Darwin-x86_64.tar.gz + curl -O https://cmake.org/files/v3.4/cmake-3.4.1-Darwin-x86_64.tar.gz tar xf cmake-3.4.1-Darwin-x86_64.tar.gz export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" - run: From 19c4d07ab599dd49ea5a956956e31bbeae2460b7 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 11:53:27 -0800 Subject: [PATCH 06/29] Adding rustup binaries to PATH for darwin build --- .circleci/config.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b933ed23b..ee3cbbb29 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,10 +51,21 @@ jobs: export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" - run: name: Install Rust Nightly - command: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly-2018-10-07 - - run: make test - - run: command: | + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly-2018-10-07 + export PATH="$HOME/.cargo/bin:$PATH" + cargo --version + - run: + name: Execute tests + command: + export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" + export PATH="$HOME/.cargo/bin:$PATH" + make test + - run: + name: Make build + command: | + export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" + export PATH="$HOME/.cargo/bin:$PATH" make release mkdir -p artifacts VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) From 7d8f2aafe577ac31136c15a4e6d925457eff7dcb Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 12:12:02 -0800 Subject: [PATCH 07/29] Improved build script for macos --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ee3cbbb29..7871bf516 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,7 +57,7 @@ jobs: cargo --version - run: name: Execute tests - command: + command: | export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" export PATH="$HOME/.cargo/bin:$PATH" make test @@ -68,8 +68,8 @@ jobs: export PATH="$HOME/.cargo/bin:$PATH" make release mkdir -p artifacts - VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) - echo "${VERSION}" >> artifacts/version + # VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) + # echo "${VERSION}" >> artifacts/version cp ./target/release/wasmer ./artifacts/$(./binary-name.sh) - persist_to_workspace: root: . From fd90ee9bd29653ec3dfce791c5e6eaadf44dafb8 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 15:48:58 -0800 Subject: [PATCH 08/29] Added first iteration of the install script --- install.sh | 359 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100755 install.sh diff --git a/install.sh b/install.sh new file mode 100755 index 000000000..05e725d35 --- /dev/null +++ b/install.sh @@ -0,0 +1,359 @@ +#!/bin/sh + +# This install script is intended to download and install the latest available +# release of the wasmer. +# Installer script inspired from: +# 1) https://raw.githubusercontent.com/golang/dep/master/install.sh +# 2) https://sh.rustup.rs +# 3) https://yarnpkg.com/install.sh +# 4) https://raw.githubusercontent.com/brainsik/virtualenv-burrito/master/virtualenv-burrito.sh +# +# It attempts to identify the current platform and an error will be thrown if +# the platform is not supported. +# +# Environment variables: +# - INSTALL_DIRECTORY (optional): defaults to $HOME/.wasmer +# - WASMER_RELEASE_TAG (optional): defaults to fetching the latest release +# - WASMER_OS (optional): use a specific value for OS (mostly for testing) +# - WASMER_ARCH (optional): use a specific value for ARCH (mostly for testing) +# +# You can install using this script: +# $ curl https://raw.githubusercontent.com/WAFoundation/wasmer/master/install.sh | sh + +set -e + + +reset="\033[0m" +red="\033[31m" +green="\033[32m" +yellow="\033[33m" +cyan="\033[36m" +white="\033[37m" + +RELEASES_URL="https://github.com/WAFoundation/wasmer/releases" + +wasmer_download_json() { + url="$2" + + # echo "Fetching $url.." + if test -x "$(command -v curl)"; then + response=$(curl -s -L -w 'HTTPSTATUS:%{http_code}' -H 'Accept: application/json' "$url") + body=$(echo "$response" | sed -e 's/HTTPSTATUS\:.*//g') + code=$(echo "$response" | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') + elif test -x "$(command -v wget)"; then + temp=$(mktemp) + body=$(wget -q --header='Accept: application/json' -O - --server-response "$url" 2> "$temp") + code=$(awk '/^ HTTP/{print $2}' < "$temp" | tail -1) + rm "$temp" + else + printf "$red> Neither curl nor wget was available to perform http requests.$reset\n" + exit 1 + fi + if [ "$code" != 200 ]; then + printf "$red>File download failed with code $code.$reset\n" + exit 1 + fi + + eval "$1='$body'" +} + +wasmer_download_file() { + url="$1" + destination="$2" + + # echo "Fetching $url.." + if test -x "$(command -v curl)"; then + code=$(curl -s -w '%{http_code}' -L "$url" -o "$destination") + elif test -x "$(command -v wget)"; then + code=$(wget -q -O "$destination" --server-response "$url" 2>&1 | awk '/^ HTTP/{print $2}' | tail -1) + else + printf "$red> Neither curl nor wget was available to perform http requests.$reset\n" + exit 1 + fi + + if [ "$code" == 404 ]; then + printf "$red> Your architecture is not yet supported ($OS-$ARCH).$reset\n" + echo "> Please open an issue on the project if you would like to use wasmer in your project: https://github.com/WAFoundation/wasmer" + exit 1 + elif [ "$code" != 200 ]; then + printf "$red>File download failed with code $code.$reset\n" + exit 1 + fi +} + + +wasmer_detect_profile() { + if [ -n "${PROFILE}" ] && [ -f "${PROFILE}" ]; then + echo "${PROFILE}" + return + fi + + local DETECTED_PROFILE + DETECTED_PROFILE='' + local SHELLTYPE + SHELLTYPE="$(basename "/$SHELL")" + + if [ "$SHELLTYPE" = "bash" ]; then + if [ -f "$HOME/.bashrc" ]; then + DETECTED_PROFILE="$HOME/.bashrc" + elif [ -f "$HOME/.bash_profile" ]; then + DETECTED_PROFILE="$HOME/.bash_profile" + fi + elif [ "$SHELLTYPE" = "zsh" ]; then + DETECTED_PROFILE="$HOME/.zshrc" + elif [ "$SHELLTYPE" = "fish" ]; then + DETECTED_PROFILE="$HOME/.config/fish/config.fish" + fi + + if [ -z "$DETECTED_PROFILE" ]; then + if [ -f "$HOME/.profile" ]; then + DETECTED_PROFILE="$HOME/.profile" + elif [ -f "$HOME/.bashrc" ]; then + DETECTED_PROFILE="$HOME/.bashrc" + elif [ -f "$HOME/.bash_profile" ]; then + DETECTED_PROFILE="$HOME/.bash_profile" + elif [ -f "$HOME/.zshrc" ]; then + DETECTED_PROFILE="$HOME/.zshrc" + elif [ -f "$HOME/.config/fish/config.fish" ]; then + DETECTED_PROFILE="$HOME/.config/fish/config.fish" + fi + fi + + if [ ! -z "$DETECTED_PROFILE" ]; then + echo "$DETECTED_PROFILE" + fi +} + +wasmer_link() { + printf "$cyan> Adding to \$PATH...$reset\n" + WASMER_PROFILE="$(wasmer_detect_profile)" + SOURCE_STR="\nexport PATH=\"\$HOME/.wasmer/bin:\$PATH\"\n" + + if [ -z "${WASMER_PROFILE-}" ] ; then + printf "$red> Profile not found. Tried ${WASMER_PROFILE} (as defined in \$PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.\n" + echo "> Create one of them and run this script again" + echo "> Create it (touch ${WASMER_PROFILE}) and run this script again" + echo " OR" + printf "> Append the following lines to the correct file yourself:$reset\n" + command printf "${SOURCE_STR}" + else + if ! grep -q 'wasmer' "$WASMER_PROFILE"; then + if [[ $WASMER_PROFILE == *"fish"* ]]; then + command fish -c 'set -U fish_user_paths $fish_user_paths ~/.wasmer/bin' + else + command printf "$SOURCE_STR" >> "$WASMER_PROFILE" + fi + fi + + printf "$cyan> We've added the following to your $WASMER_PROFILE\n" + echo "> If this isn't the profile of your current shell then please add the following to your correct profile:" + printf " $SOURCE_STR$reset\n" + + version=`$HOME/.wasmer/bin/wasmer --version` || ( + printf "$red> Wasmer was installed, but doesn't seem to be working :(.$reset\n" + exit 1; + ) + + printf "$green> Successfully installed Wasmer $version! Please open another terminal where the \`wasmer\` command will now be available.$reset\n" + fi +} + + +# findWasmerBinDirectory() { +# EFFECTIVE_WASMERPATH=$(wasmer env WASMERPATH) +# if [ -z "$EFFECTIVE_WASMERPATH" ]; then +# echo "Installation could not determine your \$WASMERPATH." +# exit 1 +# fi +# if [ -z "$WASMERBIN" ]; then +# WASMERBIN=$(echo "${EFFECTIVE_WASMERPATH%%:*}/bin" | sed s#//*#/#g) +# fi +# if [ ! -d "$WASMERBIN" ]; then +# echo "Installation requires your WASMERBIN directory $WASMERBIN to exist. Please create it." +# exit 1 +# fi +# eval "$1='$WASMERBIN'" +# } + +initArch() { + ARCH=$(uname -m) + if [ -n "$WASMER_ARCH" ]; then + printf "$cyan> Using WASMER_ARCH ($WASMER_ARCH).$reset\n" + ARCH="$WASMER_ARCH" + fi + case $ARCH in + amd64) ARCH="amd64";; + x86_64) ARCH="amd64";; + # i386) ARCH="386";; + *) printf "$red> The system architecture (${ARCH}) is not supported by this installation script.$reset\n"; exit 1;; + esac + # echo "ARCH = $ARCH" +} + +initOS() { + OS=$(uname | tr '[:upper:]' '[:lower:]') + if [ -n "$WASMER_OS" ]; then + printf "$cyan> Using WASMER_OS ($WASMER_OS).$reset\n" + OS="$WASMER_OS" + fi + case "$OS" in + darwin) OS='darwin';; + linux) OS='linux';; + freebsd) OS='freebsd';; + # mingw*) OS='windows';; + # msys*) OS='windows';; + *) printf "$red> The OS (${OS}) is not supported by this installation script.$reset\n"; exit 1;; + esac + # echo "OS = $OS" +} + + +# unset profile +# test -z "$exclude_profile" && modify_profile +# if [ -n "$profile" ]; then +# if [ -e $HOME/${profile}.pre-wasmer ]; then +# backup=" The original\nwas saved to ~/$profile.pre-wasmer." +# fi +# fi + +# source $WASMERPATH/startup.sh + +wasmer_install() { +magenta1="${reset}\033[34;2m" +magenta2="${reset}\033[34m" +magenta3="${reset}\033[34;1m" + + printf "${white}Installing Wasmer!$reset\n" + printf " + ${magenta3}SSS${reSet} + ${magenta3}SSSSS${reSet} + ${magenta2}AAA ${magenta3}SSSSSS${reSet} + ${magenta2}AAAAAA ${magenta3}SSSSSSSSSSSSS${reSet} +${magenta1}W${magenta2} AAAAAAA ${magenta3}SSSSSSSSSSSSSS${reSet} +${magenta1}WWWWW${magenta2} AAAAAAAAAAAAA${magenta3}SSSSSSSSS${reSet} +${magenta1}WWWWWW${magenta2}AAAAAAAAAAAAAAA${magenta3}SSSSSSS${reSet} +${magenta1}WWWWWWWWWWWW${magenta2}AAAAAAAAA${magenta3}SSSSSSS${reSet} +${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA${magenta3}SSSSSSS${reSet} +${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA${magenta3}SSSSSSS${reSet} +${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA${magenta3}SSSSSSS${reSet} +${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA ${magenta3}SSS${reSet} +${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA + ${magenta1}WWWWWWWWWWW${magenta2} AAA + ${magenta1}WWWWWWWW${magenta2} + ${magenta1}WWWW${magenta2} + +" +# if [ -d "$HOME/.wasmer" ]; then +# if which wasmer; then +# local latest_url +# local specified_version +# local version_type +# if [ "$1" = '--nightly' ]; then +# latest_url=https://nightly.wasmerpkg.com/latest-tar-version +# specified_version=`curl -sS $latest_url` +# version_type='latest' +# elif [ "$1" = '--version' ]; then +# specified_version=$2 +# version_type='specified' +# elif [ "$1" = '--rc' ]; then +# latest_url=https://wasmerpkg.com/latest-rc-version +# specified_version=`curl -sS $latest_url` +# version_type='rc' +# else +# latest_url=https://wasmerpkg.com/latest-version +# specified_version=`curl -sS $latest_url` +# version_type='latest' +# fi +# wasmer_version=`wasmer -V` +# wasmer_alt_version=`wasmer --version` + +# if [ "$specified_version" = "$wasmer_version" -o "$specified_version" = "$wasmer_alt_version" ]; then +# printf "$green> Wasmer is already at the $specified_version version.$reset\n" +# exit 0 +# else +# printf "$yellow> $wasmer_alt_version is already installed, Specified version: $specified_version.$reset\n" +# rm -rf "$HOME/.wasmer" +# fi +# else +# printf "$red> $HOME/.wasmer already exists, possibly from a past Wasmer install.$reset\n" +# printf "$red> Remove it (rm -rf $HOME/.wasmer) and run this script again.$reset\n" +# exit 0 +# fi +# fi + + wasmer_download # $1 $2 + wasmer_link + wasmer_reset +} + + +wasmer_reset() { + unset -f wasmer_install wasmer_reset wasmer_download_json wasmer_link wasmer_detect_profile wasmer_download_file wasmer_download wasmer_verify_or_quit +} + + +wasmer_download() { + # identify platform based on uname output + initArch + initOS + + # determine install directory if required + if [ -z "$INSTALL_DIRECTORY" ]; then + # findWasmerBinDirectory INSTALL_DIRECTORY + INSTALL_DIRECTORY="$HOME/.wasmer" + fi + WASMER=INSTALL_DIRECTORY + printf "$cyan> Getting wasmer releases...$reset\n" + + # assemble expected release artifact name + BINARY="wasmer-${OS}-${ARCH}" + + # add .exe if on windows + if [ "$OS" = "windows" ]; then + BINARY="$BINARY.exe" + fi + + # if WASMER_RELEASE_TAG was not provided, assume latest + if [ -z "$WASMER_RELEASE_TAG" ]; then + wasmer_download_json LATEST_RELEASE "$RELEASES_URL/latest" + WASMER_RELEASE_TAG=$(echo "${LATEST_RELEASE}" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//' ) + fi + printf "$cyan> Latest wasmer release: $WASMER_RELEASE_TAG$reset\n" + + # fetch the real release data to make sure it exists before we attempt a download + wasmer_download_json RELEASE_DATA "$RELEASES_URL/tag/$WASMER_RELEASE_TAG" + + BINARY_URL="$RELEASES_URL/download/$WASMER_RELEASE_TAG/$BINARY" + DOWNLOAD_FILE=$(mktemp -t wasmer.XXXXXXXXXX) + + printf "$cyan> Downloading executable...$reset\n" + wasmer_download_file "$BINARY_URL" "$DOWNLOAD_FILE" + + # echo "Setting executable permissions." + chmod +x "$DOWNLOAD_FILE" + + INSTALL_NAME="wasmer" + + # windows not supported yet + # if [ "$OS" = "windows" ]; then + # INSTALL_NAME="$INSTALL_NAME.exe" + # fi + + # echo "Moving executable to $INSTALL_DIRECTORY/$INSTALL_NAME" + + mkdir -p $INSTALL_DIRECTORY/bin + mv "$DOWNLOAD_FILE" "$INSTALL_DIRECTORY/bin/$INSTALL_NAME" +} + +wasmer_verify_or_quit() { + read -p "$1 [y/N] " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]] + then + printf "$red> Aborting$reset\n" + exit 1 + fi +} + +# cd ~ +wasmer_install # $1 $2 From fa24424126680a7bcad617c5c9fd549a1ee13233 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 16:03:47 -0800 Subject: [PATCH 09/29] Improved install script showing the download progress bar --- install.sh | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/install.sh b/install.sh index 05e725d35..7eb79a37f 100755 --- a/install.sh +++ b/install.sh @@ -63,9 +63,9 @@ wasmer_download_file() { # echo "Fetching $url.." if test -x "$(command -v curl)"; then - code=$(curl -s -w '%{http_code}' -L "$url" -o "$destination") + code=$(curl --progress-bar -w '%{http_code}' -L "$url" -o "$destination") elif test -x "$(command -v wget)"; then - code=$(wget -q -O "$destination" --server-response "$url" 2>&1 | awk '/^ HTTP/{print $2}' | tail -1) + code=$(wget --show-progress --progress=bar:force:noscroll -q -O "$destination" --server-response "$url" 2>&1 | awk '/^ HTTP/{print $2}' | tail -1) else printf "$red> Neither curl nor wget was available to perform http requests.$reset\n" exit 1 @@ -219,28 +219,28 @@ initOS() { # source $WASMERPATH/startup.sh wasmer_install() { -magenta1="${reset}\033[34;2m" -magenta2="${reset}\033[34m" -magenta3="${reset}\033[34;1m" + magenta1="${reset}\033[34;1m" + magenta2="${reset}\033[34m" + magenta3="${reset}\033[34;2m" printf "${white}Installing Wasmer!$reset\n" printf " - ${magenta3}SSS${reSet} - ${magenta3}SSSSS${reSet} - ${magenta2}AAA ${magenta3}SSSSSS${reSet} - ${magenta2}AAAAAA ${magenta3}SSSSSSSSSSSSS${reSet} -${magenta1}W${magenta2} AAAAAAA ${magenta3}SSSSSSSSSSSSSS${reSet} -${magenta1}WWWWW${magenta2} AAAAAAAAAAAAA${magenta3}SSSSSSSSS${reSet} -${magenta1}WWWWWW${magenta2}AAAAAAAAAAAAAAA${magenta3}SSSSSSS${reSet} -${magenta1}WWWWWWWWWWWW${magenta2}AAAAAAAAA${magenta3}SSSSSSS${reSet} -${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA${magenta3}SSSSSSS${reSet} -${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA${magenta3}SSSSSSS${reSet} -${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA${magenta3}SSSSSSS${reSet} -${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA ${magenta3}SSS${reSet} -${magenta1}WWWWWWWWWWWWWW${magenta2}AAAAAAA - ${magenta1}WWWWWWWWWWW${magenta2} AAA - ${magenta1}WWWWWWWW${magenta2} - ${magenta1}WWWW${magenta2} + ${magenta3}###${reset} + ${magenta3}#####${reset} + ${magenta2}### ${magenta3}######${reset} + ${magenta2}###### ${magenta3}#############${reset} +${magenta1}#${magenta2} ####### ${magenta3}##############${reset} +${magenta1}#####${magenta2} #############${magenta3}#########${reset} +${magenta1}######${magenta2}###############${magenta3}#######${reset} +${magenta1}############${magenta2}#########${magenta3}#######${reset} +${magenta1}##############${magenta2}#######${magenta3}#######${reset} +${magenta1}##############${magenta2}#######${magenta3}#######${reset} +${magenta1}##############${magenta2}#######${magenta3}#######${reset} +${magenta1}##############${magenta2}####### ${magenta3}###${reset} +${magenta1}##############${magenta2}####### + ${magenta1}###########${magenta2} ### + ${magenta1}########${magenta2} + ${magenta1}####${reset} " # if [ -d "$HOME/.wasmer" ]; then From aba907cbc42c67f0c549c54bc685a96915fcede1 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 17:21:03 -0800 Subject: [PATCH 10/29] Improved debug statements --- src/integrations/mod.rs | 1 - src/macros.rs | 14 -------------- src/main.rs | 8 ++++---- src/webassembly/instance.rs | 2 +- 4 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/integrations/mod.rs b/src/integrations/mod.rs index 7b658eefc..b80dc205f 100644 --- a/src/integrations/mod.rs +++ b/src/integrations/mod.rs @@ -3,7 +3,6 @@ use libc::{printf, putchar}; extern "C" fn _printf(memory_offset: i32, extra: i32, instance: &Instance) -> i32 { let mem = &instance.memories[0]; - println!("instance = {:?}", instance); return unsafe { let base_memory_offset = mem.mmap.as_ptr().offset(memory_offset as isize) as *const i8; printf(base_memory_offset, extra) diff --git a/src/macros.rs b/src/macros.rs index c5defe6fe..549630e80 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -23,17 +23,3 @@ macro_rules! include_wast2wasm_bytes { wat2wasm(WAST_BYTES.to_vec()).expect(&format!("Can't convert {} file to wasm", $x)) }}; } - -// #[cfg(feature= "debug")] -#[macro_export] -macro_rules! debug { - ($fmt:expr) => (println!(concat!("Wasmer::", $fmt))); - ($fmt:expr, $($arg:tt)*) => (println!(concat!("Wasmer::", $fmt, "\n"), $($arg)*)); -} - -// #[cfg(not(feature= "debug"))] -// #[macro_export] -// macro_rules! debug { -// ($fmt:expr) => {}; -// ($fmt:expr, $($arg:tt)*) => {}; -// } diff --git a/src/main.rs b/src/main.rs index 7eeb52733..3ded47d9d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,8 @@ extern crate spin; // #[global_allocator] // static A: System = System; -// #[macro_use] extern crate log; +#[macro_use] +extern crate log; // use libc; use std::error::Error; @@ -89,9 +90,8 @@ fn execute_wasm(wasm_path: PathBuf) -> Result<(), String> { Some(&webassembly::Export::Function(index)) => index, _ => panic!("Main function not found"), }); - let main: fn(&webassembly::Instance) -> i32 = get_instance_function!(instance, func_index); - let result = main(&instance); - println!("RESULT {}", result); + let main: fn(&webassembly::Instance) = get_instance_function!(instance, func_index); + main(&instance); Ok(()) } diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index 4d72b8817..ac058e7f9 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -185,7 +185,7 @@ impl Instance { func_context .compile_and_emit(&*isa, &mut code_buf, &mut reloc_sink, &mut trap_sink) .map_err(|e| { - println!("CompileError: {}", e.to_string()); + debug!("CompileError: {}", e.to_string()); ErrorKind::CompileError(e.to_string()) })?; // We set this code_buf to be readable & executable From 75bcc5e0bd5f6e16786cfce1929dfac7e9437b0a Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 17:39:07 -0800 Subject: [PATCH 11/29] Added traps spectests --- spectests/README.md | 2 +- spectests/traps.wast | 91 ++++ src/build_spectests.rs | 3 +- src/spectests/mod.rs | 1 + src/spectests/traps.rs | 930 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1025 insertions(+), 2 deletions(-) create mode 100644 spectests/traps.wast create mode 100644 src/spectests/traps.rs diff --git a/spectests/README.md b/spectests/README.md index 3969a298e..bd17c702e 100644 --- a/spectests/README.md +++ b/spectests/README.md @@ -94,7 +94,7 @@ This spectests are currently covered: - switch.wast ✅ - tee_local.wast ✅ - token.wast -- traps.wast +- traps.wast ✅ - type.wast ✅ - typecheck.wast ✅ - unreachable.wast diff --git a/spectests/traps.wast b/spectests/traps.wast new file mode 100644 index 000000000..a9401408e --- /dev/null +++ b/spectests/traps.wast @@ -0,0 +1,91 @@ +;; Test that traps are preserved even in instructions which might otherwise +;; be dead-code-eliminated. These functions all perform an operation and +;; discard its return value. + +(module + (func (export "no_dce.i32.div_s") (param $x i32) (param $y i32) + (drop (i32.div_s (get_local $x) (get_local $y)))) + (func (export "no_dce.i32.div_u") (param $x i32) (param $y i32) + (drop (i32.div_u (get_local $x) (get_local $y)))) + (func (export "no_dce.i64.div_s") (param $x i64) (param $y i64) + (drop (i64.div_s (get_local $x) (get_local $y)))) + (func (export "no_dce.i64.div_u") (param $x i64) (param $y i64) + (drop (i64.div_u (get_local $x) (get_local $y)))) +) + +(assert_trap (invoke "no_dce.i32.div_s" (i32.const 1) (i32.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i32.div_u" (i32.const 1) (i32.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i64.div_s" (i64.const 1) (i64.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i64.div_u" (i64.const 1) (i64.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i32.div_s" (i32.const 0x80000000) (i32.const -1)) "integer overflow") +(assert_trap (invoke "no_dce.i64.div_s" (i64.const 0x8000000000000000) (i64.const -1)) "integer overflow") + +(module + (func (export "no_dce.i32.rem_s") (param $x i32) (param $y i32) + (drop (i32.rem_s (get_local $x) (get_local $y)))) + (func (export "no_dce.i32.rem_u") (param $x i32) (param $y i32) + (drop (i32.rem_u (get_local $x) (get_local $y)))) + (func (export "no_dce.i64.rem_s") (param $x i64) (param $y i64) + (drop (i64.rem_s (get_local $x) (get_local $y)))) + (func (export "no_dce.i64.rem_u") (param $x i64) (param $y i64) + (drop (i64.rem_u (get_local $x) (get_local $y)))) +) + +(assert_trap (invoke "no_dce.i32.rem_s" (i32.const 1) (i32.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i32.rem_u" (i32.const 1) (i32.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i64.rem_s" (i64.const 1) (i64.const 0)) "integer divide by zero") +(assert_trap (invoke "no_dce.i64.rem_u" (i64.const 1) (i64.const 0)) "integer divide by zero") + +(module + (func (export "no_dce.i32.trunc_s_f32") (param $x f32) (drop (i32.trunc_s/f32 (get_local $x)))) + (func (export "no_dce.i32.trunc_u_f32") (param $x f32) (drop (i32.trunc_u/f32 (get_local $x)))) + (func (export "no_dce.i32.trunc_s_f64") (param $x f64) (drop (i32.trunc_s/f64 (get_local $x)))) + (func (export "no_dce.i32.trunc_u_f64") (param $x f64) (drop (i32.trunc_u/f64 (get_local $x)))) + (func (export "no_dce.i64.trunc_s_f32") (param $x f32) (drop (i64.trunc_s/f32 (get_local $x)))) + (func (export "no_dce.i64.trunc_u_f32") (param $x f32) (drop (i64.trunc_u/f32 (get_local $x)))) + (func (export "no_dce.i64.trunc_s_f64") (param $x f64) (drop (i64.trunc_s/f64 (get_local $x)))) + (func (export "no_dce.i64.trunc_u_f64") (param $x f64) (drop (i64.trunc_u/f64 (get_local $x)))) +) + +(assert_trap (invoke "no_dce.i32.trunc_s_f32" (f32.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i32.trunc_u_f32" (f32.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i32.trunc_s_f64" (f64.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i32.trunc_u_f64" (f64.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i64.trunc_s_f32" (f32.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i64.trunc_u_f32" (f32.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i64.trunc_s_f64" (f64.const nan)) "invalid conversion to integer") +(assert_trap (invoke "no_dce.i64.trunc_u_f64" (f64.const nan)) "invalid conversion to integer") + +(module + (memory 1) + + (func (export "no_dce.i32.load") (param $i i32) (drop (i32.load (get_local $i)))) + (func (export "no_dce.i32.load16_s") (param $i i32) (drop (i32.load16_s (get_local $i)))) + (func (export "no_dce.i32.load16_u") (param $i i32) (drop (i32.load16_u (get_local $i)))) + (func (export "no_dce.i32.load8_s") (param $i i32) (drop (i32.load8_s (get_local $i)))) + (func (export "no_dce.i32.load8_u") (param $i i32) (drop (i32.load8_u (get_local $i)))) + (func (export "no_dce.i64.load") (param $i i32) (drop (i64.load (get_local $i)))) + (func (export "no_dce.i64.load32_s") (param $i i32) (drop (i64.load32_s (get_local $i)))) + (func (export "no_dce.i64.load32_u") (param $i i32) (drop (i64.load32_u (get_local $i)))) + (func (export "no_dce.i64.load16_s") (param $i i32) (drop (i64.load16_s (get_local $i)))) + (func (export "no_dce.i64.load16_u") (param $i i32) (drop (i64.load16_u (get_local $i)))) + (func (export "no_dce.i64.load8_s") (param $i i32) (drop (i64.load8_s (get_local $i)))) + (func (export "no_dce.i64.load8_u") (param $i i32) (drop (i64.load8_u (get_local $i)))) + (func (export "no_dce.f32.load") (param $i i32) (drop (f32.load (get_local $i)))) + (func (export "no_dce.f64.load") (param $i i32) (drop (f64.load (get_local $i)))) +) + +(assert_trap (invoke "no_dce.i32.load" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i32.load16_s" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i32.load16_u" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i32.load8_s" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i32.load8_u" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load32_s" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load32_u" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load16_s" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load16_u" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load8_s" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.i64.load8_u" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.f32.load" (i32.const 65536)) "out of bounds memory access") +(assert_trap (invoke "no_dce.f64.load" (i32.const 65536)) "out of bounds memory access") diff --git a/src/build_spectests.rs b/src/build_spectests.rs index 400111e3e..f1dc384c9 100644 --- a/src/build_spectests.rs +++ b/src/build_spectests.rs @@ -13,7 +13,7 @@ static ENV_VAR: &str = "WASM_GENERATE_SPECTESTS"; static BANNER: &str = "// Rust test file autogenerated with cargo build (src/build_spectests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 54] = [ +const TESTS: [&str; 55] = [ "spectests/address.wast", "spectests/align.wast", "spectests/binary.wast", @@ -66,6 +66,7 @@ const TESTS: [&str; 54] = [ "spectests/store_retval.wast", "spectests/switch.wast", "spectests/tee_local.wast", + "spectests/traps.wast", "spectests/typecheck.wast", "spectests/types.wast", ]; diff --git a/src/spectests/mod.rs b/src/spectests/mod.rs index 16387f012..a10984025 100644 --- a/src/spectests/mod.rs +++ b/src/spectests/mod.rs @@ -67,5 +67,6 @@ mod start; mod store_retval; mod switch; mod tee_local; +mod traps; mod typecheck; mod types; diff --git a/src/spectests/traps.rs b/src/spectests/traps.rs new file mode 100644 index 000000000..740a413bd --- /dev/null +++ b/src/spectests/traps.rs @@ -0,0 +1,930 @@ +// Rust test file autogenerated with cargo build (src/build_spectests.rs). +// Please do NOT modify it by hand, as it will be reseted on next build. +// Test based on spectests/traps.wast +#![allow( + warnings, + dead_code +)] +use std::panic; +use wabt::wat2wasm; + +use crate::webassembly::{instantiate, compile, ImportObject, ResultObject, Instance, Export}; +use super::_common::{ + spectest_importobject, + NaNCheck, +}; + + +// Line 5 +fn create_module_1() -> ResultObject { + let module_str = "(module + (type (;0;) (func (param i32 i32))) + (type (;1;) (func (param i64 i64))) + (func (;0;) (type 0) (param i32 i32) + get_local 0 + get_local 1 + i32.div_s + drop) + (func (;1;) (type 0) (param i32 i32) + get_local 0 + get_local 1 + i32.div_u + drop) + (func (;2;) (type 1) (param i64 i64) + get_local 0 + get_local 1 + i64.div_s + drop) + (func (;3;) (type 1) (param i64 i64) + get_local 0 + get_local 1 + i64.div_u + drop) + (export \"no_dce.i32.div_s\" (func 0)) + (export \"no_dce.i32.div_u\" (func 1)) + (export \"no_dce.i64.div_s\" (func 2)) + (export \"no_dce.i64.div_u\" (func 3))) + "; + let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); + instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") +} + +fn start_module_1(result_object: &ResultObject) { + result_object.instance.start(); +} + +// Line 16 +fn c1_l16_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c1_l16_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.div_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i32, 0 as i32, &result_object.instance); + +} + +#[test] +fn c1_l16_assert_trap() { + let result_object = create_module_1(); + let result = panic::catch_unwind(|| { + c1_l16_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 17 +fn c2_l17_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c2_l17_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.div_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i32, 0 as i32, &result_object.instance); + +} + +#[test] +fn c2_l17_assert_trap() { + let result_object = create_module_1(); + let result = panic::catch_unwind(|| { + c2_l17_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 18 +fn c3_l18_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c3_l18_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.div_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i64, i64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i64, 0 as i64, &result_object.instance); + +} + +#[test] +fn c3_l18_assert_trap() { + let result_object = create_module_1(); + let result = panic::catch_unwind(|| { + c3_l18_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 19 +fn c4_l19_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c4_l19_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.div_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i64, i64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i64, 0 as i64, &result_object.instance); + +} + +#[test] +fn c4_l19_assert_trap() { + let result_object = create_module_1(); + let result = panic::catch_unwind(|| { + c4_l19_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 20 +fn c5_l20_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c5_l20_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.div_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(-2147483648 as i32, -1 as i32, &result_object.instance); + +} + +#[test] +fn c5_l20_assert_trap() { + let result_object = create_module_1(); + let result = panic::catch_unwind(|| { + c5_l20_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 21 +fn c6_l21_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c6_l21_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.div_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i64, i64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(-9223372036854775808 as i64, -1 as i64, &result_object.instance); + +} + +#[test] +fn c6_l21_assert_trap() { + let result_object = create_module_1(); + let result = panic::catch_unwind(|| { + c6_l21_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 23 + +#[test] +fn test_module_1() { + let result_object = create_module_1(); + // We group the calls together + start_module_1(&result_object); +} +fn create_module_2() -> ResultObject { + let module_str = "(module + (type (;0;) (func (param i32 i32))) + (type (;1;) (func (param i64 i64))) + (func (;0;) (type 0) (param i32 i32) + get_local 0 + get_local 1 + i32.rem_s + drop) + (func (;1;) (type 0) (param i32 i32) + get_local 0 + get_local 1 + i32.rem_u + drop) + (func (;2;) (type 1) (param i64 i64) + get_local 0 + get_local 1 + i64.rem_s + drop) + (func (;3;) (type 1) (param i64 i64) + get_local 0 + get_local 1 + i64.rem_u + drop) + (export \"no_dce.i32.rem_s\" (func 0)) + (export \"no_dce.i32.rem_u\" (func 1)) + (export \"no_dce.i64.rem_s\" (func 2)) + (export \"no_dce.i64.rem_u\" (func 3))) + "; + let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); + instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") +} + +fn start_module_2(result_object: &ResultObject) { + result_object.instance.start(); +} + +// Line 34 +fn c8_l34_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c8_l34_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.rem_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i32, 0 as i32, &result_object.instance); + +} + +#[test] +fn c8_l34_assert_trap() { + let result_object = create_module_2(); + let result = panic::catch_unwind(|| { + c8_l34_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 35 +fn c9_l35_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c9_l35_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.rem_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i32, 0 as i32, &result_object.instance); + +} + +#[test] +fn c9_l35_assert_trap() { + let result_object = create_module_2(); + let result = panic::catch_unwind(|| { + c9_l35_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 36 +fn c10_l36_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c10_l36_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.rem_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i64, i64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i64, 0 as i64, &result_object.instance); + +} + +#[test] +fn c10_l36_assert_trap() { + let result_object = create_module_2(); + let result = panic::catch_unwind(|| { + c10_l36_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 37 +fn c11_l37_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c11_l37_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.rem_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i64, i64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(1 as i64, 0 as i64, &result_object.instance); + +} + +#[test] +fn c11_l37_assert_trap() { + let result_object = create_module_2(); + let result = panic::catch_unwind(|| { + c11_l37_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 39 + +#[test] +fn test_module_2() { + let result_object = create_module_2(); + // We group the calls together + start_module_2(&result_object); +} +fn create_module_3() -> ResultObject { + let module_str = "(module + (type (;0;) (func (param f32))) + (type (;1;) (func (param f64))) + (func (;0;) (type 0) (param f32) + get_local 0 + i32.trunc_s/f32 + drop) + (func (;1;) (type 0) (param f32) + get_local 0 + i32.trunc_u/f32 + drop) + (func (;2;) (type 1) (param f64) + get_local 0 + i32.trunc_s/f64 + drop) + (func (;3;) (type 1) (param f64) + get_local 0 + i32.trunc_u/f64 + drop) + (func (;4;) (type 0) (param f32) + get_local 0 + i64.trunc_s/f32 + drop) + (func (;5;) (type 0) (param f32) + get_local 0 + i64.trunc_u/f32 + drop) + (func (;6;) (type 1) (param f64) + get_local 0 + i64.trunc_s/f64 + drop) + (func (;7;) (type 1) (param f64) + get_local 0 + i64.trunc_u/f64 + drop) + (export \"no_dce.i32.trunc_s_f32\" (func 0)) + (export \"no_dce.i32.trunc_u_f32\" (func 1)) + (export \"no_dce.i32.trunc_s_f64\" (func 2)) + (export \"no_dce.i32.trunc_u_f64\" (func 3)) + (export \"no_dce.i64.trunc_s_f32\" (func 4)) + (export \"no_dce.i64.trunc_u_f32\" (func 5)) + (export \"no_dce.i64.trunc_s_f64\" (func 6)) + (export \"no_dce.i64.trunc_u_f64\" (func 7))) + "; + let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); + instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") +} + +fn start_module_3(result_object: &ResultObject) { + result_object.instance.start(); +} + +// Line 50 +fn c13_l50_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c13_l50_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.trunc_s_f32") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f32::from_bits(2143289344), &result_object.instance); + +} + +#[test] +fn c13_l50_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c13_l50_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 51 +fn c14_l51_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c14_l51_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.trunc_u_f32") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f32::from_bits(2143289344), &result_object.instance); + +} + +#[test] +fn c14_l51_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c14_l51_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 52 +fn c15_l52_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c15_l52_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.trunc_s_f64") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f64::from_bits(9221120237041090560), &result_object.instance); + +} + +#[test] +fn c15_l52_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c15_l52_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 53 +fn c16_l53_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c16_l53_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.trunc_u_f64") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f64::from_bits(9221120237041090560), &result_object.instance); + +} + +#[test] +fn c16_l53_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c16_l53_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 54 +fn c17_l54_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c17_l54_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.trunc_s_f32") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f32::from_bits(2143289344), &result_object.instance); + +} + +#[test] +fn c17_l54_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c17_l54_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 55 +fn c18_l55_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c18_l55_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.trunc_u_f32") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f32::from_bits(2143289344), &result_object.instance); + +} + +#[test] +fn c18_l55_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c18_l55_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 56 +fn c19_l56_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c19_l56_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.trunc_s_f64") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f64::from_bits(9221120237041090560), &result_object.instance); + +} + +#[test] +fn c19_l56_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c19_l56_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 57 +fn c20_l57_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c20_l57_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.trunc_u_f64") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(f64, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(f64::from_bits(9221120237041090560), &result_object.instance); + +} + +#[test] +fn c20_l57_assert_trap() { + let result_object = create_module_3(); + let result = panic::catch_unwind(|| { + c20_l57_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 59 + +#[test] +fn test_module_3() { + let result_object = create_module_3(); + // We group the calls together + start_module_3(&result_object); +} +fn create_module_4() -> ResultObject { + let module_str = "(module + (type (;0;) (func (param i32))) + (func (;0;) (type 0) (param i32) + get_local 0 + i32.load + drop) + (func (;1;) (type 0) (param i32) + get_local 0 + i32.load16_s + drop) + (func (;2;) (type 0) (param i32) + get_local 0 + i32.load16_u + drop) + (func (;3;) (type 0) (param i32) + get_local 0 + i32.load8_s + drop) + (func (;4;) (type 0) (param i32) + get_local 0 + i32.load8_u + drop) + (func (;5;) (type 0) (param i32) + get_local 0 + i64.load + drop) + (func (;6;) (type 0) (param i32) + get_local 0 + i64.load32_s + drop) + (func (;7;) (type 0) (param i32) + get_local 0 + i64.load32_u + drop) + (func (;8;) (type 0) (param i32) + get_local 0 + i64.load16_s + drop) + (func (;9;) (type 0) (param i32) + get_local 0 + i64.load16_u + drop) + (func (;10;) (type 0) (param i32) + get_local 0 + i64.load8_s + drop) + (func (;11;) (type 0) (param i32) + get_local 0 + i64.load8_u + drop) + (func (;12;) (type 0) (param i32) + get_local 0 + f32.load + drop) + (func (;13;) (type 0) (param i32) + get_local 0 + f64.load + drop) + (memory (;0;) 1) + (export \"no_dce.i32.load\" (func 0)) + (export \"no_dce.i32.load16_s\" (func 1)) + (export \"no_dce.i32.load16_u\" (func 2)) + (export \"no_dce.i32.load8_s\" (func 3)) + (export \"no_dce.i32.load8_u\" (func 4)) + (export \"no_dce.i64.load\" (func 5)) + (export \"no_dce.i64.load32_s\" (func 6)) + (export \"no_dce.i64.load32_u\" (func 7)) + (export \"no_dce.i64.load16_s\" (func 8)) + (export \"no_dce.i64.load16_u\" (func 9)) + (export \"no_dce.i64.load8_s\" (func 10)) + (export \"no_dce.i64.load8_u\" (func 11)) + (export \"no_dce.f32.load\" (func 12)) + (export \"no_dce.f64.load\" (func 13))) + "; + let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); + instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") +} + +fn start_module_4(result_object: &ResultObject) { + result_object.instance.start(); +} + +// Line 78 +fn c22_l78_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c22_l78_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.load") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c22_l78_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c22_l78_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 79 +fn c23_l79_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c23_l79_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.load16_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c23_l79_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c23_l79_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 80 +fn c24_l80_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c24_l80_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.load16_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c24_l80_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c24_l80_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 81 +fn c25_l81_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c25_l81_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.load8_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c25_l81_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c25_l81_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 82 +fn c26_l82_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c26_l82_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i32.load8_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c26_l82_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c26_l82_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 83 +fn c27_l83_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c27_l83_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c27_l83_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c27_l83_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 84 +fn c28_l84_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c28_l84_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load32_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c28_l84_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c28_l84_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 85 +fn c29_l85_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c29_l85_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load32_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c29_l85_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c29_l85_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 86 +fn c30_l86_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c30_l86_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load16_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c30_l86_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c30_l86_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 87 +fn c31_l87_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c31_l87_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load16_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c31_l87_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c31_l87_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 88 +fn c32_l88_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c32_l88_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load8_s") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c32_l88_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c32_l88_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 89 +fn c33_l89_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c33_l89_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.i64.load8_u") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c33_l89_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c33_l89_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 90 +fn c34_l90_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c34_l90_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.f32.load") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c34_l90_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c34_l90_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +// Line 91 +fn c35_l91_action_invoke(result_object: &ResultObject) { + println!("Executing function {}", "c35_l91_action_invoke"); + let func_index = match result_object.module.info.exports.get("no_dce.f64.load") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let invoke_fn: fn(i32, &Instance) = get_instance_function!(result_object.instance, func_index); + let result = invoke_fn(65536 as i32, &result_object.instance); + +} + +#[test] +fn c35_l91_assert_trap() { + let result_object = create_module_4(); + let result = panic::catch_unwind(|| { + c35_l91_action_invoke(&result_object); + }); + assert!(result.is_err()); +} + +#[test] +fn test_module_4() { + let result_object = create_module_4(); + // We group the calls together + start_module_4(&result_object); +} From dd1553154ce40a6d30211f758165b2aff7af139d Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 17:41:29 -0800 Subject: [PATCH 12/29] Added token spectests --- spectests/README.md | 2 +- spectests/token.wast | 10 ++++++++++ src/build_spectests.rs | 3 ++- src/spectests/mod.rs | 1 + src/spectests/token.rs | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 spectests/token.wast create mode 100644 src/spectests/token.rs diff --git a/spectests/README.md b/spectests/README.md index bd17c702e..033fa6c71 100644 --- a/spectests/README.md +++ b/spectests/README.md @@ -93,7 +93,7 @@ This spectests are currently covered: - store_retval.wast ✅ - switch.wast ✅ - tee_local.wast ✅ -- token.wast +- token.wast ✅ - traps.wast ✅ - type.wast ✅ - typecheck.wast ✅ diff --git a/spectests/token.wast b/spectests/token.wast new file mode 100644 index 000000000..1dcd32e7f --- /dev/null +++ b/spectests/token.wast @@ -0,0 +1,10 @@ +;; Test tokenization + +(assert_malformed + (module quote "(func (drop (i32.const0)))") + "unknown operator" +) +(assert_malformed + (module quote "(func br 0drop)") + "unknown operator" +) diff --git a/src/build_spectests.rs b/src/build_spectests.rs index f1dc384c9..d69126526 100644 --- a/src/build_spectests.rs +++ b/src/build_spectests.rs @@ -13,7 +13,7 @@ static ENV_VAR: &str = "WASM_GENERATE_SPECTESTS"; static BANNER: &str = "// Rust test file autogenerated with cargo build (src/build_spectests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 55] = [ +const TESTS: [&str; 56] = [ "spectests/address.wast", "spectests/align.wast", "spectests/binary.wast", @@ -66,6 +66,7 @@ const TESTS: [&str; 55] = [ "spectests/store_retval.wast", "spectests/switch.wast", "spectests/tee_local.wast", + "spectests/token.wast", "spectests/traps.wast", "spectests/typecheck.wast", "spectests/types.wast", diff --git a/src/spectests/mod.rs b/src/spectests/mod.rs index a10984025..9f7cc1851 100644 --- a/src/spectests/mod.rs +++ b/src/spectests/mod.rs @@ -67,6 +67,7 @@ mod start; mod store_retval; mod switch; mod tee_local; +mod token; mod traps; mod typecheck; mod types; diff --git a/src/spectests/token.rs b/src/spectests/token.rs new file mode 100644 index 000000000..e234d8b3d --- /dev/null +++ b/src/spectests/token.rs @@ -0,0 +1,32 @@ +// Rust test file autogenerated with cargo build (src/build_spectests.rs). +// Please do NOT modify it by hand, as it will be reseted on next build. +// Test based on spectests/token.wast +#![allow( + warnings, + dead_code +)] +use std::panic; +use wabt::wat2wasm; + +use crate::webassembly::{instantiate, compile, ImportObject, ResultObject, Instance, Export}; +use super::_common::{ + spectest_importobject, + NaNCheck, +}; + + +// Line 4 +#[test] +fn c0_l4_assert_malformed() { + let wasm_binary = [40, 102, 117, 110, 99, 32, 40, 100, 114, 111, 112, 32, 40, 105, 51, 50, 46, 99, 111, 110, 115, 116, 48, 41, 41, 41]; + let compilation = compile(wasm_binary.to_vec()); + assert!(compilation.is_err(), "WASM should not compile as is malformed"); +} + +// Line 8 +#[test] +fn c1_l8_assert_malformed() { + let wasm_binary = [40, 102, 117, 110, 99, 32, 98, 114, 32, 48, 100, 114, 111, 112, 41]; + let compilation = compile(wasm_binary.to_vec()); + assert!(compilation.is_err(), "WASM should not compile as is malformed"); +} From b31b08627368363749c6c98fd7b58556fec07516 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 18:07:18 -0800 Subject: [PATCH 13/29] Improved wasmer logo --- install.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/install.sh b/install.sh index 7eb79a37f..5b759a526 100755 --- a/install.sh +++ b/install.sh @@ -225,22 +225,22 @@ wasmer_install() { printf "${white}Installing Wasmer!$reset\n" printf " - ${magenta3}###${reset} - ${magenta3}#####${reset} - ${magenta2}### ${magenta3}######${reset} - ${magenta2}###### ${magenta3}#############${reset} -${magenta1}#${magenta2} ####### ${magenta3}##############${reset} -${magenta1}#####${magenta2} #############${magenta3}#########${reset} -${magenta1}######${magenta2}###############${magenta3}#######${reset} -${magenta1}############${magenta2}#########${magenta3}#######${reset} -${magenta1}##############${magenta2}#######${magenta3}#######${reset} -${magenta1}##############${magenta2}#######${magenta3}#######${reset} -${magenta1}##############${magenta2}#######${magenta3}#######${reset} -${magenta1}##############${magenta2}####### ${magenta3}###${reset} -${magenta1}##############${magenta2}####### - ${magenta1}###########${magenta2} ### - ${magenta1}########${magenta2} - ${magenta1}####${reset} + ${magenta3}###${reset} + ${magenta3}#####${reset} + ${magenta2}### ${magenta3}######${reset} + ${magenta2}###### ${magenta3}#############${reset} + ${magenta1}#${magenta2} ####### ${magenta3}##############${reset} + ${magenta1}#####${magenta2} #############${magenta3}#########${reset} + ${magenta1}######${magenta2}###############${magenta3}#######${reset} + ${magenta1}############${magenta2}#########${magenta3}#######${reset} + ${magenta1}##############${magenta2}#######${magenta3}#######${reset} + ${magenta1}##############${magenta2}#######${magenta3}#######${reset} + ${magenta1}##############${magenta2}#######${magenta3}#######${reset} + ${magenta1}##############${magenta2}####### ${magenta3}###${reset} + ${magenta1}##############${magenta2}####### + ${magenta1}###########${magenta2} ### + ${magenta1}########${magenta2} + ${magenta1}####${reset} " # if [ -d "$HOME/.wasmer" ]; then From 9ffbf54a184868cf362b05a9343a23ed8715f8d3 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 18:29:42 -0800 Subject: [PATCH 14/29] Improved install wasmer logo --- install.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/install.sh b/install.sh index 5b759a526..ad5b327c9 100755 --- a/install.sh +++ b/install.sh @@ -225,22 +225,22 @@ wasmer_install() { printf "${white}Installing Wasmer!$reset\n" printf " - ${magenta3}###${reset} - ${magenta3}#####${reset} - ${magenta2}### ${magenta3}######${reset} - ${magenta2}###### ${magenta3}#############${reset} - ${magenta1}#${magenta2} ####### ${magenta3}##############${reset} - ${magenta1}#####${magenta2} #############${magenta3}#########${reset} + ${magenta1} ${magenta2} ${magenta3}###${reset} + ${magenta1} ${magenta2} ${magenta3}#####${reset} + ${magenta1} ${magenta2}### ${magenta3}######${reset} + ${magenta1} ${magenta2}###### ${magenta3}#############${reset} + ${magenta1}# ${magenta2}####### ${magenta3}##############${reset} + ${magenta1}##### ${magenta2}#############${magenta3}#########${reset} ${magenta1}######${magenta2}###############${magenta3}#######${reset} ${magenta1}############${magenta2}#########${magenta3}#######${reset} ${magenta1}##############${magenta2}#######${magenta3}#######${reset} ${magenta1}##############${magenta2}#######${magenta3}#######${reset} ${magenta1}##############${magenta2}#######${magenta3}#######${reset} - ${magenta1}##############${magenta2}####### ${magenta3}###${reset} + ${magenta1}##############${magenta2}#######${magenta3} ###${reset} ${magenta1}##############${magenta2}####### ${magenta1}###########${magenta2} ### ${magenta1}########${magenta2} - ${magenta1}####${reset} + ${magenta1}####${reset} " # if [ -d "$HOME/.wasmer" ]; then From 219bd6825619fa1e4911ddc8d1e74ae350568dbd Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 18:41:51 -0800 Subject: [PATCH 15/29] Improved error messaging --- src/main.rs | 2 +- src/webassembly/errors.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3ded47d9d..ef0c8f8ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,7 +80,7 @@ fn execute_wasm(wasm_path: PathBuf) -> Result<(), String> { let import_object = integrations::generate_libc_env(); let webassembly::ResultObject { module, instance } = webassembly::instantiate(wasm_binary, import_object) - .map_err(|err| String::from(err.description()))?; + .map_err(|err| format!("{}", err))?; // webassembly::utils::print_instance_offsets(&instance); diff --git a/src/webassembly/errors.rs b/src/webassembly/errors.rs index d490d8047..f763b0bd2 100644 --- a/src/webassembly/errors.rs +++ b/src/webassembly/errors.rs @@ -14,17 +14,17 @@ error_chain! { errors { CompileError(reason: String) { description("WebAssembly compilation error") - display("Compilation error: '{:?}'", reason) + display("Compilation error: {}", reason) } LinkError(reason: String) { description("WebAssembly link error") - display("Link error: '{:?}'", reason) + display("Link error: {}", reason) } RuntimeError(reason: String) { description("WebAssembly runtime error") - display("Runtime error: '{:?}'", reason) + display("Runtime error: {}", reason) } } } From d56da9c80c117250bb4674f29b0efe2f40fb686c Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 19:19:23 -0800 Subject: [PATCH 16/29] Refactored emscripten integratoin --- src/integrations/mod.rs | 53 ------------------- src/linkers/emscripten/mod.rs | 43 +++++++++++++++ src/linkers/emscripten/printf.rs | 11 ++++ src/linkers/emscripten/putchar.rs | 1 + .../emscripten}/tests/printf.wast | 0 .../emscripten}/tests/putchar.wast | 0 src/linkers/mod.rs | 4 ++ src/main.rs | 4 +- 8 files changed, 61 insertions(+), 55 deletions(-) delete mode 100644 src/integrations/mod.rs create mode 100644 src/linkers/emscripten/mod.rs create mode 100644 src/linkers/emscripten/printf.rs create mode 100644 src/linkers/emscripten/putchar.rs rename src/{integrations => linkers/emscripten}/tests/printf.wast (100%) rename src/{integrations => linkers/emscripten}/tests/putchar.wast (100%) create mode 100644 src/linkers/mod.rs diff --git a/src/integrations/mod.rs b/src/integrations/mod.rs deleted file mode 100644 index b80dc205f..000000000 --- a/src/integrations/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::webassembly::{ImportObject, Instance}; -use libc::{printf, putchar}; - -extern "C" fn _printf(memory_offset: i32, extra: i32, instance: &Instance) -> i32 { - let mem = &instance.memories[0]; - return unsafe { - let base_memory_offset = mem.mmap.as_ptr().offset(memory_offset as isize) as *const i8; - printf(base_memory_offset, extra) - }; -} - -pub fn generate_libc_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { - let mut import_object = ImportObject::new(); - import_object.set("env", "printf", _printf as *const u8); - import_object.set("env", "putchar", putchar as *const u8); - import_object -} - -#[cfg(test)] -mod tests { - use super::generate_libc_env; - use crate::webassembly::{instantiate, Export, Instance}; - - #[test] - fn test_putchar() { - let wasm_bytes = include_wast2wasm_bytes!("tests/putchar.wast"); - let import_object = generate_libc_env(); - let result_object = instantiate(wasm_bytes, import_object).expect("Not compiled properly"); - let module = result_object.module; - let instance = result_object.instance; - let func_index = match module.info.exports.get("main") { - Some(&Export::Function(index)) => index, - _ => panic!("Function not found"), - }; - let main: fn(&Instance) = get_instance_function!(instance, func_index); - main(&instance); - } - - #[test] - fn test_print() { - let wasm_bytes = include_wast2wasm_bytes!("tests/printf.wast"); - let import_object = generate_libc_env(); - let result_object = instantiate(wasm_bytes, import_object).expect("Not compiled properly"); - let module = result_object.module; - let instance = result_object.instance; - let func_index = match module.info.exports.get("main") { - Some(&Export::Function(index)) => index, - _ => panic!("Function not found"), - }; - let main: fn(&Instance) = get_instance_function!(instance, func_index); - main(&instance); - } -} diff --git a/src/linkers/emscripten/mod.rs b/src/linkers/emscripten/mod.rs new file mode 100644 index 000000000..c7c5c990f --- /dev/null +++ b/src/linkers/emscripten/mod.rs @@ -0,0 +1,43 @@ +use crate::webassembly::ImportObject; + +mod printf; +mod putchar; + +pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { + let mut import_object = ImportObject::new(); + import_object.set("env", "printf", printf::printf as *const u8); + import_object.set("env", "putchar", putchar::putchar as *const u8); + import_object +} + +#[cfg(test)] +mod tests { + use super::generate_emscripten_env; + use crate::webassembly::{instantiate, Export, Instance}; + + #[test] + fn test_putchar() { + let wasm_bytes = include_wast2wasm_bytes!("tests/putchar.wast"); + let import_object = generate_emscripten_env(); + let result_object = instantiate(wasm_bytes, import_object).expect("Not compiled properly"); + let func_index = match result_object.module.info.exports.get("main") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let main: fn(&Instance) = get_instance_function!(result_object.instance, func_index); + main(&result_object.instance); + } + + #[test] + fn test_print() { + let wasm_bytes = include_wast2wasm_bytes!("tests/printf.wast"); + let import_object = generate_emscripten_env(); + let result_object = instantiate(wasm_bytes, import_object).expect("Not compiled properly"); + let func_index = match result_object.module.info.exports.get("main") { + Some(&Export::Function(index)) => index, + _ => panic!("Function not found"), + }; + let main: fn(&Instance) = get_instance_function!(result_object.instance, func_index); + main(&result_object.instance); + } +} diff --git a/src/linkers/emscripten/printf.rs b/src/linkers/emscripten/printf.rs new file mode 100644 index 000000000..e8f4d902c --- /dev/null +++ b/src/linkers/emscripten/printf.rs @@ -0,0 +1,11 @@ +use libc::printf as _printf; + +use crate::webassembly::Instance; + +pub extern "C" fn printf(memory_offset: i32, extra: i32, instance: &Instance) -> i32 { + let mem = &instance.memories[0]; + return unsafe { + let base_memory_offset = mem.mmap.as_ptr().offset(memory_offset as isize) as *const i8; + _printf(base_memory_offset, extra) + }; +} diff --git a/src/linkers/emscripten/putchar.rs b/src/linkers/emscripten/putchar.rs new file mode 100644 index 000000000..20309b020 --- /dev/null +++ b/src/linkers/emscripten/putchar.rs @@ -0,0 +1 @@ +pub use libc::putchar; diff --git a/src/integrations/tests/printf.wast b/src/linkers/emscripten/tests/printf.wast similarity index 100% rename from src/integrations/tests/printf.wast rename to src/linkers/emscripten/tests/printf.wast diff --git a/src/integrations/tests/putchar.wast b/src/linkers/emscripten/tests/putchar.wast similarity index 100% rename from src/integrations/tests/putchar.wast rename to src/linkers/emscripten/tests/putchar.wast diff --git a/src/linkers/mod.rs b/src/linkers/mod.rs new file mode 100644 index 000000000..c21b7bcbd --- /dev/null +++ b/src/linkers/mod.rs @@ -0,0 +1,4 @@ + +pub mod emscripten; + +pub use self::emscripten::generate_emscripten_env; diff --git a/src/main.rs b/src/main.rs index ef0c8f8ba..a1c4fce10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,7 +37,7 @@ use wabt::wat2wasm; #[macro_use] mod macros; pub mod common; -pub mod integrations; +pub mod linkers; pub mod sighandler; #[cfg(test)] mod spectests; @@ -77,7 +77,7 @@ fn execute_wasm(wasm_path: PathBuf) -> Result<(), String> { wasm_binary = wat2wasm(wasm_binary).map_err(|err| String::from(err.description()))?; } - let import_object = integrations::generate_libc_env(); + let import_object = linkers::generate_emscripten_env(); let webassembly::ResultObject { module, instance } = webassembly::instantiate(wasm_binary, import_object) .map_err(|err| format!("{}", err))?; From aa5a5549f2d9166ad79150af1788a7406e8920d7 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 19:42:36 -0800 Subject: [PATCH 17/29] Added emscripten abort function --- src/linkers/emscripten/abort.rs | 9 +++++++++ src/linkers/emscripten/mod.rs | 3 +++ 2 files changed, 12 insertions(+) create mode 100644 src/linkers/emscripten/abort.rs diff --git a/src/linkers/emscripten/abort.rs b/src/linkers/emscripten/abort.rs new file mode 100644 index 000000000..bb4cfa117 --- /dev/null +++ b/src/linkers/emscripten/abort.rs @@ -0,0 +1,9 @@ + +use crate::webassembly::Instance; +use std::process; + + +pub extern "C" fn abort(_code: i32, _instance: &Instance) { + process::abort(); + // abort!("Aborted") +} \ No newline at end of file diff --git a/src/linkers/emscripten/mod.rs b/src/linkers/emscripten/mod.rs index c7c5c990f..235814ed0 100644 --- a/src/linkers/emscripten/mod.rs +++ b/src/linkers/emscripten/mod.rs @@ -2,11 +2,14 @@ use crate::webassembly::ImportObject; mod printf; mod putchar; +mod abort; pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { let mut import_object = ImportObject::new(); import_object.set("env", "printf", printf::printf as *const u8); import_object.set("env", "putchar", putchar::putchar as *const u8); + import_object.set("env", "abort", abort::abort as *const u8); + import_object.set("env", "_abort", abort::abort as *const u8); import_object } From 278dff0fa69efe127737fbe69f124d96869f7dbb Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 13 Nov 2018 19:44:24 -0800 Subject: [PATCH 18/29] Added Instance options, automatically mock missing imports --- src/webassembly/instance.rs | 31 ++++++++++++++++++++++++++++--- src/webassembly/mod.rs | 4 ++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index ac058e7f9..c0bd8c992 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -123,11 +123,22 @@ pub struct DataPointers { pub globals: UncheckedSlice, } +#[derive(Debug, Clone)] +pub struct InstanceOptions { + // Shall we mock automatically the imported functions if they don't exist? + pub mock_missing_imports: bool, +} + +extern fn mock_fn() -> i32 { + return 0; +} + impl Instance { /// Create a new `Instance`. pub fn new( module: &Module, import_object: &ImportObject<&str, &str>, + options: InstanceOptions, ) -> Result { let mut tables: Vec> = Vec::new(); let mut memories: Vec = Vec::new(); @@ -145,17 +156,31 @@ impl Instance { .finish(module.info.flags.clone()); let mut relocations = Vec::new(); + // let imported_functions: Vec = module.info.imported_funcs.iter().map(|(module, field)| { + // format!(" * {}.{}", module, field) + // }).collect(); + + // println!("Instance imported functions: \n{}", imported_functions.join("\n")); + // We walk through the imported functions and set the relocations // for each of this functions to be an empty vector (as is defined outside of wasm) for (module, field) in module.info.imported_funcs.iter() { let function = import_object - .get(&module.as_str(), &field.as_str()) - .ok_or_else(|| { + .get(&module.as_str(), &field.as_str()); + let function = if options.mock_missing_imports { + function.unwrap_or_else(|| { + debug!("The import {}.{} is not provided, therefore will be mocked.", module, field); + mock_fn as *const u8 + }) + } + else { + function.ok_or_else(|| { ErrorKind::LinkError(format!( "Imported function {}.{} was not provided in the import_functions", module, field )) - })?; + })? + }; // println!("GET FUNC {:?}", function); import_functions.push(function); relocations.push(vec![]); diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index c3b893bd7..1508f7516 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -13,7 +13,7 @@ use wasmparser; pub use self::errors::{Error, ErrorKind}; pub use self::import_object::ImportObject; -pub use self::instance::{Instance}; +pub use self::instance::{Instance, InstanceOptions}; pub use self::memory::LinearMemory; pub use self::module::{Export, Module, ModuleInfo}; @@ -46,7 +46,7 @@ pub fn instantiate( ) -> Result { let module = compile(buffer_source)?; debug!("webassembly - creating instance"); - let instance = Instance::new(&module, &import_object)?; + let instance = Instance::new(&module, &import_object, InstanceOptions { mock_missing_imports: true })?; debug!("webassembly - instance created"); Ok(ResultObject { module, instance }) } From 6bfd7d908131ad5a0c90f966bf028b8851b551fa Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 14 Nov 2018 11:05:57 -0800 Subject: [PATCH 19/29] Improved instance & module data pointers location --- src/webassembly/instance.rs | 8 +++++--- src/webassembly/module.rs | 18 +++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index c0bd8c992..c22fec45f 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -78,7 +78,11 @@ fn get_function_addr( /// An Instance of a WebAssembly module #[derive(Debug)] +#[repr(C)] pub struct Instance { + // C-like pointers to data (heaps, globals, tables) + pub data_pointers: DataPointers, + /// WebAssembly table data // pub tables: Arc>>>, pub tables: Arc>>, @@ -101,9 +105,6 @@ pub struct Instance { // Region start memory location // code_base: *const (), - // C-like pointers to data (heaps, globals, tables) - pub data_pointers: DataPointers, - // Default memory bound // TODO: Support for only one LinearMemory for now. pub default_memory_bound: i32, @@ -112,6 +113,7 @@ pub struct Instance { /// Contains pointers to data (heaps, globals, tables) needed /// by Cranelift. #[derive(Debug)] +#[repr(C)] pub struct DataPointers { // Pointer to tables pub tables: UncheckedSlice>, diff --git a/src/webassembly/module.rs b/src/webassembly/module.rs index bef367ac7..b74c9dbc6 100644 --- a/src/webassembly/module.rs +++ b/src/webassembly/module.rs @@ -332,12 +332,12 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { let vmctx = func.create_global_value(ir::GlobalValueData::VMContext); let ptr_size = self.ptr_size(); - // Given a vmctx, we want to retrieve vmctx.tables - // Create a table whose base address is stored at `vmctx+88`. - // 88 is the offset of the vmctx.tables pointer respect to vmctx pointer + // Given a instance, we want to retrieve instance.tables + // Create a table whose base address is stored at `instance+0`. + // 0 is the offset of the vmctx.tables pointer respect to vmctx pointer let base = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(88), + offset: Offset32::new(0), global_type: self.pointer_type(), }); @@ -369,12 +369,12 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { } fn make_heap(&mut self, func: &mut ir::Function, index: MemoryIndex) -> ir::Heap { - // Create a static heap whose base address is stored at `vmctx+96`. + // Create a static heap whose base address is stored at `instance+8`. let vmctx = func.create_global_value(ir::GlobalValueData::VMContext); let heap_base_addr = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(96), + offset: Offset32::new(8), global_type: self.pointer_type(), }); @@ -454,7 +454,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { let globals_base_addr = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(104), + offset: Offset32::new(16), global_type: self.pointer_type(), }); @@ -506,6 +506,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { .special_param(ir::ArgumentPurpose::VMContext) .expect("Missing vmctx parameter"); + // The `callee` value is an index into a table of function pointers. // Apparently, that table is stored at absolute address 0 in this dummy environment. // TODO: Generate bounds checking code. @@ -556,6 +557,9 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { .special_param(ir::ArgumentPurpose::VMContext) .expect("Missing vmctx parameter"); + // println!("POINTER BYTES {}", self.pointer_bytes()); + // println!("POINTER SIZE {}", self.ptr_size()); + // Build a value list for the call instruction containing the call_args and the vmctx // parameter. let mut args = ir::ValueList::default(); From 1ebc51eeb7c830dbcd4d4c3bfb33aa4cc9c2acc3 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 14 Nov 2018 14:58:28 -0800 Subject: [PATCH 20/29] Improve install script with better cursor positioning text --- install.sh | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/install.sh b/install.sh index ad5b327c9..545b780b2 100755 --- a/install.sh +++ b/install.sh @@ -127,14 +127,14 @@ wasmer_detect_profile() { wasmer_link() { printf "$cyan> Adding to \$PATH...$reset\n" WASMER_PROFILE="$(wasmer_detect_profile)" - SOURCE_STR="\nexport PATH=\"\$HOME/.wasmer/bin:\$PATH\"\n" + SOURCE_STR="\n export PATH=\"\$HOME/.wasmer/bin:\$PATH\"\n" if [ -z "${WASMER_PROFILE-}" ] ; then - printf "$red> Profile not found. Tried ${WASMER_PROFILE} (as defined in \$PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.\n" - echo "> Create one of them and run this script again" - echo "> Create it (touch ${WASMER_PROFILE}) and run this script again" - echo " OR" - printf "> Append the following lines to the correct file yourself:$reset\n" + printf "$red > Profile not found. Tried ${WASMER_PROFILE} (as defined in \$PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.\n" + echo " > Create one of them and run this script again" + echo " > Create it (touch ${WASMER_PROFILE}) and run this script again" + echo " OR" + printf " > Append the following lines to the correct file yourself:$reset\n" command printf "${SOURCE_STR}" else if ! grep -q 'wasmer' "$WASMER_PROFILE"; then @@ -144,9 +144,9 @@ wasmer_link() { command printf "$SOURCE_STR" >> "$WASMER_PROFILE" fi fi - - printf "$cyan> We've added the following to your $WASMER_PROFILE\n" - echo "> If this isn't the profile of your current shell then please add the following to your correct profile:" + printf "\033[1A$cyan> Adding to \$PATH... ✓$reset\n" + printf "$white We've added the following to your $WASMER_PROFILE\n" + echo " If this isn't the profile of your current shell then please add the following to your correct profile:" printf " $SOURCE_STR$reset\n" version=`$HOME/.wasmer/bin/wasmer --version` || ( @@ -154,7 +154,7 @@ wasmer_link() { exit 1; ) - printf "$green> Successfully installed Wasmer $version! Please open another terminal where the \`wasmer\` command will now be available.$reset\n" + printf "$green> Successfully installed Wasmer $version!\n${white} Please open another terminal where the \`wasmer\` command will now be available.$reset\n" fi } @@ -303,7 +303,6 @@ wasmer_download() { INSTALL_DIRECTORY="$HOME/.wasmer" fi WASMER=INSTALL_DIRECTORY - printf "$cyan> Getting wasmer releases...$reset\n" # assemble expected release artifact name BINARY="wasmer-${OS}-${ARCH}" @@ -315,10 +314,11 @@ wasmer_download() { # if WASMER_RELEASE_TAG was not provided, assume latest if [ -z "$WASMER_RELEASE_TAG" ]; then + printf "$cyan> Getting wasmer releases...$reset\n" wasmer_download_json LATEST_RELEASE "$RELEASES_URL/latest" WASMER_RELEASE_TAG=$(echo "${LATEST_RELEASE}" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//' ) + printf "\033[1A$cyan> Getting wasmer releases... ✓$reset\n" fi - printf "$cyan> Latest wasmer release: $WASMER_RELEASE_TAG$reset\n" # fetch the real release data to make sure it exists before we attempt a download wasmer_download_json RELEASE_DATA "$RELEASES_URL/tag/$WASMER_RELEASE_TAG" @@ -326,9 +326,12 @@ wasmer_download() { BINARY_URL="$RELEASES_URL/download/$WASMER_RELEASE_TAG/$BINARY" DOWNLOAD_FILE=$(mktemp -t wasmer.XXXXXXXXXX) - printf "$cyan> Downloading executable...$reset\n" + printf "$cyan> Downloading $WASMER_RELEASE_TAG release...$reset\n" wasmer_download_file "$BINARY_URL" "$DOWNLOAD_FILE" - + # echo -en "\b\b" + printf "\033[2A$cyan> Downloading $WASMER_RELEASE_TAG release... ✓$reset\033[K\n" + printf "\033[K\n\033[1A" + # printf "\033[1A$cyan> Downloaded$reset\033[K\n" # echo "Setting executable permissions." chmod +x "$DOWNLOAD_FILE" From 92d8de7df739e7dd7fd771e4aadbceef22551a41 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 14 Nov 2018 20:00:14 -0800 Subject: [PATCH 21/29] Improved a bit more the install script --- install.sh | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/install.sh b/install.sh index 545b780b2..8f4fd5f82 100755 --- a/install.sh +++ b/install.sh @@ -29,6 +29,8 @@ green="\033[32m" yellow="\033[33m" cyan="\033[36m" white="\033[37m" +bold="\e[1m" +dim="\e[2m" RELEASES_URL="https://github.com/WAFoundation/wasmer/releases" @@ -127,14 +129,14 @@ wasmer_detect_profile() { wasmer_link() { printf "$cyan> Adding to \$PATH...$reset\n" WASMER_PROFILE="$(wasmer_detect_profile)" - SOURCE_STR="\n export PATH=\"\$HOME/.wasmer/bin:\$PATH\"\n" + SOURCE_STR="\nexport PATH=\"\$HOME/.wasmer/bin:\$PATH\"\n" if [ -z "${WASMER_PROFILE-}" ] ; then - printf "$red > Profile not found. Tried ${WASMER_PROFILE} (as defined in \$PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.\n" - echo " > Create one of them and run this script again" - echo " > Create it (touch ${WASMER_PROFILE}) and run this script again" - echo " OR" - printf " > Append the following lines to the correct file yourself:$reset\n" + printf "${red}Profile not found. Tried:\n* ${WASMER_PROFILE} (as defined in \$PROFILE)\n* ~/.bashrc\n* ~/.bash_profile\n* ~/.zshrc\n* ~/.profile.\n" + echo "\nHow to solve this issue?\n* Create one of them and run this script again" + echo "* Create it (touch ${WASMER_PROFILE}) and run this script again" + echo " OR" + printf "* Append the following lines to the correct file yourself:$reset\n" command printf "${SOURCE_STR}" else if ! grep -q 'wasmer' "$WASMER_PROFILE"; then @@ -145,16 +147,16 @@ wasmer_link() { fi fi printf "\033[1A$cyan> Adding to \$PATH... ✓$reset\n" - printf "$white We've added the following to your $WASMER_PROFILE\n" - echo " If this isn't the profile of your current shell then please add the following to your correct profile:" - printf " $SOURCE_STR$reset\n" + printf "${dim}Note: We've added the following to your $WASMER_PROFILE\n" + echo "If this isn't the profile of your current shell then please add the following to your correct profile:" + printf "$SOURCE_STR$reset\n" version=`$HOME/.wasmer/bin/wasmer --version` || ( - printf "$red> Wasmer was installed, but doesn't seem to be working :(.$reset\n" + printf "$red> wasmer was installed, but doesn't seem to be working :($reset\n" exit 1; ) - printf "$green> Successfully installed Wasmer $version!\n${white} Please open another terminal where the \`wasmer\` command will now be available.$reset\n" + printf "$green> Successfully installed $version!\n${reset}Please open another terminal where the \`${bold}wasmer$reset\` command will now be available.$reset\n" fi } @@ -223,7 +225,7 @@ wasmer_install() { magenta2="${reset}\033[34m" magenta3="${reset}\033[34;2m" - printf "${white}Installing Wasmer!$reset\n" + printf "${reset}Installing Wasmer!$reset\n" printf " ${magenta1} ${magenta2} ${magenta3}###${reset} ${magenta1} ${magenta2} ${magenta3}#####${reset} From ef09889df9bfd1c8c4cd442e349a6362f7bff14e Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 14 Nov 2018 23:56:02 -0800 Subject: [PATCH 22/29] Improved offsets in module using pointer size rather than fixed numbers --- src/webassembly/instance.rs | 8 +++--- src/webassembly/module.rs | 55 ++++++++++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index c22fec45f..c89f62f08 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -83,6 +83,10 @@ pub struct Instance { // C-like pointers to data (heaps, globals, tables) pub data_pointers: DataPointers, + // Default memory bound + // TODO: Support for only one LinearMemory for now. + pub default_memory_bound: i32, + /// WebAssembly table data // pub tables: Arc>>>, pub tables: Arc>>, @@ -104,10 +108,6 @@ pub struct Instance { pub start_func: Option, // Region start memory location // code_base: *const (), - - // Default memory bound - // TODO: Support for only one LinearMemory for now. - pub default_memory_bound: i32, } /// Contains pointers to data (heaps, globals, tables) needed diff --git a/src/webassembly/module.rs b/src/webassembly/module.rs index b74c9dbc6..27fd8b785 100644 --- a/src/webassembly/module.rs +++ b/src/webassembly/module.rs @@ -38,6 +38,35 @@ use cranelift_wasm::{ use super::errors::ErrorKind; use super::memory::LinearMemory; +/// Get the integer type used for representing pointers on this platform. +fn native_pointer_type() -> ir::Type { + if cfg!(target_pointer_width = "64") { + ir::types::I64 + } else { + ir::types::I32 + } +} + +/// Number of bytes in a native pointer. +pub fn native_pointer_size() -> i32 { + if cfg!(target_pointer_width = "64") { + 8 + } else { + 4 + } +} + +// /// Convert a TlsData offset into a `Offset32` for a global decl. +// fn offset32(offset: usize) -> ir::immediates::Offset32 { +// assert!(offset <= i32::max_value() as usize); +// (offset as i32).into() +// } + +// /// Convert a usize offset into a `Imm64` for an iadd_imm. +// fn imm64(offset: usize) -> ir::immediates::Imm64 { +// (offset as i64).into() +// } + /// Compute a `ir::ExternalName` for a given wasm function index. fn get_func_name(func_index: FuncIndex) -> ir::ExternalName { ir::ExternalName::user(0, func_index.index() as u32) @@ -337,8 +366,8 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { // 0 is the offset of the vmctx.tables pointer respect to vmctx pointer let base = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(0), - global_type: self.pointer_type(), + offset: Offset32::new(native_pointer_size() * 0), + global_type: native_pointer_type(), }); // This will be 0 when the index is 0, not sure if the offset will work regardless @@ -348,7 +377,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { let base_gv = func.create_global_value(ir::GlobalValueData::Load { base: base, offset: Offset32::new(table_data_offset), - global_type: self.pointer_type(), + global_type: native_pointer_type(), }); let bound_gv = func.create_global_value(ir::GlobalValueData::Load { @@ -369,28 +398,28 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { } fn make_heap(&mut self, func: &mut ir::Function, index: MemoryIndex) -> ir::Heap { + assert_eq!(index, 0, "Only one WebAssembly memory supported"); // Create a static heap whose base address is stored at `instance+8`. let vmctx = func.create_global_value(ir::GlobalValueData::VMContext); let heap_base_addr = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(8), - global_type: self.pointer_type(), + offset: Offset32::new(native_pointer_size() * 1), // 8 + global_type: native_pointer_type(), }); - let pointer_bytes = self.pointer_bytes(); - let memories_offset = (index * pointer_bytes as usize) as i32; + let memories_offset = 0; // (index * pointer_bytes as usize) as i32; // We de-reference the vm_context.memories addr let heap_base = func.create_global_value(ir::GlobalValueData::Load { base: heap_base_addr, offset: Offset32::new(memories_offset), - global_type: self.pointer_type(), + global_type: native_pointer_type(), }); let bound_gv = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(120), + offset: Offset32::new(native_pointer_size() * 3), // 24 global_type: I32, }); @@ -454,15 +483,15 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { let globals_base_addr = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: Offset32::new(16), - global_type: self.pointer_type(), + offset: Offset32::new(native_pointer_size() * 2), + global_type: native_pointer_type(), }); - let offset = (index * 8) as i64; + let offset = (index * native_pointer_size() as usize) as i64; let iadd = func.create_global_value(ir::GlobalValueData::IAddImm { base: globals_base_addr, offset: Imm64::new(offset), - global_type: self.pointer_type(), + global_type: native_pointer_type(), }); GlobalVariable::Memory { gv: iadd, From cdbd27275c1eba8f0f49ca52006639b62dd4f3a1 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 00:50:54 -0800 Subject: [PATCH 23/29] Improved errors formatting --- src/main.rs | 14 ++++++-------- src/webassembly/mod.rs | 26 ++++++++++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index a1c4fce10..b711ec1f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,6 @@ extern crate spin; extern crate log; // use libc; -use std::error::Error; use std::fs::File; use std::io; use std::io::Read; @@ -32,7 +31,6 @@ use std::path::PathBuf; use std::process::exit; use structopt::StructOpt; -use wabt::wat2wasm; #[macro_use] mod macros; @@ -62,7 +60,7 @@ struct Run { } /// Read the contents of a file -fn read_file_contents(path: PathBuf) -> Result, io::Error> { +fn read_file_contents(path: &PathBuf) -> Result, io::Error> { let mut buffer: Vec = Vec::new(); let mut file = File::open(path)?; file.read_to_end(&mut buffer)?; @@ -72,15 +70,15 @@ fn read_file_contents(path: PathBuf) -> Result, io::Error> { /// Execute a WASM/WAT file fn execute_wasm(wasm_path: PathBuf) -> Result<(), String> { let mut wasm_binary: Vec = - read_file_contents(wasm_path).map_err(|err| String::from(err.description()))?; + read_file_contents(&wasm_path).map_err(|err| format!("Can't read the file {}: {}", wasm_path.as_os_str().to_string_lossy(), err))?; if !webassembly::utils::is_wasm_binary(&wasm_binary) { - wasm_binary = wat2wasm(wasm_binary).map_err(|err| String::from(err.description()))?; + wasm_binary = wabt::wat2wasm(wasm_binary).map_err(|err| format!("Can't convert from wast to wasm: {:?}", err))?; } let import_object = linkers::generate_emscripten_env(); let webassembly::ResultObject { module, instance } = webassembly::instantiate(wasm_binary, import_object) - .map_err(|err| format!("{}", err))?; + .map_err(|err| format!("Can't instantiate the WebAssembly module: {}", err))?; // webassembly::utils::print_instance_offsets(&instance); @@ -99,8 +97,8 @@ fn run(options: Run) { match execute_wasm(options.path.clone()) { Ok(()) => {} Err(message) => { - let name = options.path.as_os_str().to_string_lossy(); - println!("error while executing {}: {}", name, message); + // let name = options.path.as_os_str().to_string_lossy(); + println!("{}", message); exit(1); } } diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index 1508f7516..a3be88647 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -10,6 +10,7 @@ use std::panic; use std::str::FromStr; use target_lexicon; use wasmparser; +use wasmparser::WasmDecoder; pub use self::errors::{Error, ErrorKind}; pub use self::import_object::ImportObject; @@ -73,11 +74,8 @@ pub fn instantiate_streaming( /// webassembly::CompileError. pub fn compile(buffer_source: Vec) -> Result { // TODO: This should be automatically validated when creating the Module - let valid = validate(&buffer_source); - debug!("webassembly - valid {:?}", valid); - if !valid { - return Err(ErrorKind::CompileError("Module not valid".to_string())); - } + debug!("webassembly - validating module"); + validate_or_error(&buffer_source)?; debug!("webassembly - creating module"); let module = Module::from_bytes(buffer_source, triple!("x86_64"), None)?; @@ -90,8 +88,20 @@ pub fn compile(buffer_source: Vec) -> Result { /// array of WebAssembly binary code, returning whether the bytes /// form a valid wasm module (true) or not (false). /// Params: -/// * `buffer_source`: A `Vec` containing the +/// * `buffer_source`: A `&[u8]` containing the /// binary code of the .wasm module you want to compile. -pub fn validate(buffer_source: &Vec) -> bool { - wasmparser::validate(buffer_source, None) +pub fn validate(buffer_source: &[u8]) -> bool { + validate_or_error(buffer_source).is_ok() +} + +pub fn validate_or_error(bytes: &[u8]) -> Result<(), ErrorKind> { + let mut parser = wasmparser::ValidatingParser::new(bytes, None); + loop { + let state = parser.read(); + match *state { + wasmparser::ParserState::EndWasm => return Ok(()), + wasmparser::ParserState::Error(err) => return Err(ErrorKind::CompileError(format!("Validation error: {}", err.message))), + _ => (), + } + } } From 459d5f376d11d9c4de8bebe6b659e2f474ab864d Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 01:22:44 -0800 Subject: [PATCH 24/29] Improved signal error messages --- examples/trap.wat | 5 +++++ src/sighandler.rs | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 examples/trap.wat diff --git a/examples/trap.wat b/examples/trap.wat new file mode 100644 index 000000000..789073b09 --- /dev/null +++ b/examples/trap.wat @@ -0,0 +1,5 @@ +(module + (func $main (export "main") (result i32) + (i32.div_s (i32.const 0) (i32.const 0)) + ) +) diff --git a/src/sighandler.rs b/src/sighandler.rs index 123487e94..d64bba470 100644 --- a/src/sighandler.rs +++ b/src/sighandler.rs @@ -5,9 +5,11 @@ //! Please read more about this here: https://github.com/CraneStation/wasmtime/issues/15 //! This code is inspired by: https://github.com/pepyakin/wasmtime/commit/625a2b6c0815b21996e111da51b9664feb174622 use nix::sys::signal::{ - sigaction, SaFlags, SigAction, SigHandler, SigSet, SIGBUS, SIGFPE, SIGILL, SIGSEGV, + sigaction, Signal, SaFlags, SigAction, SigHandler, SigSet, SIGBUS, SIGFPE, SIGILL, SIGSEGV, }; +static mut SETJMP_BUFFER: [::nix::libc::c_int; 27] = [0; 27]; + pub unsafe fn install_sighandler() { let sa = SigAction::new( SigHandler::Handler(signal_trap_handler), @@ -18,22 +20,29 @@ pub unsafe fn install_sighandler() { sigaction(SIGILL, &sa).unwrap(); sigaction(SIGSEGV, &sa).unwrap(); sigaction(SIGBUS, &sa).unwrap(); - let result = setjmp((&mut SETJMP_BUFFER[..]).as_mut_ptr() as *mut ::nix::libc::c_void); - if result != 0 { - panic!("Signal Error: {}", result); + let signum = setjmp((&mut SETJMP_BUFFER[..]).as_mut_ptr() as *mut ::nix::libc::c_void); + if signum != 0 { + let signal = Signal::from_c_int(signum).unwrap(); + match signal { + SIGFPE => panic!("floating-point exception"), + SIGILL => panic!("illegal instruction"), + SIGSEGV => panic!("segmentation violation"), + SIGBUS => panic!("bus error"), + _ => panic!("signal error: {:?}", signal), + }; } } -static mut SETJMP_BUFFER: [::nix::libc::c_int; 27] = [0; 27]; extern "C" { fn setjmp(env: *mut ::nix::libc::c_void) -> ::nix::libc::c_int; fn longjmp(env: *mut ::nix::libc::c_void, val: ::nix::libc::c_int); } -extern "C" fn signal_trap_handler(_: ::nix::libc::c_int) { + +extern "C" fn signal_trap_handler(signum: ::nix::libc::c_int) { unsafe { longjmp( (&mut SETJMP_BUFFER).as_mut_ptr() as *mut ::nix::libc::c_void, - 3, + signum, ); } } From 264b468a8da00fb56200d0c56edac015f5ca554c Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 11:06:55 -0800 Subject: [PATCH 25/29] Upload pypyjs example that should be working --- examples/pypyjs.wasm | Bin 0 -> 93575 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/pypyjs.wasm diff --git a/examples/pypyjs.wasm b/examples/pypyjs.wasm new file mode 100644 index 0000000000000000000000000000000000000000..8f25bb5adaadd25dc5a01e8367398972de22cf14 GIT binary patch literal 93575 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𝔣c{}1y7@&4& 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ⅇ1wKXdcLr=Ris zH~;#X-w$57x$%L{yKX%C_fOo@^6Wc4_GfRq_sv)Qc*Y6mtvdgKkrg)=??3O#Z4dqF zR|bCf-R~{FZP5)6Y#M6az3=L;JQD7Iq5s9l{`rni{OiXyUUlJ%58n8Wjki4b(8s&? zJh1AK-;~$=!^`*oeapoMPx;l^7hZqTH|PFI<-EbByH6Ot=`U`%|D^bj_doZxKVJ34 zYaaRW_J6qHv7db4uL?i9=CLn*<&j5sANJ{=zPRX%Lrd>ieDyCL`|NP}U%z$!g3oju zz2W@*KmEw_`$oQe_6w%_flQg8g-wJe2h%afN1-8Rp#|p!CnF1|BXcqGybgJ}Ft{`* z;>7i1n}&lc;SK5iOSWO7{7*b|I6pnR@7RDn0(0TqLJCW-5$ zeK#Qmuw8tgd-UZwxlGoq2|Fw0GD9%7^38Sm=H{|#pN}`j_i>wG>6ho`GRpEYvo7c6 zzTfmPs`_XAp5fPkw(VUL1pVuRU>n+I3zCEq-BdzK&|ksgMcnV2x4lsA-VN3awiSmq z59#4%2YzRt;O$U0;D$Yk&WdJj&El__1Es6J?rd;=p*#RY1_(P0zZJ(S+FKefN6R;! z7vbC;AFX|p^YF}h#iT~B;>KOz+_V2gxvmy+&|b61QQqKxz36(UJS(cB(6>Q;#n-b1POq!YX|#=E3QQV9+aOA}&_aAxjn@;ZM%>BEd zKe#-YRk?UpU*Dcf$*%vhvnoj7IUDy5Z3n4AhOXik4CoozAc{^p>7=Z$NRq%R#H&v_ zk(YN43>C`*RCCNzU#Fq%!e;YC=su`cDi^ki?}#B3E3cK;NmR6z*2}*euP9VdHkdpa zE9LAF2g6-CB5e!VOd@E_@-&@o3Q|+~q%2Px`6m}NDu?pLFD=ZaNPW$zxfztD)B)tVA1Dp(+!AFPTc=K& zenj&dnr0t&*o>C!q$7`+b?iH@zVi4J=bU-go0lwKb@sXoF1+aCOD=ue=F19Q-Nmij zdUo{ol`BJg-+uWOK_^OJ8=SFaFSx%VlsC{-3|5r-3&@f2S#VCVGTb+WYz;-_;vi^H zh-FJ(5nPUk5e*IP4K^0b{XLb6+>GwxKo7pdhQVUlB*gM@(cd#P#QpW9sG>;4Ry>SI zQq@yNrx3KLK9SM_aRw`uqPPd#R&nUt!W?~tGW;u!>_#@Dp}m8uM?}o7s~Ghaw-Vw| z9TaE_Hq-|^)C`n6skRJP_Bzfl4-ZnO$i?GO^?iM{R7B_o5tedK-`)sMWfv}yHM-L~ zSe0V2H&|XSRVwq`>!QA%fnM?>Y^4D*Sqoj!!HT4nMh!}aX3I+`RRfEV6}3qhM1w`( zW{q@1J^fO%kfz5QECeLY=9WNwuPjX%tTtR~u|Fj!$= zZ{$2x_@|=A`#zwhR+H{xrK{XC2+vX1YPT+v|0<5FJr-YeZSTP{B`m2#33*m3vAtRx z8C2gbE~qH0$XEY{D*tuEB1YTYioivsuCC#7fCr@Tp~+ZR2}jksaAO%xE@7YOV@z@P zXvqS&bQR^OuN)q5jHLWM{eykxRk+^jN0y}WG2=8%edvUy6G0v7+1f*~I3c{TJ6K_2 zW0fdiD&VAkHN*t1Mk$|4yeZD~LgtcJ#L6aRm0&G|h_)9h(Uu}?S0P3%{@GYA4VAF! zzW+s0UqdJGHS(+Lw(!_2J@t^TsX)`>5EZQu-E`{3_eYIG*ZBt5`lkBM-DP;mnr|A! zmsWi&>ebpg>UL##5N#j@cCJ;y6`~BaC#quYs+xUkp_KQzg?$P zxpjSU2)DhrD*nlJz4(u(Uj|&hdUaxNKn%btIQP7$^(`vj>Lz`s7NL JcNc<_{y*hr-vs~w literal 0 HcmV?d00001 From 2dcd25bebd42c0a5c80ccea1c547dc39e60eddf7 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 13:30:00 -0800 Subject: [PATCH 26/29] Make wasmer work with stable Rust --- .circleci/config.yml | 5 ++-- Cargo.lock | 27 +++++++++-------- Cargo.toml | 11 +++---- README.md | 5 +--- src/build_spectests.rs | 11 +++++-- src/main.rs | 9 +++--- src/webassembly/instance.rs | 58 +++++++++++++++++++++++-------------- 7 files changed, 71 insertions(+), 55 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7871bf516..5f22b9464 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,7 +10,6 @@ jobs: keys: - v4-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} - run: sudo apt-get install -y cmake - - run: rustup default nightly-2018-10-07 - run: make test - run: command: | @@ -50,9 +49,9 @@ jobs: tar xf cmake-3.4.1-Darwin-x86_64.tar.gz export PATH="`pwd`/cmake-3.4.1-Darwin-x86_64/CMake.app/Contents/bin:$PATH" - run: - name: Install Rust Nightly + name: Install Rust command: | - curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly-2018-10-07 + curl https://sh.rustup.rs -sSf | sh -s -- -y export PATH="$HOME/.cargo/bin:$PATH" cargo --version - run: diff --git a/Cargo.lock b/Cargo.lock index 0b0d6a774..0dd4135eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -238,6 +238,11 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libc" +version = "0.2.43" +source = "git+https://github.com/rust-lang/libc#5cc006652a242c35b6fe5b615ccd39d9356a2346" + [[package]] name = "libc" version = "0.2.43" @@ -436,11 +441,6 @@ dependencies = [ "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "spin" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "strsim" version = "0.7.0" @@ -578,18 +578,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wabt" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", - "wabt-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wabt-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wabt-sys" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -606,18 +606,17 @@ dependencies = [ "cranelift-wasm 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", "docopt 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (git+https://github.com/rust-lang/libc)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "region 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "target-lexicon 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "wabt 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wabt 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasmparser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -679,6 +678,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" "checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" +"checksum libc 0.2.43 (git+https://github.com/rust-lang/libc)" = "" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" "checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f" "checksum mach 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2fd13ee2dd61cc82833ba05ade5a30bb3d63f7ced605ef827063c63078302de9" @@ -703,7 +703,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" "checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe" "checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" -"checksum spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ceac490aa12c567115b40b7b7fceca03a6c9d53d5defea066123debc83c5dc1f" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum structopt 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ca85f2c9a5a1e2d5ac686fc0be48e40f8ad803f5bbe31f692ff71eb2dd8aad45" "checksum structopt-derive 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "1383e5db585da799a5c4acc496c5c868e18bf82e658c00c75cc91038fa26b55f" @@ -722,8 +721,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wabt 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0768faf932f2898c0a7545edee648fefa716906a2e143009addf4959d2335a75" -"checksum wabt-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4aaa9a8fa0d698315da5611f3e113a1e688fbb8d6fa0dd9510dfa023f665e9dc" +"checksum wabt 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5b24b2494bd6077dff717f41523f6e3e0161d58f578198589a6a6c8b314cb763" +"checksum wabt-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "122aefe1d22c067cce1dc5d20d89d1ca47ce0eb10120246a3e2340863f9e6ddd" "checksum wasmparser 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc6511bad33610d7798f80d48e10495a6eb4f1e39306b0bb340b2de0816c4ca" "checksum wasmparser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2a75e0c3fe9a4d4fd91901348a5be05ba4791e29dda89e8596bfe87900ba7edc" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" diff --git a/Cargo.toml b/Cargo.toml index 4a673b868..892d7c215 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "wasmer" version = "0.1.0" authors = ["Syrus Akbary "] -edition = "2018" +# edition = "2018" repository = "https://github.com/wafoundation/wasmer" publish = true description = "High-Performance WebAssembly JIT interpreter" @@ -34,18 +34,19 @@ serde_derive = "1.0.55" tempdir = "0.3.7" error-chain = "0.12.0" structopt = "0.2.11" -wabt = "0.6.0" +wabt = "0.7.1" wasmparser = "0.20.0" region = "0.3.0" memmap = "0.6.2" -spin = "0.4.10" +# spin = "0.4.10" log = "0.4.5" target-lexicon = { version = "0.0.3", default-features = false } -libc = "0.2" +# libc = "0.2" +libc = { git = "https://github.com/rust-lang/libc" } nix = "0.11" [build-dependencies] -wabt = "0.6.0" +wabt = "0.7.1" # [dev-dependencies] # libffi = "0.6.4" diff --git a/README.md b/README.md index ba9b63665..b80140ad7 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,6 @@ To build this project you will need Rust and Cargo. git clone https://github.com/wafoundation/wasmer.git cd wasmer -# Use rust nightly (we use 2018-10-07 as latest are failing) -rustup default nightly-2018-10-07 - # install tools # make sure that `python` is accessible. cargo install @@ -44,7 +41,7 @@ Thanks to [spectests](https://github.com/WAFoundation/wasmer/tree/master/spectes Tests can be run with: ```sh -cargo test +make test ``` If you need to re-generate the Rust tests from the spectests diff --git a/src/build_spectests.rs b/src/build_spectests.rs index d69126526..04e06f4e4 100644 --- a/src/build_spectests.rs +++ b/src/build_spectests.rs @@ -1,6 +1,8 @@ //! This file will run at build time to autogenerate Rust tests based on //! WebAssembly spec tests. It will convert the files indicated in TESTS //! from "/spectests/{MODULE}.wast" to "/src/spectests/{MODULE}.rs". +extern crate wabt; + use std::collections::HashMap; use std::env; use std::fs; @@ -215,7 +217,8 @@ fn test_module_{}() {{ fn visit_module(&mut self, module: &ModuleBinary, _name: &Option) { let wasm_binary: Vec = module.clone().into_vec(); let wast_string = wasm2wat(wasm_binary).expect("Can't convert back to wasm"); - self.flush_module_calls(self.last_module); + let last_module = self.last_module; + self.flush_module_calls(last_module); self.last_module = self.last_module + 1; // self.module_calls.insert(self.last_module, vec![]); self.buffer.push_str( @@ -255,6 +258,7 @@ fn test_module_{}() {{ fn visit_assert_invalid(&mut self, module: &ModuleBinary) { let wasm_binary: Vec = module.clone().into_vec(); // let wast_string = wasm2wat(wasm_binary).expect("Can't convert back to wasm"); + let command_name = self.command_name(); self.buffer.push_str( format!( "#[test] @@ -263,7 +267,7 @@ fn {}_assert_invalid() {{ let compilation = compile(wasm_binary.to_vec()); assert!(compilation.is_err(), \"WASM should not compile as is invalid\"); }}\n", - self.command_name(), + command_name, wasm_binary, // We do this to ident four spaces back // String::from_utf8_lossy(&wasm_binary), @@ -385,6 +389,7 @@ fn {}_assert_invalid() {{ fn visit_assert_malformed(&mut self, module: &ModuleBinary) { let wasm_binary: Vec = module.clone().into_vec(); + let command_name = self.command_name(); // let wast_string = wasm2wat(wasm_binary).expect("Can't convert back to wasm"); self.buffer.push_str( format!( @@ -394,7 +399,7 @@ fn {}_assert_malformed() {{ let compilation = compile(wasm_binary.to_vec()); assert!(compilation.is_err(), \"WASM should not compile as is malformed\"); }}\n", - self.command_name(), + command_name, wasm_binary, // We do this to ident four spaces back // String::from_utf8_lossy(&wasm_binary), diff --git a/src/main.rs b/src/main.rs index b711ec1f7..348787817 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,18 @@ -#![feature(test, libc, core_intrinsics)] - -extern crate test; #[macro_use] extern crate error_chain; +extern crate libc; extern crate cranelift_codegen; extern crate cranelift_entity; extern crate cranelift_native; extern crate cranelift_wasm; extern crate structopt; extern crate wabt; +extern crate wasmparser; +extern crate memmap; +extern crate region; #[macro_use] extern crate target_lexicon; extern crate nix; -extern crate spin; // use std::alloc::System; // use std::time::{Duration, Instant}; @@ -23,7 +23,6 @@ extern crate spin; #[macro_use] extern crate log; -// use libc; use std::fs::File; use std::io; use std::io::Read; diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index c89f62f08..de8cf8b27 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -52,7 +52,7 @@ fn get_function_addr( let func_pointer = if index < len { import_functions[index] } else { - (&functions[func_index.index() - len]).as_ptr() + (functions[index - len]).as_ptr() }; func_pointer } @@ -432,7 +432,7 @@ impl Instance { .info .start_func .or_else(|| match module.info.exports.get("main") { - Some(Export::Function(index)) => Some(index.to_owned()), + Some(Export::Function(index)) => Some(*index), _ => None, }); @@ -627,40 +627,56 @@ extern "C" fn current_memory(memory_index: u32, instance: &mut Instance) -> u32 // Because of this bug https://github.com/rust-lang/rust/issues/34123 // We create internal functions for it -use std::intrinsics::{ - ceilf32, ceilf64, floorf32, floorf64, nearbyintf32, nearbyintf64, truncf32, truncf64, -}; +// use std::intrinsics::{ +// ceilf32, ceilf64, floorf32, floorf64, nearbyintf32, nearbyintf64, truncf32, truncf64, +// }; // F32 -unsafe extern "C" fn _ceilf32(x: f32) -> f32 { - ceilf32(x) +#[inline] +extern "C" fn _ceilf32(x: f32) -> f32 { + // ceilf32(x) + x.ceil() } -unsafe extern "C" fn _floorf32(x: f32) -> f32 { - floorf32(x) +#[inline] +extern "C" fn _floorf32(x: f32) -> f32 { + // floorf32(x) + x.floor() } -unsafe extern "C" fn _truncf32(x: f32) -> f32 { - truncf32(x) +#[inline] +extern "C" fn _truncf32(x: f32) -> f32 { + // truncf32(x) + x.trunc() } -unsafe extern "C" fn _nearbyintf32(x: f32) -> f32 { - nearbyintf32(x) +#[inline] +extern "C" fn _nearbyintf32(x: f32) -> f32 { + // nearbyintf32(x) + x.round() } // F64 -unsafe extern "C" fn _ceilf64(x: f64) -> f64 { - ceilf64(x) +#[inline] +extern "C" fn _ceilf64(x: f64) -> f64 { + // ceilf64(x) + x.ceil() } -unsafe extern "C" fn _floorf64(x: f64) -> f64 { - floorf64(x) +#[inline] +extern "C" fn _floorf64(x: f64) -> f64 { + // floorf64(x) + x.floor() } -unsafe extern "C" fn _truncf64(x: f64) -> f64 { - truncf64(x) +#[inline] +extern "C" fn _truncf64(x: f64) -> f64 { + // truncf64(x) + x.trunc() } -unsafe extern "C" fn _nearbyintf64(x: f64) -> f64 { - nearbyintf64(x) +#[inline] +extern "C" fn _nearbyintf64(x: f64) -> f64 { + // nearbyintf64(x) + x.round() } From bb9c9f7d0a197a9b902ee23478064d8b6096e60f Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 13:30:44 -0800 Subject: [PATCH 27/29] Updated spectests based on latest wabt --- src/spectests/address.rs | 8 ++-- src/spectests/binary.rs | 4 +- src/spectests/block.rs | 2 +- src/spectests/br.rs | 2 +- src/spectests/br_if.rs | 2 +- src/spectests/br_table.rs | 2 +- src/spectests/call.rs | 2 +- src/spectests/call_indirect.rs | 2 +- src/spectests/data.rs | 82 +++++++++++++++++----------------- src/spectests/float_exprs.rs | 8 ++-- src/spectests/float_memory.rs | 12 ++--- src/spectests/func.rs | 2 +- src/spectests/func_ptrs.rs | 4 +- src/spectests/globals.rs | 2 +- src/spectests/if_.rs | 2 +- src/spectests/left_to_right.rs | 2 +- src/spectests/loop_.rs | 2 +- src/spectests/memory.rs | 6 +-- src/spectests/nop.rs | 2 +- src/spectests/return_.rs | 2 +- src/spectests/start.rs | 4 +- 21 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/spectests/address.rs b/src/spectests/address.rs index 7b25e5dc7..798ad4fb9 100644 --- a/src/spectests/address.rs +++ b/src/spectests/address.rs @@ -146,7 +146,7 @@ fn create_module_1() -> ResultObject { (export \"16u_bad\" (func 27)) (export \"16s_bad\" (func 28)) (export \"32_bad\" (func 29)) - (data (i32.const 0) \"abcdefghijklmnopqrstuvwxyz\")) + (data (;0;) (i32.const 0) \"abcdefghijklmnopqrstuvwxyz\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -1545,7 +1545,7 @@ fn create_module_2() -> ResultObject { (export \"32u_bad\" (func 39)) (export \"32s_bad\" (func 40)) (export \"64_bad\" (func 41)) - (data (i32.const 0) \"abcdefghijklmnopqrstuvwxyz\")) + (data (;0;) (i32.const 0) \"abcdefghijklmnopqrstuvwxyz\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -3260,7 +3260,7 @@ fn create_module_3() -> ResultObject { (export \"32_good4\" (func 3)) (export \"32_good5\" (func 4)) (export \"32_bad\" (func 5)) - (data (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\a0\\7f\\01\\00\\d0\\7f\")) + (data (;0;) (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\a0\\7f\\01\\00\\d0\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -3554,7 +3554,7 @@ fn create_module_4() -> ResultObject { (export \"64_good4\" (func 3)) (export \"64_good5\" (func 4)) (export \"64_bad\" (func 5)) - (data (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\f4\\7f\\01\\00\\00\\00\\00\\00\\fc\\7f\")) + (data (;0;) (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\f4\\7f\\01\\00\\00\\00\\00\\00\\fc\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/binary.rs b/src/spectests/binary.rs index e78a7bec5..319a4226d 100644 --- a/src/spectests/binary.rs +++ b/src/spectests/binary.rs @@ -519,7 +519,7 @@ fn test_module_14() { fn create_module_15() -> ResultObject { let module_str = "(module (memory (;0;) 0) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -540,7 +540,7 @@ fn test_module_15() { fn create_module_16() -> ResultObject { let module_str = "(module (table (;0;) 0 anyfunc) - (elem (i32.const 0))) + (elem (;0;) (i32.const 0))) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/block.rs b/src/spectests/block.rs index cee2539a4..907e4fce0 100644 --- a/src/spectests/block.rs +++ b/src/spectests/block.rs @@ -530,7 +530,7 @@ fn create_module_1() -> ResultObject { (export \"break-repeated\" (func 41)) (export \"break-inner\" (func 42)) (export \"effects\" (func 43)) - (elem (i32.const 0) 19)) + (elem (;0;) (i32.const 0) 19)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/br.rs b/src/spectests/br.rs index 766caed03..003168ecc 100644 --- a/src/spectests/br.rs +++ b/src/spectests/br.rs @@ -562,7 +562,7 @@ fn create_module_1() -> ResultObject { (export \"nested-br_if-value-cond\" (func 58)) (export \"nested-br_table-value\" (func 59)) (export \"nested-br_table-value-index\" (func 60)) - (elem (i32.const 0) 30)) + (elem (;0;) (i32.const 0) 30)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/br_if.rs b/src/spectests/br_if.rs index 367f22073..7db30a060 100644 --- a/src/spectests/br_if.rs +++ b/src/spectests/br_if.rs @@ -574,7 +574,7 @@ fn create_module_1() -> ResultObject { (export \"nested-br_if-value-cond\" (func 51)) (export \"nested-br_table-value\" (func 52)) (export \"nested-br_table-value-index\" (func 53)) - (elem (i32.const 0) 36)) + (elem (;0;) (i32.const 0) 36)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/br_table.rs b/src/spectests/br_table.rs index f8dfd602f..2360563e2 100644 --- a/src/spectests/br_table.rs +++ b/src/spectests/br_table.rs @@ -781,7 +781,7 @@ fn create_module_1() -> ResultObject { (export \"nested-br_table-value\" (func 66)) (export \"nested-br_table-value-index\" (func 67)) (export \"nested-br_table-loop-block\" (func 68)) - (elem (i32.const 0) 37)) + (elem (;0;) (i32.const 0) 37)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/call.rs b/src/spectests/call.rs index b84730c94..d972bfb19 100644 --- a/src/spectests/call.rs +++ b/src/spectests/call.rs @@ -316,7 +316,7 @@ fn create_module_1() -> ResultObject { (export \"as-tee_local-value\" (func 51)) (export \"as-set_global-value\" (func 52)) (export \"as-load-operand\" (func 53)) - (elem (i32.const 0) 40)) + (elem (;0;) (i32.const 0) 40)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/call_indirect.rs b/src/spectests/call_indirect.rs index 416e0e111..a73564c94 100644 --- a/src/spectests/call_indirect.rs +++ b/src/spectests/call_indirect.rs @@ -512,7 +512,7 @@ fn create_module_1() -> ResultObject { (export \"as-tee_local-value\" (func 63)) (export \"as-set_global-value\" (func 64)) (export \"as-load-operand\" (func 65)) - (elem (i32.const 0) 0 1 2 3 4 5 6 7 10 8 11 9 35 36 43 44 45 46 47 12 13 14 15 37 38 39 40 41 42)) + (elem (;0;) (i32.const 0) 0 1 2 3 4 5 6 7 10 8 11 9 35 36 43 44 45 46 47 12 13 14 15 37 38 39 40 41 42)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/data.rs b/src/spectests/data.rs index 07d5998fe..7e93ef9cb 100644 --- a/src/spectests/data.rs +++ b/src/spectests/data.rs @@ -19,18 +19,18 @@ use super::_common::{ fn create_module_1() -> ResultObject { let module_str = "(module (memory (;0;) 1) - (data (i32.const 0) \"\") - (data (i32.const 1) \"abcd\") - (data (i32.const 0) \"\") - (data (i32.const 0) \"abc\") - (data (i32.const 0) \"\") - (data (i32.const 1) \"abcd\") - (data (i32.const 0) \"\") - (data (i32.const 0) \"abc\") - (data (i32.const 0) \"\") - (data (i32.const 1) \"abcd\") - (data (i32.const 0) \"\") - (data (i32.const 0) \"abc\")) + (data (;0;) (i32.const 0) \"\") + (data (;1;) (i32.const 1) \"abcd\") + (data (;2;) (i32.const 0) \"\") + (data (;3;) (i32.const 0) \"abc\") + (data (;4;) (i32.const 0) \"\") + (data (;5;) (i32.const 1) \"abcd\") + (data (;6;) (i32.const 0) \"\") + (data (;7;) (i32.const 0) \"abc\") + (data (;8;) (i32.const 0) \"\") + (data (;9;) (i32.const 1) \"abcd\") + (data (;10;) (i32.const 0) \"\") + (data (;11;) (i32.const 0) \"abc\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -51,7 +51,7 @@ fn test_module_1() { fn create_module_2() -> ResultObject { let module_str = "(module (memory (;0;) 1) - (data (i32.const 0) \"a\")) + (data (;0;) (i32.const 0) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -72,7 +72,7 @@ fn test_module_2() { fn create_module_3() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 1)) - (data (i32.const 0) \"a\")) + (data (;0;) (i32.const 0) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -93,11 +93,11 @@ fn test_module_3() { fn create_module_4() -> ResultObject { let module_str = "(module (memory (;0;) 1) - (data (i32.const 0) \"a\") - (data (i32.const 3) \"b\") - (data (i32.const 100) \"cde\") - (data (i32.const 5) \"x\") - (data (i32.const 3) \"c\")) + (data (;0;) (i32.const 0) \"a\") + (data (;1;) (i32.const 3) \"b\") + (data (;2;) (i32.const 100) \"cde\") + (data (;3;) (i32.const 5) \"x\") + (data (;4;) (i32.const 3) \"c\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -118,12 +118,12 @@ fn test_module_4() { fn create_module_5() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 1)) - (data (i32.const 0) \"a\") - (data (i32.const 1) \"b\") - (data (i32.const 2) \"cde\") - (data (i32.const 3) \"f\") - (data (i32.const 2) \"g\") - (data (i32.const 1) \"h\")) + (data (;0;) (i32.const 0) \"a\") + (data (;1;) (i32.const 1) \"b\") + (data (;2;) (i32.const 2) \"cde\") + (data (;3;) (i32.const 3) \"f\") + (data (;4;) (i32.const 2) \"g\") + (data (;5;) (i32.const 1) \"h\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -144,8 +144,8 @@ fn test_module_5() { fn create_module_6() -> ResultObject { let module_str = "(module (memory (;0;) 1) - (data (i32.const 0) \"a\") - (data (i32.const 65535) \"b\")) + (data (;0;) (i32.const 0) \"a\") + (data (;1;) (i32.const 65535) \"b\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -166,8 +166,8 @@ fn test_module_6() { fn create_module_7() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 1)) - (data (i32.const 0) \"a\") - (data (i32.const 65535) \"b\")) + (data (;0;) (i32.const 0) \"a\") + (data (;1;) (i32.const 65535) \"b\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -188,7 +188,7 @@ fn test_module_7() { fn create_module_8() -> ResultObject { let module_str = "(module (memory (;0;) 2) - (data (i32.const 131071) \"a\")) + (data (;0;) (i32.const 131071) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -209,7 +209,7 @@ fn test_module_8() { fn create_module_9() -> ResultObject { let module_str = "(module (memory (;0;) 0) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -230,7 +230,7 @@ fn test_module_9() { fn create_module_10() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 0)) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -251,7 +251,7 @@ fn test_module_10() { fn create_module_11() -> ResultObject { let module_str = "(module (memory (;0;) 0 0) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -272,7 +272,7 @@ fn test_module_11() { fn create_module_12() -> ResultObject { let module_str = "(module (memory (;0;) 1) - (data (i32.const 65536) \"\")) + (data (;0;) (i32.const 65536) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -293,7 +293,7 @@ fn test_module_12() { fn create_module_13() -> ResultObject { let module_str = "(module (memory (;0;) 0) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -314,7 +314,7 @@ fn test_module_13() { fn create_module_14() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 0)) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -335,7 +335,7 @@ fn test_module_14() { fn create_module_15() -> ResultObject { let module_str = "(module (memory (;0;) 0 0) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -356,7 +356,7 @@ fn test_module_15() { fn create_module_16() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 0)) - (data (i32.const 0) \"a\")) + (data (;0;) (i32.const 0) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -377,7 +377,7 @@ fn test_module_16() { fn create_module_17() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 0 3)) - (data (i32.const 0) \"a\")) + (data (;0;) (i32.const 0) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -398,7 +398,7 @@ fn test_module_17() { fn create_module_18() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 0)) - (data (i32.const 1) \"a\")) + (data (;0;) (i32.const 1) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -419,7 +419,7 @@ fn test_module_18() { fn create_module_19() -> ResultObject { let module_str = "(module (import \"spectest\" \"memory\" (memory (;0;) 0 3)) - (data (i32.const 1) \"a\")) + (data (;0;) (i32.const 1) \"a\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/float_exprs.rs b/src/spectests/float_exprs.rs index c6fa817b2..54b4a5e65 100644 --- a/src/spectests/float_exprs.rs +++ b/src/spectests/float_exprs.rs @@ -9720,7 +9720,7 @@ fn create_module_60() -> ResultObject { (memory (;0;) 1 1) (export \"f32.simple_x4_sum\" (func 0)) (export \"f32.load\" (func 1)) - (data (i32.const 0) \"\\01\\00\\00\\00\\01\\00\\00\\80\\01\\00\\00\\00\\01\\00\\00\\80\\01\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\")) + (data (;0;) (i32.const 0) \"\\01\\00\\00\\00\\01\\00\\00\\80\\01\\00\\00\\00\\01\\00\\00\\80\\01\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -9859,7 +9859,7 @@ fn create_module_61() -> ResultObject { (memory (;0;) 1 1) (export \"f64.simple_x4_sum\" (func 0)) (export \"f64.load\" (func 1)) - (data (i32.const 0) \"\\01\\00\\00\\00\\00\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\80\\01\\00\\00\\00\\00\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\80\\01\\00\\00\\00\\00\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\")) + (data (;0;) (i32.const 0) \"\\01\\00\\00\\00\\00\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\80\\01\\00\\00\\00\\00\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\80\\01\\00\\00\\00\\00\\00\\00\\00\\01\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\\00\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -10001,7 +10001,7 @@ fn create_module_62() -> ResultObject { (memory (;0;) 1 1) (export \"f32.kahan_sum\" (func 0)) (export \"f32.plain_sum\" (func 1)) - (data (i32.const 0) \"\\c4\\c5W$\\a5\\84\\c8\\0bm\\b8K.\\f2v\\17\\1c\\caJV\\1e\\1bnq\\22]\\17\\1en\\bf\\cd\\14\\5c\\c7!UQ9\\9c\\1f\\b2Q\\f0\\a3\\93\\d7\\c1,\\ae~\\a8(:\\01!\\f4\\0aX\\93\\f8Bw\\9f\\839j_\\ba\\f7\\0a\\d8Qj4\\ca\\ad\\c64\\0e\\d8&\\dcL3\\1c\\ed)\\90\\a8x\\0f\\d1\\cev1#\\83\\b85\\e8\\f2D\\b0\\d3\\a1\\fc\\bb2\\e1\\b0\\baiD\\09\\d6\\d9}\\ff.\\c0Z6\\143\\14>\\a9\\fa\\87m\\8b\\bc\\ce\\9d\\a7\\fd\\c4\\e9\\85?\\dd\\d7\\e1\\18\\a6P&rn?s\\0f\\f8\\12\\93#4av\\12H\\c0\\9b\\05\\93\\eb\\ac\\86\\de\\94>U\\e8\\8c\\e8\\dd\\e4\\fc\\95G\\beV\\03! L\\e6\\bf{\\f6\\7f\\d5\\bas\\1c\\c1\\14\\8f\\c4'\\96\\b3\\bd3\\ffxA_\\c0Z\\ce\\f6gns\\9a\\17fp\\03\\f8\\ce'\\a3R\\b2\\9f;\\bf\\fb\\ae\\ed\\d3Z\\f87W\\f0\\f5n\\ef\\b1Mp=T\\a7\\01\\9a\\85\\08H\\91\\f5\\9d\\0c`\\87[\\d9T\\1eQm\\88\\8e\\08\\8c\\a5q:V\\08gF\\8f\\8f\\13*,\\ec,\\1f\\b4b+oA\\0a\\c4eB\\a21k,}>\\bbu\\ac\\86\\970\\d9H\\cd\\9a\\1fV\\c4\\c6\\e4\\12\\c0\\9d\\fb\\ee\\02\\8c\\ce\\1c\\f2\\1e\\a1x#\\db\\c4\\1eI\\03\\d3q\\cc\\08P\\c5\\d8\\5c\\ed\\d5\\b5e\\ac\\b5\\c9!\\d2\\c9)v\\de\\f00\\1a[<\\f2;\\db:9\\82:\\16\\08o\\a8\\f1\\beii\\99q\\a6\\05\\d3\\14\\93*\\16\\f2/\\11\\c7~ \\bb\\91D\\ee\\f8\\e4\\01S\\c0\\b9\\7f\\f0\\bf\\f0\\03\\9cm\\b1\\df\\a2D\\01mkq+\\5c\\b3!\\19F^\\8f\\db\\91\\d3|xk\\b7\\12\\00\\8f\\eb\\bd\\8a\\f5\\d4.\\c4\\c1\\1e\\dfscYGI\\03\\0a\\b7\\cf$\\cf\\9c\\0eDz\\9e\\14\\fbB\\bf\\9d90\\9e\\a0\\ab/\\d1\\ae\\9ej\\83C\\e3U}\\85\\bfc\\8a\\f8\\96\\10\\1f\\fem\\e7\\22\\1b\\e1iF\\8aD\\c8\\c8\\f9\\0c+\\19\\07\\a5\\02>\\f20\\10\\9a\\85\\8a_\\ef\\81E\\a0w\\b1\\03\\10sK\\ae\\98\\9dG\\bf\\9a-:\\d5\\0f\\03f\\e3=S\\d9@\\ce\\1fo2/!+#!lb\\d4\\a7>\\a8\\ce(1-\\00=g^\\af\\a0\\cf.\\d2\\b9k\\84\\ebi\\08\\ad\\bc\\0b\\c0A\\c4P\\b6\\e3P1\\e8\\ce\\e2\\96eU\\9c\\16F\\e6\\b0-:\\e8\\81\\05\\b0\\bf4\\f7\\bc\\10\\1c\\fb\\cc<\\f1\\85\\97B\\9f\\eb\\14\\8d<\\bf\\d7\\17\\88I\\9d\\8b+\\b2:\\83\\d1O\\04\\9e\\a1\\0f\\ad\\08\\9dT\\af\\d1\\82\\c3\\ec2/\\02\\8f\\05!-\\a2\\b7\\e4\\f4o.\\81+\\0b\\9c\\fc\\cb\\fet\\02\\f9\\db\\f4\\f3\\ea\\00\\a8\\ec\\d1\\99t&\\dd\\d64\\d5%\\b1F\\dd\\9c\\aaq\\f5`\\b0\\88\\c8\\e0\\0bYZ%O)f\\f9\\e3.\\fe\\e9\\da\\e5\\18O'b\\f4\\ce\\a4!\\95t\\c7Wd'\\9aL\\fdT}a\\ce\\c3\\ac\\87F\\9c\\fa\\ff\\09\\cay\\97g$t\\ca\\d4!\\83&%\\19\\127d\\19\\e5e\\e0tu\\8e\\dd\\c8\\eft\\c7\\d8!+y\\04QFe`\\03]\\fa\\d8\\f4e\\a4\\9e]#\\da\\d7\\8a\\92\\80\\a4\\dex<\\f1WBm\\cd\\c9/\\d5\\a4\\9e\\ab@\\f4\\cb\\1b\\d7\\a3\\ca\\fc\\eb\\a7\\01\\b2\\9aiNF\\9b\\18N\\ddy\\a7\\aa\\a6R9\\1e\\ef0\\cc\\9b\\bd[\\eeL!m0\\00r\\b0F_\\08\\cf\\c5\\b9\\e0>\\c2\\b3\\0c\\dc\\8ed\\de\\19By\\cfC\\eaC]\\8e\\88\\f7\\ab\\15\\dc?\\c8g \\db\\b8d\\b1G\\1f\\de\\f2\\cb?Y\\9f\\d8F\\90\\dc\\ae/\\22\\f9\\e21\\89\\d9\\9c\\1cL\\d3\\a9JW\\84\\9c\\9f\\ea,<\\ae<\\c3\\1e\\8b\\e5N\\17\\01%\\db4F_\\15\\ea\\05\\0c|\\d9E\\8c\\19\\d0s\\8a\\96\\16\\ddD\\f9\\05\\b7[q\\b0\\e6!6_u\\89\\91su\\ab}\\ae\\d3s\\ec7\\c6\\eaUu\\ef\\ea\\ab\\8b{\\11\\dcm\\1a\\b2j\\c4%\\cf\\aa\\e3\\9fII\\89\\cb7\\9b\\0a\\a7\\01`p\\dc\\b7\\c8\\83\\e1B\\f5\\be\\adb\\94\\ad\\8d\\a1\")) + (data (;0;) (i32.const 0) \"\\c4\\c5W$\\a5\\84\\c8\\0bm\\b8K.\\f2v\\17\\1c\\caJV\\1e\\1bnq\\22]\\17\\1en\\bf\\cd\\14\\5c\\c7!UQ9\\9c\\1f\\b2Q\\f0\\a3\\93\\d7\\c1,\\ae~\\a8(:\\01!\\f4\\0aX\\93\\f8Bw\\9f\\839j_\\ba\\f7\\0a\\d8Qj4\\ca\\ad\\c64\\0e\\d8&\\dcL3\\1c\\ed)\\90\\a8x\\0f\\d1\\cev1#\\83\\b85\\e8\\f2D\\b0\\d3\\a1\\fc\\bb2\\e1\\b0\\baiD\\09\\d6\\d9}\\ff.\\c0Z6\\143\\14>\\a9\\fa\\87m\\8b\\bc\\ce\\9d\\a7\\fd\\c4\\e9\\85?\\dd\\d7\\e1\\18\\a6P&rn?s\\0f\\f8\\12\\93#4av\\12H\\c0\\9b\\05\\93\\eb\\ac\\86\\de\\94>U\\e8\\8c\\e8\\dd\\e4\\fc\\95G\\beV\\03! L\\e6\\bf{\\f6\\7f\\d5\\bas\\1c\\c1\\14\\8f\\c4'\\96\\b3\\bd3\\ffxA_\\c0Z\\ce\\f6gns\\9a\\17fp\\03\\f8\\ce'\\a3R\\b2\\9f;\\bf\\fb\\ae\\ed\\d3Z\\f87W\\f0\\f5n\\ef\\b1Mp=T\\a7\\01\\9a\\85\\08H\\91\\f5\\9d\\0c`\\87[\\d9T\\1eQm\\88\\8e\\08\\8c\\a5q:V\\08gF\\8f\\8f\\13*,\\ec,\\1f\\b4b+oA\\0a\\c4eB\\a21k,}>\\bbu\\ac\\86\\970\\d9H\\cd\\9a\\1fV\\c4\\c6\\e4\\12\\c0\\9d\\fb\\ee\\02\\8c\\ce\\1c\\f2\\1e\\a1x#\\db\\c4\\1eI\\03\\d3q\\cc\\08P\\c5\\d8\\5c\\ed\\d5\\b5e\\ac\\b5\\c9!\\d2\\c9)v\\de\\f00\\1a[<\\f2;\\db:9\\82:\\16\\08o\\a8\\f1\\beii\\99q\\a6\\05\\d3\\14\\93*\\16\\f2/\\11\\c7~ \\bb\\91D\\ee\\f8\\e4\\01S\\c0\\b9\\7f\\f0\\bf\\f0\\03\\9cm\\b1\\df\\a2D\\01mkq+\\5c\\b3!\\19F^\\8f\\db\\91\\d3|xk\\b7\\12\\00\\8f\\eb\\bd\\8a\\f5\\d4.\\c4\\c1\\1e\\dfscYGI\\03\\0a\\b7\\cf$\\cf\\9c\\0eDz\\9e\\14\\fbB\\bf\\9d90\\9e\\a0\\ab/\\d1\\ae\\9ej\\83C\\e3U}\\85\\bfc\\8a\\f8\\96\\10\\1f\\fem\\e7\\22\\1b\\e1iF\\8aD\\c8\\c8\\f9\\0c+\\19\\07\\a5\\02>\\f20\\10\\9a\\85\\8a_\\ef\\81E\\a0w\\b1\\03\\10sK\\ae\\98\\9dG\\bf\\9a-:\\d5\\0f\\03f\\e3=S\\d9@\\ce\\1fo2/!+#!lb\\d4\\a7>\\a8\\ce(1-\\00=g^\\af\\a0\\cf.\\d2\\b9k\\84\\ebi\\08\\ad\\bc\\0b\\c0A\\c4P\\b6\\e3P1\\e8\\ce\\e2\\96eU\\9c\\16F\\e6\\b0-:\\e8\\81\\05\\b0\\bf4\\f7\\bc\\10\\1c\\fb\\cc<\\f1\\85\\97B\\9f\\eb\\14\\8d<\\bf\\d7\\17\\88I\\9d\\8b+\\b2:\\83\\d1O\\04\\9e\\a1\\0f\\ad\\08\\9dT\\af\\d1\\82\\c3\\ec2/\\02\\8f\\05!-\\a2\\b7\\e4\\f4o.\\81+\\0b\\9c\\fc\\cb\\fet\\02\\f9\\db\\f4\\f3\\ea\\00\\a8\\ec\\d1\\99t&\\dd\\d64\\d5%\\b1F\\dd\\9c\\aaq\\f5`\\b0\\88\\c8\\e0\\0bYZ%O)f\\f9\\e3.\\fe\\e9\\da\\e5\\18O'b\\f4\\ce\\a4!\\95t\\c7Wd'\\9aL\\fdT}a\\ce\\c3\\ac\\87F\\9c\\fa\\ff\\09\\cay\\97g$t\\ca\\d4!\\83&%\\19\\127d\\19\\e5e\\e0tu\\8e\\dd\\c8\\eft\\c7\\d8!+y\\04QFe`\\03]\\fa\\d8\\f4e\\a4\\9e]#\\da\\d7\\8a\\92\\80\\a4\\dex<\\f1WBm\\cd\\c9/\\d5\\a4\\9e\\ab@\\f4\\cb\\1b\\d7\\a3\\ca\\fc\\eb\\a7\\01\\b2\\9aiNF\\9b\\18N\\ddy\\a7\\aa\\a6R9\\1e\\ef0\\cc\\9b\\bd[\\eeL!m0\\00r\\b0F_\\08\\cf\\c5\\b9\\e0>\\c2\\b3\\0c\\dc\\8ed\\de\\19By\\cfC\\eaC]\\8e\\88\\f7\\ab\\15\\dc?\\c8g \\db\\b8d\\b1G\\1f\\de\\f2\\cb?Y\\9f\\d8F\\90\\dc\\ae/\\22\\f9\\e21\\89\\d9\\9c\\1cL\\d3\\a9JW\\84\\9c\\9f\\ea,<\\ae<\\c3\\1e\\8b\\e5N\\17\\01%\\db4F_\\15\\ea\\05\\0c|\\d9E\\8c\\19\\d0s\\8a\\96\\16\\ddD\\f9\\05\\b7[q\\b0\\e6!6_u\\89\\91su\\ab}\\ae\\d3s\\ec7\\c6\\eaUu\\ef\\ea\\ab\\8b{\\11\\dcm\\1a\\b2j\\c4%\\cf\\aa\\e3\\9fII\\89\\cb7\\9b\\0a\\a7\\01`p\\dc\\b7\\c8\\83\\e1B\\f5\\be\\adb\\94\\ad\\8d\\a1\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -10104,7 +10104,7 @@ fn create_module_63() -> ResultObject { (memory (;0;) 1 1) (export \"f64.kahan_sum\" (func 0)) (export \"f64.plain_sum\" (func 1)) - (data (i32.const 0) \"\\13\\05\\84B]\\a2,\\c6C\\dbU\\a9\\cd\\daU\\e3s\\fcX\\d6\\ba\\d5\\00\\fd\\835B\\88\\8b\\13]8JG\\0drs\\a1\\1a\\ef\\c4E\\17W\\d8\\c9F\\e0\\8dl\\e17p\\c8\\83[U^Z-s\\1eV\\c8\\e1mi\\14x\\0a\\8aZd:\\09\\c7\\a8\\87\\c5\\f0\\d3]\\e6\\03\\fc\\93\\be&\\ca\\d6\\a9\\91`\\bd\\b0\\ed\\ae\\f70~\\92:o\\a7Y\\8e\\aa}\\bfgX*T\\f8N\\fe\\ed5X\\a6Q\\bfB\\e5Kf'$m\\7fB-(\\92\\18\\ec\\08\\ae\\e7U\\da\\b1\\a6e\\a5rPG\\1b\\b8\\a9T\\d7\\a6\\06[\\0fBX\\83\\8a\\17\\82\\c6\\10C\\a0\\c0.m\\bcZ\\85Sr\\7f\\adD\\bc0I\\f2~H\\f4\\a2q\\d0\\13\\8e\\b3\\de\\99R\\e3Et\\eav\\0e\\1b*\\c8\\ee\\14\\01\\c4P[6<\\ef\\bar\\a2\\a6\\08\\f8{6\\9d\\f9\\ef\\0b\\c7V-\\5c\\f0\\9d]\\de\\fc\\b8\\ad\\0fd\\0e\\97\\152&\\c21\\e6\\05\\1e\\ef\\cb\\17\\1bm\\15\\0bt]\\d3.\\f8k\\86\\b4\\basRS\\99\\a9v E\\c9@\\80k\\14\\ed\\a1\\fa\\80F\\e6&\\d2\\e6\\98\\c4W\\bf\\c4\\1c\\a4\\90z6\\94\\14\\ba\\15\\89n\\e6\\9c7\\8c\\f4\\de\\12\\22]\\a1yPg\\0d=z\\e9\\d4\\aa.\\7f*z0=\\ea]\\12H\\fe\\e1\\18\\cd\\a4W\\a2\\87>\\b6\\9a\\8b\\db\\da\\9dx\\9c\\cf\\8d\\b1O\\90\\b44\\e0\\9d\\f6\\ca\\feL;xm\\0a\\5c\\18\\9fa\\b9\\dd\\b4\\e0\\0fv\\e0\\1bi\\0d^Xsp^\\0e-\\a1}\\ff \\eb\\914\\92\\ac8r*\\1f\\8eq.j\\f1\\af\\c7'p\\d9\\c4W\\f7\\d2<\\1d\\b8\\f0\\f0d\\cf\\dc\\ae\\be\\a3\\cc>\\22}Ni!c\\17\\ed\\03\\02T\\9a\\0fPN\\13Z5\\a1\\22\\a4\\df\\86\\c2ty\\16\\b8ii\\a0R]\\11d\\bd[\\93\\fci\\a0\\f4\\13\\d0\\81Q\\dd\\fa\\0c\\15\\c3z\\c9bz\\a9\\1d\\c9\\e6Z\\b3[\\97\\02\\d0\\c4\\8d4\\19P!\\0a\\bcP\\da<0\\d6:1\\94\\8d:\\fe\\ef\\14W\\9dK\\93\\00\\96$\\0co\\fd\\bc#v\\02l\\ebRr\\80\\11~\\80:\\13\\128\\1d8I\\95@'\\8aD{\\e8\\dcm\\8c\\8c\\8e<\\b5\\b3\\18\\0e\\f6\\08\\1a\\84A5\\ff\\8b\\b8\\93@\\ea\\e1Q\\1d\\89\\a5\\8dBh)\\ea/\\c1zR\\eb\\90]M\\d6\\80\\e3\\d7uH\\ce\\ed\\d3\\01\\1c\\8d[\\a5\\94\\0dx\\cf\\f1\\06\\13/\\98\\02\\a4m.l\\f2\\d5t)\\89L\\f9\\03\\f5\\c7\\18\\adz\\f0h\\f8\\5c\\d6Y\\87n\\d6?\\06\\be\\86 \\e3A\\91\\22\\f3n\\8b\\f0h\\1cW\\a7\\fc\\b0|\\9e\\99\\0b\\96\\1a\\89_\\e6\\0d|\\08Q\\a0\\a2g\\9aG\\00\\93k\\f9(\\f0h\\dbb\\f1\\e0e,S3\\e0\\a7\\ca\\11B0\\f6\\af\\01\\c1e=2\\01o\\ab.\\be\\d3\\8b\\be\\14\\c3\\ff\\ec\\fb\\f0\\f9\\c5\\0c\\05o\\01\\09k\\e341\\0c\\1ff\\a6B\\bc\\1a\\87I\\16\\16\\8c\\b0\\90\\0d4\\8c\\0a\\e1\\09^\\10\\a4kV\\cc\\f0\\c9\\bb\\dc\\b8\\5c\\ce\\f6\\cc\\8du~\\b3\\07\\88\\04/\\b4^\\c9\\e3J#s\\19bl\\9a\\03vD\\86\\9c`\\fc\\dbr\\8f'\\a0\\dd\\b3\\c5\\da\\ff\\f9\\ecj\\b1{\\d3\\cfP7\\c9zx\\0c\\e4:\\b6\\f5\\e6\\f4\\98nB}5s\\8bE\\c0V\\97\\cdm\\ce\\cf\\ad1\\b3\\c3T\\fa\\ef\\d5\\c0\\f4j_T\\e7I>3\\0a08\\fd\\d9\\05\\ff\\a5?WF\\14\\b5\\91\\17\\cak\\98#ze\\b3l\\02\\b4\\ccy]X\\d8\\b3\\d5\\94\\ae\\f4mue\\f7\\92\\bf~GL<\\ee\\db\\ac\\f12]\\fboA\\1c4\\c8\\83O\\c2X\\01\\be\\05>f\\16\\a6\\04m]O\\86\\09'\\82%\\12\\cd:\\cd\\cek\\bc\\ca\\ac(\\9b\\eej%\\86\\9eEp\\c6\\d2\\bd;}B\\e5'\\af\\c7\\1d\\f4\\81\\c8\\b3v\\8a\\a86\\a3\\ae*\\e6\\18\\e16\\22\\ad\\f6%r\\b09\\8b\\01\\9a\\22{\\84\\c3-_r\\a4\\98\\ac\\15p\\e7\\d4\\18\\e2}\\d20|3\\08\\cd\\ca\\c4\\22\\85\\88u\\81\\c6JtX\\8d\\e0\\e8\\ac\\c5\\abuZ\\f4(\\12\\f0\\18ER\\f2\\97\\b2\\93Ao\\8d\\7f\\dbp\\fb\\a3]\\1f\\a7\\8d\\98 +\\22\\9f:\\01\\b5\\8b\\1b\\d2\\cb\\14\\03\\0e\\14\\14\\d2\\19Z\\1f\\ce^\\cd\\81y\\15\\01\\ca\\dest\\8cV \\9fw-%\\16\\f6aQ\\1d\\a4\\8e\\9b\\98\\a5\\c6\\ec\\a8EW\\82Yx\\0d\\90\\b4\\dfQ\\b0\\c3\\82\\94\\cc\\b3S\\09\\15m\\96l:@G\\b7Jz\\05/\\a1\\1e\\8c\\9d\\a0 \\88\\fbR\\b7\\9f\\f3\\f3\\bb_\\e7\\8aa\\a7!\\b1\\ac\\fa\\09\\aa\\a4l\\bc$\\80\\ba*\\e9e\\ffp\\ff\\cc\\fae\\87v\\f3\\c5\\15\\ce\\cb\\e8B1\\00\\0c\\91W\\d9\\e0\\9d5T$\\ad\\a4\\d8\\f9\\08gc\\c8\\cf\\81\\dd\\90\\a2\\d7\\c4\\07J\\e6\\10og\\e7'\\d4#Y\\18\\f2\\a8\\9d_\\d8\\940\\aaT\\86O\\87\\9d\\82\\b5&\\ca\\a6\\96\\bf\\cfU\\f9\\9d7\\01\\19HC\\c5\\94l\\f3t\\97XL<\\9d\\08\\e8\\04\\c2X0v\\e1\\a0\\f8\\ea\\e9\\c5\\ae\\cfx\\9e\\a9\\0c\\ac\\b3DB\\e0\\bc]\\1b\\9cIXJ\\1c\\19I\\c1:\\ea\\f5\\eb;\\81\\a9Kp\\0c\\cc\\9e\\1a\\d3/\\b7R/ ;\\ebdQ\\1d\\a0-\\b2>\\be\\13\\85H\\922.\\db\\5c\\a1\\e7\\8cE\\915\\01\\0a\\93\\c2\\eb\\09\\ce\\f3\\d2\\22$\\d0\\8c\\cc\\1d\\9d8\\c8M\\e3\\82\\ccd\\15\\06-\\e7\\01/\\ab\\bb\\b5\\04L\\92\\1cz\\d6?\\e8_1\\15\\0c\\dc\\e41\\b4\\c4%>*\\aa\\00\\9e\\c8\\e5!z\\7f)\\f1\\c0\\af\\1d^\\e8c9\\ad\\f8~l\\c8\\c5\\7f\\c2\\a8\\97'\\0a\\d9\\f4!j\\ea\\03\\09\\fb\\f7\\96;\\83y_|K0\\9fV5\\de\\b4s\\d4\\95\\f0\\14\\c3t/\\0d\\a3\\1dN\\8d1$\\b3\\1a\\84\\85bZ{<\\149\\17\\e6m\\eb7\\c2\\00X[\\0b\\e3<\\8ab\\e1\\f85KV\\e2\\87`\\8b\\be\\a78\\91wT\\a9Z$%\\90\\9f\\a5Bw\\f3\\5c9\\df\\fft\\07v\\a1\\cd\\1fb\\0b\\81\\81h\\af\\05\\c1\\c0\\7f&\\ee\\c0\\91\\a3j})aE'\\e5W\\88\\dc\\0d\\97\\04\\1a3\\a9D\\8a\\da\\02\\10E?\\8eU\\a6v\\8cM\\e3\\f1\\89\\83\\c8\\d0\\f8\\9bPw\\9fG\\dfL\\9cf\\0d\\aa\\18\\b8_O\\c4\\01\\ce\\dc\\84\\acF\\9ei\\e1vEka\\89\\e4]\\94\\bb\\11\\83\\9fx\\d8\\0a\\d2\\f5~]C\\ea\\bc\\10\\f1:\\c9\\e2d\\fbSe\\d0\\c7\\b4\\a7\\fb\\d4\\05S%\\d0\\cd)\\88\\00V%$}]\\b4\\f3A\\9f\\e9\\b5\\f7\\aed,\\e3\\c9m\\d5\\84:r\\12\\b8z\\d9\\1b\\09\\e88\\da&O\\04\\ce\\03qn\\8aD{\\5c\\81Y\\9c\\d2\\e4\\c3\\baY\\a6\\e5(\\a7\\8f\\9a\\e4\\d5N\\b9\\ca\\7f\\cbu\\b8+C>\\b3\\15F\\b1\\a5\\bc\\9d\\9e8\\15\\f1\\bd\\1b!\\aa\\f1\\82\\00\\95\\fc\\a7wG9\\a73C\\92\\d7R@K\\06\\81\\8a\\a0\\bd\\f1k\\99\\84B[\\e2;\\c5^\\12\\5c(M\\b6\\0eN\\c8\\5c\\e8\\01\\8a\\c5\\e7\\e4\\9dB\\ee]\\9c\\c4\\eb\\ebh\\09'\\92\\95\\9a\\11Ts\\c4\\12\\80\\fb}\\fe\\c5\\08`\\7f6A\\e0\\10\\ba\\d6+l\\f1\\b4\\17\\fe&4\\e3K\\f8\\a8\\e3\\91\\beO*\\fc\\da\\81\\b8\\e7\\fe\\d5&PG\\f3\\1ae2\\81\\e0\\05\\b8O21&\\00JS\\97\\c2\\c3\\0e.\\a1&T\\ab\\05\\8eV/}\\af\\22\\84h\\a5\\8b\\97\\f6\\a4\\fd\\a8\\ccuA\\96\\86\\fd'=)\\86\\8d\\7fL\\d4\\8esA\\f4\\1e\\e2\\ddX'\\97\\ce\\9c\\94\\cfz\\04/\\dc\\ed\")) + (data (;0;) (i32.const 0) \"\\13\\05\\84B]\\a2,\\c6C\\dbU\\a9\\cd\\daU\\e3s\\fcX\\d6\\ba\\d5\\00\\fd\\835B\\88\\8b\\13]8JG\\0drs\\a1\\1a\\ef\\c4E\\17W\\d8\\c9F\\e0\\8dl\\e17p\\c8\\83[U^Z-s\\1eV\\c8\\e1mi\\14x\\0a\\8aZd:\\09\\c7\\a8\\87\\c5\\f0\\d3]\\e6\\03\\fc\\93\\be&\\ca\\d6\\a9\\91`\\bd\\b0\\ed\\ae\\f70~\\92:o\\a7Y\\8e\\aa}\\bfgX*T\\f8N\\fe\\ed5X\\a6Q\\bfB\\e5Kf'$m\\7fB-(\\92\\18\\ec\\08\\ae\\e7U\\da\\b1\\a6e\\a5rPG\\1b\\b8\\a9T\\d7\\a6\\06[\\0fBX\\83\\8a\\17\\82\\c6\\10C\\a0\\c0.m\\bcZ\\85Sr\\7f\\adD\\bc0I\\f2~H\\f4\\a2q\\d0\\13\\8e\\b3\\de\\99R\\e3Et\\eav\\0e\\1b*\\c8\\ee\\14\\01\\c4P[6<\\ef\\bar\\a2\\a6\\08\\f8{6\\9d\\f9\\ef\\0b\\c7V-\\5c\\f0\\9d]\\de\\fc\\b8\\ad\\0fd\\0e\\97\\152&\\c21\\e6\\05\\1e\\ef\\cb\\17\\1bm\\15\\0bt]\\d3.\\f8k\\86\\b4\\basRS\\99\\a9v E\\c9@\\80k\\14\\ed\\a1\\fa\\80F\\e6&\\d2\\e6\\98\\c4W\\bf\\c4\\1c\\a4\\90z6\\94\\14\\ba\\15\\89n\\e6\\9c7\\8c\\f4\\de\\12\\22]\\a1yPg\\0d=z\\e9\\d4\\aa.\\7f*z0=\\ea]\\12H\\fe\\e1\\18\\cd\\a4W\\a2\\87>\\b6\\9a\\8b\\db\\da\\9dx\\9c\\cf\\8d\\b1O\\90\\b44\\e0\\9d\\f6\\ca\\feL;xm\\0a\\5c\\18\\9fa\\b9\\dd\\b4\\e0\\0fv\\e0\\1bi\\0d^Xsp^\\0e-\\a1}\\ff \\eb\\914\\92\\ac8r*\\1f\\8eq.j\\f1\\af\\c7'p\\d9\\c4W\\f7\\d2<\\1d\\b8\\f0\\f0d\\cf\\dc\\ae\\be\\a3\\cc>\\22}Ni!c\\17\\ed\\03\\02T\\9a\\0fPN\\13Z5\\a1\\22\\a4\\df\\86\\c2ty\\16\\b8ii\\a0R]\\11d\\bd[\\93\\fci\\a0\\f4\\13\\d0\\81Q\\dd\\fa\\0c\\15\\c3z\\c9bz\\a9\\1d\\c9\\e6Z\\b3[\\97\\02\\d0\\c4\\8d4\\19P!\\0a\\bcP\\da<0\\d6:1\\94\\8d:\\fe\\ef\\14W\\9dK\\93\\00\\96$\\0co\\fd\\bc#v\\02l\\ebRr\\80\\11~\\80:\\13\\128\\1d8I\\95@'\\8aD{\\e8\\dcm\\8c\\8c\\8e<\\b5\\b3\\18\\0e\\f6\\08\\1a\\84A5\\ff\\8b\\b8\\93@\\ea\\e1Q\\1d\\89\\a5\\8dBh)\\ea/\\c1zR\\eb\\90]M\\d6\\80\\e3\\d7uH\\ce\\ed\\d3\\01\\1c\\8d[\\a5\\94\\0dx\\cf\\f1\\06\\13/\\98\\02\\a4m.l\\f2\\d5t)\\89L\\f9\\03\\f5\\c7\\18\\adz\\f0h\\f8\\5c\\d6Y\\87n\\d6?\\06\\be\\86 \\e3A\\91\\22\\f3n\\8b\\f0h\\1cW\\a7\\fc\\b0|\\9e\\99\\0b\\96\\1a\\89_\\e6\\0d|\\08Q\\a0\\a2g\\9aG\\00\\93k\\f9(\\f0h\\dbb\\f1\\e0e,S3\\e0\\a7\\ca\\11B0\\f6\\af\\01\\c1e=2\\01o\\ab.\\be\\d3\\8b\\be\\14\\c3\\ff\\ec\\fb\\f0\\f9\\c5\\0c\\05o\\01\\09k\\e341\\0c\\1ff\\a6B\\bc\\1a\\87I\\16\\16\\8c\\b0\\90\\0d4\\8c\\0a\\e1\\09^\\10\\a4kV\\cc\\f0\\c9\\bb\\dc\\b8\\5c\\ce\\f6\\cc\\8du~\\b3\\07\\88\\04/\\b4^\\c9\\e3J#s\\19bl\\9a\\03vD\\86\\9c`\\fc\\dbr\\8f'\\a0\\dd\\b3\\c5\\da\\ff\\f9\\ecj\\b1{\\d3\\cfP7\\c9zx\\0c\\e4:\\b6\\f5\\e6\\f4\\98nB}5s\\8bE\\c0V\\97\\cdm\\ce\\cf\\ad1\\b3\\c3T\\fa\\ef\\d5\\c0\\f4j_T\\e7I>3\\0a08\\fd\\d9\\05\\ff\\a5?WF\\14\\b5\\91\\17\\cak\\98#ze\\b3l\\02\\b4\\ccy]X\\d8\\b3\\d5\\94\\ae\\f4mue\\f7\\92\\bf~GL<\\ee\\db\\ac\\f12]\\fboA\\1c4\\c8\\83O\\c2X\\01\\be\\05>f\\16\\a6\\04m]O\\86\\09'\\82%\\12\\cd:\\cd\\cek\\bc\\ca\\ac(\\9b\\eej%\\86\\9eEp\\c6\\d2\\bd;}B\\e5'\\af\\c7\\1d\\f4\\81\\c8\\b3v\\8a\\a86\\a3\\ae*\\e6\\18\\e16\\22\\ad\\f6%r\\b09\\8b\\01\\9a\\22{\\84\\c3-_r\\a4\\98\\ac\\15p\\e7\\d4\\18\\e2}\\d20|3\\08\\cd\\ca\\c4\\22\\85\\88u\\81\\c6JtX\\8d\\e0\\e8\\ac\\c5\\abuZ\\f4(\\12\\f0\\18ER\\f2\\97\\b2\\93Ao\\8d\\7f\\dbp\\fb\\a3]\\1f\\a7\\8d\\98 +\\22\\9f:\\01\\b5\\8b\\1b\\d2\\cb\\14\\03\\0e\\14\\14\\d2\\19Z\\1f\\ce^\\cd\\81y\\15\\01\\ca\\dest\\8cV \\9fw-%\\16\\f6aQ\\1d\\a4\\8e\\9b\\98\\a5\\c6\\ec\\a8EW\\82Yx\\0d\\90\\b4\\dfQ\\b0\\c3\\82\\94\\cc\\b3S\\09\\15m\\96l:@G\\b7Jz\\05/\\a1\\1e\\8c\\9d\\a0 \\88\\fbR\\b7\\9f\\f3\\f3\\bb_\\e7\\8aa\\a7!\\b1\\ac\\fa\\09\\aa\\a4l\\bc$\\80\\ba*\\e9e\\ffp\\ff\\cc\\fae\\87v\\f3\\c5\\15\\ce\\cb\\e8B1\\00\\0c\\91W\\d9\\e0\\9d5T$\\ad\\a4\\d8\\f9\\08gc\\c8\\cf\\81\\dd\\90\\a2\\d7\\c4\\07J\\e6\\10og\\e7'\\d4#Y\\18\\f2\\a8\\9d_\\d8\\940\\aaT\\86O\\87\\9d\\82\\b5&\\ca\\a6\\96\\bf\\cfU\\f9\\9d7\\01\\19HC\\c5\\94l\\f3t\\97XL<\\9d\\08\\e8\\04\\c2X0v\\e1\\a0\\f8\\ea\\e9\\c5\\ae\\cfx\\9e\\a9\\0c\\ac\\b3DB\\e0\\bc]\\1b\\9cIXJ\\1c\\19I\\c1:\\ea\\f5\\eb;\\81\\a9Kp\\0c\\cc\\9e\\1a\\d3/\\b7R/ ;\\ebdQ\\1d\\a0-\\b2>\\be\\13\\85H\\922.\\db\\5c\\a1\\e7\\8cE\\915\\01\\0a\\93\\c2\\eb\\09\\ce\\f3\\d2\\22$\\d0\\8c\\cc\\1d\\9d8\\c8M\\e3\\82\\ccd\\15\\06-\\e7\\01/\\ab\\bb\\b5\\04L\\92\\1cz\\d6?\\e8_1\\15\\0c\\dc\\e41\\b4\\c4%>*\\aa\\00\\9e\\c8\\e5!z\\7f)\\f1\\c0\\af\\1d^\\e8c9\\ad\\f8~l\\c8\\c5\\7f\\c2\\a8\\97'\\0a\\d9\\f4!j\\ea\\03\\09\\fb\\f7\\96;\\83y_|K0\\9fV5\\de\\b4s\\d4\\95\\f0\\14\\c3t/\\0d\\a3\\1dN\\8d1$\\b3\\1a\\84\\85bZ{<\\149\\17\\e6m\\eb7\\c2\\00X[\\0b\\e3<\\8ab\\e1\\f85KV\\e2\\87`\\8b\\be\\a78\\91wT\\a9Z$%\\90\\9f\\a5Bw\\f3\\5c9\\df\\fft\\07v\\a1\\cd\\1fb\\0b\\81\\81h\\af\\05\\c1\\c0\\7f&\\ee\\c0\\91\\a3j})aE'\\e5W\\88\\dc\\0d\\97\\04\\1a3\\a9D\\8a\\da\\02\\10E?\\8eU\\a6v\\8cM\\e3\\f1\\89\\83\\c8\\d0\\f8\\9bPw\\9fG\\dfL\\9cf\\0d\\aa\\18\\b8_O\\c4\\01\\ce\\dc\\84\\acF\\9ei\\e1vEka\\89\\e4]\\94\\bb\\11\\83\\9fx\\d8\\0a\\d2\\f5~]C\\ea\\bc\\10\\f1:\\c9\\e2d\\fbSe\\d0\\c7\\b4\\a7\\fb\\d4\\05S%\\d0\\cd)\\88\\00V%$}]\\b4\\f3A\\9f\\e9\\b5\\f7\\aed,\\e3\\c9m\\d5\\84:r\\12\\b8z\\d9\\1b\\09\\e88\\da&O\\04\\ce\\03qn\\8aD{\\5c\\81Y\\9c\\d2\\e4\\c3\\baY\\a6\\e5(\\a7\\8f\\9a\\e4\\d5N\\b9\\ca\\7f\\cbu\\b8+C>\\b3\\15F\\b1\\a5\\bc\\9d\\9e8\\15\\f1\\bd\\1b!\\aa\\f1\\82\\00\\95\\fc\\a7wG9\\a73C\\92\\d7R@K\\06\\81\\8a\\a0\\bd\\f1k\\99\\84B[\\e2;\\c5^\\12\\5c(M\\b6\\0eN\\c8\\5c\\e8\\01\\8a\\c5\\e7\\e4\\9dB\\ee]\\9c\\c4\\eb\\ebh\\09'\\92\\95\\9a\\11Ts\\c4\\12\\80\\fb}\\fe\\c5\\08`\\7f6A\\e0\\10\\ba\\d6+l\\f1\\b4\\17\\fe&4\\e3K\\f8\\a8\\e3\\91\\beO*\\fc\\da\\81\\b8\\e7\\fe\\d5&PG\\f3\\1ae2\\81\\e0\\05\\b8O21&\\00JS\\97\\c2\\c3\\0e.\\a1&T\\ab\\05\\8eV/}\\af\\22\\84h\\a5\\8b\\97\\f6\\a4\\fd\\a8\\ccuA\\96\\86\\fd'=)\\86\\8d\\7fL\\d4\\8esA\\f4\\1e\\e2\\ddX'\\97\\ce\\9c\\94\\cfz\\04/\\dc\\ed\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/float_memory.rs b/src/spectests/float_memory.rs index 1fb78183d..6573c18c0 100644 --- a/src/spectests/float_memory.rs +++ b/src/spectests/float_memory.rs @@ -45,7 +45,7 @@ fn create_module_1() -> ResultObject { (export \"f32.store\" (func 2)) (export \"i32.store\" (func 3)) (export \"reset\" (func 4)) - (data (i32.const 0) \"\\00\\00\\a0\\7f\")) + (data (;0;) (i32.const 0) \"\\00\\00\\a0\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -277,7 +277,7 @@ fn create_module_2() -> ResultObject { (export \"f64.store\" (func 2)) (export \"i64.store\" (func 3)) (export \"reset\" (func 4)) - (data (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\f4\\7f\")) + (data (;0;) (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\f4\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -509,7 +509,7 @@ fn create_module_3() -> ResultObject { (export \"f32.store\" (func 2)) (export \"i32.store\" (func 3)) (export \"reset\" (func 4)) - (data (i32.const 0) \"\\00\\00\\00\\a0\\7f\")) + (data (;0;) (i32.const 0) \"\\00\\00\\00\\a0\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -741,7 +741,7 @@ fn create_module_4() -> ResultObject { (export \"f64.store\" (func 2)) (export \"i64.store\" (func 3)) (export \"reset\" (func 4)) - (data (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\00\\f4\\7f\")) + (data (;0;) (i32.const 0) \"\\00\\00\\00\\00\\00\\00\\00\\f4\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -973,7 +973,7 @@ fn create_module_5() -> ResultObject { (export \"f32.store\" (func 2)) (export \"i32.store\" (func 3)) (export \"reset\" (func 4)) - (data (i32.const 0) \"\\01\\00\\d0\\7f\")) + (data (;0;) (i32.const 0) \"\\01\\00\\d0\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -1205,7 +1205,7 @@ fn create_module_6() -> ResultObject { (export \"f64.store\" (func 2)) (export \"i64.store\" (func 3)) (export \"reset\" (func 4)) - (data (i32.const 0) \"\\01\\00\\00\\00\\00\\00\\fc\\7f\")) + (data (;0;) (i32.const 0) \"\\01\\00\\00\\00\\00\\00\\fc\\7f\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/func.rs b/src/spectests/func.rs index f661b4e0c..e51167191 100644 --- a/src/spectests/func.rs +++ b/src/spectests/func.rs @@ -1359,7 +1359,7 @@ fn create_module_3() -> ResultObject { (export \"signature-implicit-reused\" (func 8)) (export \"signature-explicit-duplicate\" (func 9)) (export \"signature-implicit-duplicate\" (func 10)) - (elem (i32.const 0) 4 2 1 4 0 5 6)) + (elem (;0;) (i32.const 0) 4 2 1 4 0 5 6)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/func_ptrs.rs b/src/spectests/func_ptrs.rs index fca94347a..dd6d12b08 100644 --- a/src/spectests/func_ptrs.rs +++ b/src/spectests/func_ptrs.rs @@ -194,7 +194,7 @@ fn create_module_2() -> ResultObject { (table (;0;) 7 7 anyfunc) (export \"callt\" (func 5)) (export \"callu\" (func 6)) - (elem (i32.const 0) 0 1 2 3 4 0 2)) + (elem (;0;) (i32.const 0) 0 1 2 3 4 0 2)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -533,7 +533,7 @@ fn create_module_3() -> ResultObject { call_indirect (type 0)) (table (;0;) 2 2 anyfunc) (export \"callt\" (func 2)) - (elem (i32.const 0) 0 1)) + (elem (;0;) (i32.const 0) 0 1)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/globals.rs b/src/spectests/globals.rs index c792450e4..53a35ded6 100644 --- a/src/spectests/globals.rs +++ b/src/spectests/globals.rs @@ -269,7 +269,7 @@ fn create_module_1() -> ResultObject { (export \"as-unary-operand\" (func 42)) (export \"as-binary-operand\" (func 43)) (export \"as-compare-operand\" (func 44)) - (elem (i32.const 0) 26)) + (elem (;0;) (i32.const 0) 26)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/if_.rs b/src/spectests/if_.rs index 688c82a35..e3f4f54b0 100644 --- a/src/spectests/if_.rs +++ b/src/spectests/if_.rs @@ -635,7 +635,7 @@ fn create_module_1() -> ResultObject { (export \"break-bare\" (func 36)) (export \"break-value\" (func 37)) (export \"effects\" (func 38)) - (elem (i32.const 0) 16)) + (elem (;0;) (i32.const 0) 16)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/left_to_right.rs b/src/spectests/left_to_right.rs index 1308d2635..af2bdbbb1 100644 --- a/src/spectests/left_to_right.rs +++ b/src/spectests/left_to_right.rs @@ -959,7 +959,7 @@ fn create_module_1() -> ResultObject { (export \"f64_select\" (func 127)) (export \"br_if\" (func 128)) (export \"br_table\" (func 129)) - (elem (i32.const 0) 0 1 2 3 4 5 6 7)) + (elem (;0;) (i32.const 0) 0 1 2 3 4 5 6 7)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/loop_.rs b/src/spectests/loop_.rs index 7597b5d3f..4c84b8a53 100644 --- a/src/spectests/loop_.rs +++ b/src/spectests/loop_.rs @@ -667,7 +667,7 @@ fn create_module_1() -> ResultObject { (export \"while\" (func 42)) (export \"for\" (func 43)) (export \"nesting\" (func 44)) - (elem (i32.const 0) 16)) + (elem (;0;) (i32.const 0) 16)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/memory.rs b/src/spectests/memory.rs index 262b0122b..20bcbf844 100644 --- a/src/spectests/memory.rs +++ b/src/spectests/memory.rs @@ -119,7 +119,7 @@ fn create_module_5() -> ResultObject { memory.size) (memory (;0;) 0 0) (export \"memsize\" (func 0)) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -157,7 +157,7 @@ fn create_module_6() -> ResultObject { memory.size) (memory (;0;) 0 0) (export \"memsize\" (func 0)) - (data (i32.const 0) \"\")) + (data (;0;) (i32.const 0) \"\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -195,7 +195,7 @@ fn create_module_7() -> ResultObject { memory.size) (memory (;0;) 1 1) (export \"memsize\" (func 0)) - (data (i32.const 0) \"x\")) + (data (;0;) (i32.const 0) \"x\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/nop.rs b/src/spectests/nop.rs index 8be6c9fe7..80807428c 100644 --- a/src/spectests/nop.rs +++ b/src/spectests/nop.rs @@ -632,7 +632,7 @@ fn create_module_1() -> ResultObject { (export \"as-store-mid\" (func 80)) (export \"as-store-last\" (func 81)) (export \"as-store-everywhere\" (func 82)) - (elem (i32.const 0) 61)) + (elem (;0;) (i32.const 0) 61)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/return_.rs b/src/spectests/return_.rs index 9f3911b10..9c2e34971 100644 --- a/src/spectests/return_.rs +++ b/src/spectests/return_.rs @@ -412,7 +412,7 @@ fn create_module_1() -> ResultObject { (export \"as-compare-right\" (func 56)) (export \"as-convert-operand\" (func 57)) (export \"as-memory.grow-size\" (func 58)) - (elem (i32.const 0) 36)) + (elem (;0;) (i32.const 0) 36)) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") diff --git a/src/spectests/start.rs b/src/spectests/start.rs index 4bed85714..04b518d88 100644 --- a/src/spectests/start.rs +++ b/src/spectests/start.rs @@ -63,7 +63,7 @@ fn create_module_1() -> ResultObject { (export \"inc\" (func 0)) (export \"get\" (func 1)) (start 2) - (data (i32.const 0) \"A\")) + (data (;0;) (i32.const 0) \"A\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") @@ -169,7 +169,7 @@ fn create_module_2() -> ResultObject { (export \"inc\" (func 0)) (export \"get\" (func 1)) (start 2) - (data (i32.const 0) \"A\")) + (data (;0;) (i32.const 0) \"A\")) "; let wasm_binary = wat2wasm(module_str.as_bytes()).expect("WAST not valid or malformed"); instantiate(wasm_binary, spectest_importobject()).expect("WASM can't be instantiated") From 1faaad7f72337c35be2420599b5b82d674e9a5f8 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 13:31:37 -0800 Subject: [PATCH 28/29] Autoformat files with cargo fmt --- src/build_spectests.rs | 29 ++++++++++------------------- src/linkers/emscripten/abort.rs | 4 +--- src/linkers/emscripten/mod.rs | 2 +- src/linkers/mod.rs | 1 - src/main.rs | 18 ++++++++++++------ src/sighandler.rs | 2 +- src/webassembly/instance.rs | 13 +++++++------ src/webassembly/memory.rs | 2 +- src/webassembly/mod.rs | 15 +++++++++++++-- src/webassembly/module.rs | 5 +---- 10 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/build_spectests.rs b/src/build_spectests.rs index 04e06f4e4..cf1fefc8d 100644 --- a/src/build_spectests.rs +++ b/src/build_spectests.rs @@ -207,8 +207,7 @@ fn test_module_{}() {{ module, module, calls.join("\n ") - ) - .as_str(), + ).as_str(), ); } self.module_calls.remove(&module); @@ -234,8 +233,7 @@ fn test_module_{}() {{ .replace("\n", "\n ") .replace("\\", "\\\\") .replace("\"", "\\\""), - ) - .as_str(), + ).as_str(), ); // We set the start call to the module @@ -246,8 +244,7 @@ fn test_module_{}() {{ result_object.instance.start(); }}\n", start_module_call - ) - .as_str(), + ).as_str(), ); self.module_calls .entry(self.last_module) @@ -272,8 +269,7 @@ fn {}_assert_invalid() {{ // We do this to ident four spaces back // String::from_utf8_lossy(&wasm_binary), // wast_string.replace("\n", "\n "), - ) - .as_str(), + ).as_str(), ); } @@ -315,8 +311,7 @@ fn {}_assert_invalid() {{ func_return, args_values.join(", "), assertion, - ) - .as_str(), + ).as_str(), ); self.module_calls .entry(self.last_module) @@ -373,8 +368,7 @@ fn {}_assert_invalid() {{ func_return, args_values.join(", "), assertion, - ) - .as_str(), + ).as_str(), ); self.module_calls .entry(self.last_module) @@ -404,8 +398,7 @@ fn {}_assert_malformed() {{ // We do this to ident four spaces back // String::from_utf8_lossy(&wasm_binary), // wast_string.replace("\n", "\n "), - ) - .as_str(), + ).as_str(), ); } @@ -469,8 +462,7 @@ fn {}_assert_malformed() {{ func_return, args_values.join(", "), assertion, - ) - .as_str(), + ).as_str(), ); Some(func_name) // let mut module_calls = self.module_calls.get(&self.last_module).unwrap(); @@ -491,7 +483,7 @@ fn {}_assert_malformed() {{ .or_insert(Vec::new()) .push(action_fn_name.unwrap()); } - + fn visit_perform_action(&mut self, action: &Action) { let action_fn_name = self.visit_action(action, None); @@ -525,8 +517,7 @@ fn {}() {{ trap_func_name, self.last_module, action_fn_name.unwrap(), - ) - .as_str(), + ).as_str(), ); // We don't group trap calls as they may cause memory faults diff --git a/src/linkers/emscripten/abort.rs b/src/linkers/emscripten/abort.rs index bb4cfa117..e2662bd19 100644 --- a/src/linkers/emscripten/abort.rs +++ b/src/linkers/emscripten/abort.rs @@ -1,9 +1,7 @@ - use crate::webassembly::Instance; use std::process; - pub extern "C" fn abort(_code: i32, _instance: &Instance) { process::abort(); // abort!("Aborted") -} \ No newline at end of file +} diff --git a/src/linkers/emscripten/mod.rs b/src/linkers/emscripten/mod.rs index 235814ed0..2ae7ab420 100644 --- a/src/linkers/emscripten/mod.rs +++ b/src/linkers/emscripten/mod.rs @@ -1,8 +1,8 @@ use crate::webassembly::ImportObject; +mod abort; mod printf; mod putchar; -mod abort; pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { let mut import_object = ImportObject::new(); diff --git a/src/linkers/mod.rs b/src/linkers/mod.rs index c21b7bcbd..ef78d9e06 100644 --- a/src/linkers/mod.rs +++ b/src/linkers/mod.rs @@ -1,4 +1,3 @@ - pub mod emscripten; pub use self::emscripten::generate_emscripten_env; diff --git a/src/main.rs b/src/main.rs index 348787817..317fecf14 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,15 @@ #[macro_use] extern crate error_chain; -extern crate libc; extern crate cranelift_codegen; extern crate cranelift_entity; extern crate cranelift_native; extern crate cranelift_wasm; +extern crate libc; +extern crate memmap; +extern crate region; extern crate structopt; extern crate wabt; extern crate wasmparser; -extern crate memmap; -extern crate region; #[macro_use] extern crate target_lexicon; extern crate nix; @@ -68,10 +68,16 @@ fn read_file_contents(path: &PathBuf) -> Result, io::Error> { /// Execute a WASM/WAT file fn execute_wasm(wasm_path: PathBuf) -> Result<(), String> { - let mut wasm_binary: Vec = - read_file_contents(&wasm_path).map_err(|err| format!("Can't read the file {}: {}", wasm_path.as_os_str().to_string_lossy(), err))?; + let mut wasm_binary: Vec = read_file_contents(&wasm_path).map_err(|err| { + format!( + "Can't read the file {}: {}", + wasm_path.as_os_str().to_string_lossy(), + err + ) + })?; if !webassembly::utils::is_wasm_binary(&wasm_binary) { - wasm_binary = wabt::wat2wasm(wasm_binary).map_err(|err| format!("Can't convert from wast to wasm: {:?}", err))?; + wasm_binary = wabt::wat2wasm(wasm_binary) + .map_err(|err| format!("Can't convert from wast to wasm: {:?}", err))?; } let import_object = linkers::generate_emscripten_env(); diff --git a/src/sighandler.rs b/src/sighandler.rs index d64bba470..d75fb179b 100644 --- a/src/sighandler.rs +++ b/src/sighandler.rs @@ -5,7 +5,7 @@ //! Please read more about this here: https://github.com/CraneStation/wasmtime/issues/15 //! This code is inspired by: https://github.com/pepyakin/wasmtime/commit/625a2b6c0815b21996e111da51b9664feb174622 use nix::sys::signal::{ - sigaction, Signal, SaFlags, SigAction, SigHandler, SigSet, SIGBUS, SIGFPE, SIGILL, SIGSEGV, + sigaction, SaFlags, SigAction, SigHandler, SigSet, Signal, SIGBUS, SIGFPE, SIGILL, SIGSEGV, }; static mut SETJMP_BUFFER: [::nix::libc::c_int; 27] = [0; 27]; diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index de8cf8b27..f357608ae 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -131,7 +131,7 @@ pub struct InstanceOptions { pub mock_missing_imports: bool, } -extern fn mock_fn() -> i32 { +extern "C" fn mock_fn() -> i32 { return 0; } @@ -167,15 +167,16 @@ impl Instance { // We walk through the imported functions and set the relocations // for each of this functions to be an empty vector (as is defined outside of wasm) for (module, field) in module.info.imported_funcs.iter() { - let function = import_object - .get(&module.as_str(), &field.as_str()); + let function = import_object.get(&module.as_str(), &field.as_str()); let function = if options.mock_missing_imports { function.unwrap_or_else(|| { - debug!("The import {}.{} is not provided, therefore will be mocked.", module, field); + debug!( + "The import {}.{} is not provided, therefore will be mocked.", + module, field + ); mock_fn as *const u8 }) - } - else { + } else { function.ok_or_else(|| { ErrorKind::LinkError(format!( "Imported function {}.{} was not provided in the import_functions", diff --git a/src/webassembly/memory.rs b/src/webassembly/memory.rs index 5330a60f3..b67253d7f 100644 --- a/src/webassembly/memory.rs +++ b/src/webassembly/memory.rs @@ -108,7 +108,7 @@ impl LinearMemory { // Copy old mem to new mem. Will a while loop be faster or is this going to be optimized? // TODO: Consider static heap for efficiency. for i in 0..prev_bytes { - unsafe { + unsafe { let new_mmap_index = new_mmap.get_unchecked_mut(i); let old_mmap_index = self.mmap.get_unchecked(i); *new_mmap_index = *old_mmap_index; diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index a3be88647..2beb17e88 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -47,7 +47,13 @@ pub fn instantiate( ) -> Result { let module = compile(buffer_source)?; debug!("webassembly - creating instance"); - let instance = Instance::new(&module, &import_object, InstanceOptions { mock_missing_imports: true })?; + let instance = Instance::new( + &module, + &import_object, + InstanceOptions { + mock_missing_imports: true, + }, + )?; debug!("webassembly - instance created"); Ok(ResultObject { module, instance }) } @@ -100,7 +106,12 @@ pub fn validate_or_error(bytes: &[u8]) -> Result<(), ErrorKind> { let state = parser.read(); match *state { wasmparser::ParserState::EndWasm => return Ok(()), - wasmparser::ParserState::Error(err) => return Err(ErrorKind::CompileError(format!("Validation error: {}", err.message))), + wasmparser::ParserState::Error(err) => { + return Err(ErrorKind::CompileError(format!( + "Validation error: {}", + err.message + ))) + } _ => (), } } diff --git a/src/webassembly/module.rs b/src/webassembly/module.rs index 27fd8b785..1094fdcdc 100644 --- a/src/webassembly/module.rs +++ b/src/webassembly/module.rs @@ -427,9 +427,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { base: heap_base, min_size: Imm64::new(0), guard_size: Imm64::new(LinearMemory::DEFAULT_GUARD_SIZE as i64), - style: ir::HeapStyle::Dynamic { - bound_gv, - }, + style: ir::HeapStyle::Dynamic { bound_gv }, index_type: I32, }) @@ -535,7 +533,6 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> { .special_param(ir::ArgumentPurpose::VMContext) .expect("Missing vmctx parameter"); - // The `callee` value is an index into a table of function pointers. // Apparently, that table is stored at absolute address 0 in this dummy environment. // TODO: Generate bounds checking code. From 5c0e404d96b08648d3e60452cf749d06bd8cfc41 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 15 Nov 2018 15:06:12 -0800 Subject: [PATCH 29/29] Refactored math intrinsics into its own module --- src/webassembly/instance.rs | 74 ++++-------------------------- src/webassembly/math_intrinsics.rs | 41 +++++++++++++++++ src/webassembly/mod.rs | 1 + 3 files changed, 51 insertions(+), 65 deletions(-) create mode 100644 src/webassembly/math_intrinsics.rs diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index f357608ae..69b1b47bb 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -23,6 +23,7 @@ use super::memory::LinearMemory; use super::module::Export; use super::module::Module; use super::relocation::{Reloc, RelocSink, RelocationType}; +use super::math_intrinsics; pub fn protect_codebuf(code_buf: &Vec) -> Result<(), String> { match unsafe { @@ -246,28 +247,28 @@ impl Instance { grow_memory as isize }, RelocationType::LibCall(LibCall::CeilF32) => { - _ceilf32 as isize + math_intrinsics::ceilf32 as isize }, RelocationType::LibCall(LibCall::FloorF32) => { - _floorf32 as isize + math_intrinsics::floorf32 as isize }, RelocationType::LibCall(LibCall::TruncF32) => { - _truncf32 as isize + math_intrinsics::truncf32 as isize }, RelocationType::LibCall(LibCall::NearestF32) => { - _nearbyintf32 as isize + math_intrinsics::nearbyintf32 as isize }, RelocationType::LibCall(LibCall::CeilF64) => { - _ceilf64 as isize + math_intrinsics::ceilf64 as isize }, RelocationType::LibCall(LibCall::FloorF64) => { - _floorf64 as isize + math_intrinsics::floorf64 as isize }, RelocationType::LibCall(LibCall::TruncF64) => { - _truncf64 as isize + math_intrinsics::truncf64 as isize }, RelocationType::LibCall(LibCall::NearestF64) => { - _nearbyintf64 as isize + math_intrinsics::nearbyintf64 as isize }, _ => unimplemented!() // RelocationType::Intrinsic(name) => { @@ -624,60 +625,3 @@ extern "C" fn current_memory(memory_index: u32, instance: &mut Instance) -> u32 let memory = &instance.memories[memory_index as usize]; memory.current_size() as u32 } - -// Because of this bug https://github.com/rust-lang/rust/issues/34123 -// We create internal functions for it - -// use std::intrinsics::{ -// ceilf32, ceilf64, floorf32, floorf64, nearbyintf32, nearbyintf64, truncf32, truncf64, -// }; - -// F32 -#[inline] -extern "C" fn _ceilf32(x: f32) -> f32 { - // ceilf32(x) - x.ceil() -} - -#[inline] -extern "C" fn _floorf32(x: f32) -> f32 { - // floorf32(x) - x.floor() -} - -#[inline] -extern "C" fn _truncf32(x: f32) -> f32 { - // truncf32(x) - x.trunc() -} - -#[inline] -extern "C" fn _nearbyintf32(x: f32) -> f32 { - // nearbyintf32(x) - x.round() -} - -// F64 -#[inline] -extern "C" fn _ceilf64(x: f64) -> f64 { - // ceilf64(x) - x.ceil() -} - -#[inline] -extern "C" fn _floorf64(x: f64) -> f64 { - // floorf64(x) - x.floor() -} - -#[inline] -extern "C" fn _truncf64(x: f64) -> f64 { - // truncf64(x) - x.trunc() -} - -#[inline] -extern "C" fn _nearbyintf64(x: f64) -> f64 { - // nearbyintf64(x) - x.round() -} diff --git a/src/webassembly/math_intrinsics.rs b/src/webassembly/math_intrinsics.rs new file mode 100644 index 000000000..0e946af3d --- /dev/null +++ b/src/webassembly/math_intrinsics.rs @@ -0,0 +1,41 @@ +// F32 +#[inline] +pub extern "C" fn ceilf32(x: f32) -> f32 { + x.ceil() +} + +#[inline] +pub extern "C" fn floorf32(x: f32) -> f32 { + x.floor() +} + +#[inline] +pub extern "C" fn truncf32(x: f32) -> f32 { + x.trunc() +} + +#[inline] +pub extern "C" fn nearbyintf32(x: f32) -> f32 { + x.round() +} + +// F64 +#[inline] +pub extern "C" fn ceilf64(x: f64) -> f64 { + x.ceil() +} + +#[inline] +pub extern "C" fn floorf64(x: f64) -> f64 { + x.floor() +} + +#[inline] +pub extern "C" fn truncf64(x: f64) -> f64 { + x.trunc() +} + +#[inline] +pub extern "C" fn nearbyintf64(x: f64) -> f64 { + x.round() +} diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index 2beb17e88..7f7a4bb8a 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -5,6 +5,7 @@ pub mod memory; pub mod module; pub mod relocation; pub mod utils; +pub mod math_intrinsics; use std::panic; use std::str::FromStr;