From 3c0fe1210210ba5bdaf3cb41f7964999b56ed2c5 Mon Sep 17 00:00:00 2001 From: underscorediscovery Date: Sat, 3 Apr 2021 21:58:31 -0700 Subject: [PATCH] try; add try implementation + details, update to latest main branch --- doc/site/static/wren_try.js | 27 +++-- doc/site/static/wren_try.wasm | Bin 182089 -> 189037 bytes try/main.try.c | 39 +++++++ try/make.emscripten/Makefile | 59 +++++++++++ try/make.emscripten/wren.make | 171 ++++++++++++++++++++++++++++++ try/make.emscripten/wren_try.make | 147 +++++++++++++++++++++++++ try/readme.md | 30 ++++++ 7 files changed, 463 insertions(+), 10 deletions(-) create mode 100644 try/main.try.c create mode 100644 try/make.emscripten/Makefile create mode 100644 try/make.emscripten/wren.make create mode 100644 try/make.emscripten/wren_try.make create mode 100644 try/readme.md diff --git a/doc/site/static/wren_try.js b/doc/site/static/wren_try.js index 9cf3a8e1..dddff40c 100644 --- a/doc/site/static/wren_try.js +++ b/doc/site/static/wren_try.js @@ -607,8 +607,8 @@ var wasmMemory; // In the wasm backend, we polyfill the WebAssembly object, // so this creates a (non-native-wasm) table for us. var wasmTable = new WebAssembly.Table({ - 'initial': 191, - 'maximum': 191 + 0, + 'initial': 205, + 'maximum': 205 + 0, 'element': 'anyfunc' }); @@ -1229,11 +1229,11 @@ function updateGlobalBufferAndViews(buf) { } var STATIC_BASE = 1024, - STACK_BASE = 5271824, + STACK_BASE = 5271616, STACKTOP = STACK_BASE, - STACK_MAX = 28944, - DYNAMIC_BASE = 5271824, - DYNAMICTOP_PTR = 28784; + STACK_MAX = 28736, + DYNAMIC_BASE = 5271616, + DYNAMICTOP_PTR = 28576; assert(STACK_BASE % 16 === 0, 'stack must start aligned'); assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned'); @@ -1817,7 +1817,7 @@ var ASM_CONSTS = { -// STATICTOP = STATIC_BASE + 27920; +// STATICTOP = STATIC_BASE + 27712; /* global initializers */ __ATINIT__.push({ func: function() { ___wasm_call_ctors() } }); @@ -1983,7 +1983,7 @@ var ASM_CONSTS = { } function _emscripten_get_sbrk_ptr() { - return 28784; + return 28576; } function _emscripten_memcpy_big(dest, src, num) { @@ -2185,10 +2185,10 @@ var dynCall_vii = Module["dynCall_vii"] = function() { }; /** @type {function(...*):?} */ -var dynCall_iii = Module["dynCall_iii"] = function() { +var dynCall_viii = Module["dynCall_viii"] = function() { assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - return Module["asm"]["dynCall_iii"].apply(null, arguments) + return Module["asm"]["dynCall_viii"].apply(null, arguments) }; /** @type {function(...*):?} */ @@ -2198,6 +2198,13 @@ var dynCall_iiii = Module["dynCall_iiii"] = function() { return Module["asm"]["dynCall_iiii"].apply(null, arguments) }; +/** @type {function(...*):?} */ +var dynCall_iii = Module["dynCall_iii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iii"].apply(null, arguments) +}; + /** @type {function(...*):?} */ var dynCall_vi = Module["dynCall_vi"] = function() { assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); diff --git a/doc/site/static/wren_try.wasm b/doc/site/static/wren_try.wasm index 8cf34e33de64178801249e84681046615e76574e..a73925c662442d050f7737f5ea64fd337f4142a2 100644 GIT binary patch delta 58077 zcmdSC31AdO_CMZLJ(HPaa&$;SLPA2%kU#3QPqC`bSL=B1>1tH!jit$)QQTcyf^*NIv>eu!A{r!VZcURZv z)vH&pURAw1`uQ6}pKT1KNT*$N9+M=A&AvIMs6>uNqtdB9{6<;yR5pXnFdw8-{S=0G z5{uqE`7u46_3$C`OuY}gIP1dm|M`zIq=06cHW=cK#6r}qO>08VON`o`gD-O-fOy?5I zlUa_;fpQ0$Kf!qR6;gV1G$tn2Bg2Xr*B$bD{CFRIb zrq%CyvI`GIC2i3z7Q(X>3f#xD^)G#ck~hn~vo1XIOz8!^pFbSkB`04r{j}51Irg-R z&y-LQ;z2tX#U;HXr;4Xz&b(;)`4^rky(=rHobtB|&%fk&D97Y8&pZFZe@XAj>1X`w zABUfI?zyL2d^Y__@5>=ii1dM+>Ulg{`p|u*=%-2_x$z0UTTXG~OCP(jYtF7YTl&m> zi@1B_3_I@GXP-gjq)+AKeVj=e3vFS!UAyJy=|xHVqI=k<>@&8Pea_n17wk*+75kd~ zhke7oW&7B7>}q}uzm{LgujAMA{p@j^w zpih^_d4y}VK~++o<6%kV$`g8P;4-#FKQ=fud8ZtaRbHbpy&_l?lu9{8*rLB0?8n}C zh$UyU;AT0Jq%mc)UYODYpb;r6@H;&9NWFjP5OJ5U&j@W0cZ<#E6j}Avs6h~VL*Jiz zA_D)IHio^R-NhQn@B+T-n3(f#1u+ zK3u-!s!wAz3RscHrZH94m`dThdBm^!j!5IGtomy-X_!RZzopMhFYALO9urCMd~LI& zNK!~;s#M7p4VheGz15T&@USa=ki1>aHEDjAM*TE9#WBp2loly zn7I0k9;t}BmjYBG^g>2{w2-kVuU0uENz6*Bth@jTYe-rOg&yE6DXOK4oRCoE2uMrF zo#0&_Emfh4RTEx8$@r1!NRsM5T1Y1V>1awgC|9e&NI+xL!$CEmCLNK6tohV{vPFil zqOuyOcs4~P(g}d~BqTyf9E3JEX%kJ0bdY!shJ93AGBO$t zQbPV3aCMASD$P!=L_q{JAJXY3U7bwDf&$Vg0&xJgt-=Z_IpF|u8zeymAt=xzaY>q= zB7z7~(nFaONeiI@(87~5yRn`6C7ESVtEISqLw_vuyufV=)*LxJ^B34!5QS4d$>cV-^ zLlW2tB9379>x+6 z3Oy*1pm;>OD8it!T*gZzqz3xRh=8BJf+imF=pj!$^pjN8j~_~nqB1f_u)latg>{ia za&@nm3^?q2qlQ9SR6kp53@(?)l3cl-SyT>rjx0JKlDxmDB>XHw!3;RoqBWIZJ}EQ- zcGOb>Ul(1*Djqt&$3Hn+{?G^E(G1Aap0ikmzN%+6?)UU8#C>w{$+-Vp@l@PDQal!E z94Ib9NJ+_L{9aT-@&8jo@hf{pWTdM9B`;SAg-&r3D@Sq9?p01ThHKqxlp}G0mgJ!X zQTr6A3OZG#W+maF6I~$H*LQoJB3e|fTMeGhEw9$E>z##4a!2pKA5YwE=g3!$n0tP;BR%mQ(f5V ze&u>~|8DHqhfeGd=`PoAA20zFJ{&NC&u037iplBP3P$QphG#}5*JoAqX1ab)#VPSG z(gybCFBR&Q17AezXvLNyetqwVJUu+<95ntmiJJyZVY1#fXsRdd&_k~AJWZ|YslRi` zzdRu)ANq{vsbugP&l4NcR}WM!@Pyn^+30ziT6Lf2i4A$v^YoX)4%6SP%+$+y-b$Mx2N$(Bl9HBy@PMb{_x+#8`E7ZB}H4*B0SS?$Ab;0DZ zB7BGy4wE<$0TjoHCWyHx5c3IQ%9A{m%(f>XeRg%pFr-cmznPpeIVJ*VF&G%CF?cU( zj2ROwLF3-3zE+QnCaoVm`tSI?cl2BM9Y3bGe&6A}aJTL73&ryk{4N^PBdKa-#HT!? zKR$+(xnS%eFu6yMJrc^fWNdeKl>W%racuegaiiF%hpNZj%vo69aYP^ehY6FdyXi;# zP24@ls`M2T&%k~1r2hCFGHEt`ADeWkc-u$+%aQc_&XLE9-){QhM-}PQCLe;Q6_c+8 zw*OIc()Lf`0b%BQN?NrBisbi*9z%-=}Ck3mxhdy$q zWOzY{6w{kw(Ie&B0t|4di{QI&bZr-_k1_|f)lykKcuYyu%>7*^|IkS-BZdJ-M;B4b z7zrT8A~R)JqUUok@Far;yQBR(q&&|@QY!*+dUB-15G3Q|5oc7cbF)PM3IM(ICbI9)9Fnmtd{K&XXZWpR?jA#1q&@iJFyp zU(l}1n?qW_Vj(+*Kos(br_kQ;%Zn<421*)cDn?2I|O#PEOd1VL``!P&qA9^ zq0OQ2zAJ@XmqKC!tuBF9hrnlULF8EkqK-w3DTNjn-r~T&c5~3JL;Bt_+~lG+Ip`lk zjy=tH(RTj5@Mag@?7(NII!aXF!mZ4E(d%6FItP7is+MAvfA<))D1R@!(S~#iOG!@Ol?s@4z2Obp+QV9v*{U3yF11s1x0Vzk{YsdwS^4*aTgt~=jTuh?KE>S8q=NxM~DS)x8R~Hl_6{%9D?Y+c=|$v zsdbODzpXC4R)?KuGn}5( z5F!v`f8!~%xD;9(3NL49vQ;!ge~yJsE`d!Bfmbsy31JS)hE+!6hDPx$G`kd<9SX0z zEFAW8EUa@0taAvwm0@=WquTJFqtNJ5XmlvN>&kJ&&k<;F2{bqa_GF0hPLu|nBRf#= zs#U!UuXo_>CY;ctIz=yX(Tg1Pe;jmFYevm2;|4qkh*bNE~rKG%UC zaN*IXI>*<#_*w@)M{&lAPj?RA2cMs99{jd>xK?pGR2!-P+ez-*U3|NPzsbcv(>Z*% z3*YU)7rNX(D@8j^zRktAIrzmc{<+SRZ*}3V4*X6RzDep>|GZ`2;^JEz{0cYs&v%~u zCKtZRfvHFK8*klzfYeZ*lNHxVrPEi%$gKzc$lpGIn_3ne=iOn2j53)4Xk=E+x32Jrqkzr zKOP>9&3(IzZ+GxdWI7e^gLr%_e76hV?ZBVUble6Xc7R7?gx}`k+Z_C>ZsC2@0UrZz zb>XcJ{7qN&c6WqFy-iMwi*Ir8p25_|9r0fHCKtZRf$wyM|49OP)H4m!?Bbgpyk{C_ zPXfFLzRrcObKst7m`@YIJ>#!N7vE^%X)O3rrWgyBit*RpOvjb?SqE~ZaRaahmtcd# z(1A?HmADra;`%@FBpb~QE_{;%ug!9*&-W(W+y9J7zS+e$JNTQk9QVim z&XZr~!q+))k16}Xf_wU(G08W&_(ls)#^BB@VGI;u3|3@0s`O(AZj^Xq;1X>R!iOJi(ffc37{h`=NNIi2I%U3|NP-{o?D zRp;>CE_}BGM{SJS(^6M=j&F1EZ4Ta3ov!H|-s-|z9rzw_AGM6h+|KbWF22RVf1BlW zY_9DbzR87ea^S)gMon9GUFY~_7vJpQXJtFdU*9==oeN)Q!KpG|pRGI}#f*8jsLhR8 zPF0-Ofn0W6ZEkcaHaZM>s^SeDDR`?=g9DFh4G!K@6>sbuU+>_xdIx?}wqqP`>Kwkv zg+~`Tcu!rb>l|O_;_Dpv?b%worA#+>4xj77=SCg;o38xlcaE=h@wE=zql|jz@Jn4o zAk{=IOWyBIs8-y-ex6E zirflCh8`E=rL67Dc1F5J2V%uuEj$77(f=kNa;uY-_p%-D{G!g`QygAe9Q23TPT%s@ z&e0Q0H1$6=Iq*+h_~Opt)lTBg4tj64(;nZ}IU1{zt+pUK#4baR1}y0uUE!cBY_P`? z-`+Wx#u28>O9?E>-_tL-qjR+Cpj9(zu6<91kNpZ%_Oo&v8+KvvDTGU>4#Y~Bd#1O8cxfD`_C zJK}xw&yueH*(rhRsxTL8C$;bK=m&1##mA1U-6bi1#105vO-n6jheC0A$?EygDPl%D!i7oUJ-@dcOMQ`7`P-@{iL$^(vQ(Hc$qCtm39 zUa~gp9&)WfEZX{AR4E~ru)gZj{)z~v)NX7es$qTir7z_th)iV&F7z)h>zW&nvEQke z&(tr!?8Jm=?Y^u>$Fy=Uf7HLW4ZQ2GUtX3oB93|c&0&5aD81{9zR{J8$*7gcVVFZ~ z#8L!LDg_lsWFa`Z?+$%SJr_TD=VEIBt+K>Dn_dYsge^psyt`PPN-?wPM>$86|4FN3 zA^-9kg(4wTjYwGcPRlka9?F4{LkO};J(pI)bK0sxbT365Y&o*uc66b( zSxw04wBN`nwlMwog_@AlzbE80`hQ#erEth~EdEmyviiGl8vSj>f5LC&H2S|){8JKh z8vQ@5{iQsbp!g>wX7zXBH2Rxre{~{G8-9(VM*o*;|2oTj!zwscv{vHbO z8|#0=Z)Np=&;HjZWHtJ$wDrHQtclzIMG1NRJy?zYioQz1X0`6Ou^Rn-x>X5TotuEw zs1*7=#QKY+D!QHt+JM>wy#5}np7pDGs|m%rZ)PIXnuQSqdNz-=iNT6K?TSd?3G4pW zD+Y@W_(}S!SM<)>#%WCi?OexpQm&=eD0k>-GkdUC^?ox4@3e>mGEC?=ot8Ura4V&iayJn8|w_$K_yxuF? z&$>Ioxx3D}TkqV})|Tj5wLPr3^z>)X(-=?q-r9)uG-CF7`s`WWr>?Wzr<<%;TW7m> z=jpFp*?Y*-@=%eFOcEUHD@)484k6EU2zia`J?5zF3B7vGz$h~*^k963MFV@;K`I!* zxdEztWN?Gugsp1W9B5DGvSKZ3#t`q#Au>@a=dwN*lWPSUqts|Id=*BoE(yY{le`gbMeL~DC4I6J z?t1O~9$mV_NFfF!MJ5gYk^=pK`Qt6I|2RLF_0elel*UAQnzD)9F(i$x1<7EvgA z9pgBgCsx8DDByY7$P^rH4p9T6Qi>8bC$LsBj zKFl2&Nm^+h(}6mUGZvJgkpKep&u;A=xgRM!@E*dkaST2-Z58g}hYMqAv3(v#-^IPU z@g|}DwR8Gw%guJ78?vf2bCJy}7ALbh{hGx!DdgTuGTnRo7xyfG13pB!DZ|O84-p$8 zDxmqinp9zk#^`teN&5zoa*@f2w+#r~*hWW+g!S6nUT1IW{ci6Soe=gRzN}TyApqKN zaiW0o1Jn+WP$oB6My!r6pj{!H5~F3GtF7NC4iX>@LOfIVL8O#Vptp_Y+lVZ9+W!Td zXv&W)Re$C7qG*K&uKIEEjgyuNIk_~}m^3mOvL)Cn<*`s4cLQ!npOIp-ogztI#=$#q z@o~{9QL0cGP~9qdDmpnq{ro#pi+(b*EXYC}*u{-kDt^$-QjRvh@Uv{Wn=(OfyrWxi zn?%A=Ch0AAjApSx#;hRALs<9;PqcII%wya1tL}_ME2`uPD!4C`^H5eO987-T7xM@a zZdW!9QyK`v-hQf(RPkgys&tSDJy7K=wH{D%5Ja9fQdDxQu&f8ACL&JGk^4#FdJ zB$bNA{HJo%R1!3uA3@%9nN9)0As+P~Wz{k|iHO{-0gX>rr5bIAp0c!%aed0NqJl7K z7}8A?>(r$MJ!+Xa?xU7LgO_557YwZipFDj2LZC!Le|TwzNlocNufd!5wNgZZaO8Re z_3C9Nrk{z_msrn5`ex^DpL5r1xt&5T5yReUFEOPn1!BLmH&AaBnC9hn3aKlS%Q)nx z{UG|hBqI(PkqbC08~_D6$tZ@xpI0Q83PdleNnSwL#DIHkz=(K2kA#4MN=VBUrz?qM zI-t~qs9bUKj6n4FrlX&FS9TF`DO=e}P6*cF~-xbF1yLa`*$wn!655n(=yGurK z%|Dqm1xI+{hzU|Im8T~$KmO>{8t5O>`ixJ5df}K7Q_X0ILE$)f$fqy8yDO-!yIW20 z(iAwf1MO9q>-+BRJ^1^t$aE~DYM@Xx#PMP{CBv_xU~m@F#57LlT$ss32uKq%KK;0r zqsMSE092Y`oR}jMp8@RvyCA}~6dbh!rb9`R{g;&F5TW9>x#jv>D-V%}D9d%FA(ySt zOB=!^bzh<}Bb&TTOad`Fb_rEnYoKrhlA?{!|Ittw6^ZZjsuCT9#j8;Z0}&j^L-iEf z?5Q4_FJOXFsJQTtnr@n{$fg*SEgsUQgk=)8Hl>F0p{2lbYWGAbm)f0CGmOp=(~b~9 z8={^tmkPD_THbUm@1HfIKNkuq_9&1H4W*o_LDtGr`4Kctyc(||c54`jSu}C*g?7ug zBn8Y2Qpw64H zI*)I|p=$Sa8+{d1aX{M~HWnx7q4XqefoPcNQPysum9Q1K!P*h?SKIXo=%MjYzT!11 zL-(Xk-@3Y6%B+Tm_$NY_`bDn51p4jx`}79EMla1x=^cov>WH*;(um#dK)qLxnKB}pkM>&b4shlr;>{T+N7f0;3 zHEymhn_h&#FVQ= z5sLAelM6UNNGRRSaU8TX{taH}w?7iErN1rjaeSIu+96?a2&^e%Rq6w6_K0Zq2VMn> z6_LL6yIdZ6RKNPsNSt!oHc)@xixz4kY@iS&)lg9j?dHQA?4nUHtL~E$203UeLqV*hIvIuMB8pp)Z8S>tf6ey97(L;-vb0tj=$0zXpB7uHcJ&pNlnj`ttaq<3 z?tO4q0Y?p$G|N?>f3dzW#!&#dLKdRQkTlcYl1^dZAMYkWch&1AFnt7W8F(~t?kND3_}7a5k|KjY*t(CYTk;;*Ci%)CEm+npdvpNL{aVj4HuR0T7W9bY*4k9!483Yncz4D6_-Cjz41WU?INkm0HEV*ZO) zTE9`uf-_4#w?IBP$_Vl?T`4g>l7aill@b%wQ9`Ejxzb4)M^^tJLK4A=M5GND0?S`L8nG!aZPGMPc zCj3PxVAo$X^Q$6#{FA-Ra(9A_ccu!TQS+8=AzK$hMo{1UWJz?(Il||oNo9N^Zu2yl zDpyY|TVo2KgUz)Ckl=--A&?!$ntm;l`T#I_ru`Fr7}Nd@7t(QCM;NpOD&+HOkXaR} zDbiOxRS>PfG2^at(9|Z&ZgyH}sTqiYnmP^dCkkB>%A8~sJdKBo6SZ~d6GWi^iSuus zbc-<_p<`Nq@|!v8uq{R%MB^m1!66FaKq|2%f!R|ig%%i}R%~`MCm;E$+Qgkt;pf+Y74D0 zo}eWWPm=a^jP8nNFo|k9))`r&7fh=_GcAK^RVVwM-3r-e!~wZ4gc<3)b?Imt;K%!J zea`RI$lUm;L|airBa;s`jcHLn-t>Rn$Ovtbv?bs&u91oQsc1SjGS@Inm!pt`<@m3Z zlw-oJ!RVucnTYLv5PBlI&{X0uM;MUgDf4(}hkpC!-sz?vhUQd+6Q*TzS%5msvhw5n z7hvv%;j;}Jv-!3yUc&K8XTud!!{pJkF=#FhHa!e}M%4ke0d8Sg8C3@W_*?Qmi zQ{s9MF5c-(QWqO-I$C(_a#(0~RwI(-Nf5<=xpljhg4C#}QChNwT~(1lPkw~2T1mwz z^2IPPFXO8===W07MdrowI-5l;NV%qAs#imQzVl`2hh^^UIl|bEKMdx%-X>1V{GS_4 z#WI*8D`vM8S#~E2>75 zwpSQE{q|SOPyYQxHRAsrQCU;jX6^XJqB{B27*UOTC5Vs9SViSFy`sndE1GIOV;hZ1 zV}>K0D$(JcE7330p7=q#CdX(`ry~H-4!J`Ijd$MJX)?9TBuRFvLKB^x36634jh!8R z-)n{O60CfENL-Mo8oK8Fnb%7l?f?4qA-~k;VLULN#nnFkKarn)?;Ea4?Rle|MfJSa zqT~r$uW(1Ip3HhC<6^d?W{7MR|SushIVs z+Odu;(A#%h$sX0GzdZ>bDQSK?r{D*;cd`6OCMR#}K&Kjs0dxD?g#&+e7fBzvvv4wv z9%XaPE;95#9I{h~ARM5M)0hfOx4O0OR}S1QsLpof4iy=~hoUO^j)95B;#eAh_QV-a zJEP;_`qW*yaQd1hX!Rh&0du72jZcL~-cuo0EUAgB( zLU$UTErPivX+AruD%1XZ&6xtUD3RS0op;I(ysRRUIS&|{7P(OzUxUaLQSLG>Z3xLD68}p?-ci(U<-jPg@{K>(eU9onsz1i!m_DP-WlyNSCY4Ex&#RKK;sjk=dRiu)1QTXlpO#Uh)az^B4F^_zX7)LD zyj$4Av&74GaabU11~t3!df)d_4`#1uDHQoO{{EiuZS?;c-^PLWa+#;UZnXa#;HLMx zu~+na-Y-je+%iEKAzj;BsDJnV+29ESS;rcxD56phe~WFS^$&)|Tf@&juxx0KEq8KW zO12F(+Wq+MWk$ROcTgTrWQzXXhZCajTTEeu6ZXR#L*0G-q*CG3(w4NFMl<$hnfdaW zxR+)Pf^I;aNHb(>at1f%#Efz@e3A#m`ZJEJSdS6azG)}Z{Ug4X$HGZS-Swx%Pi2}W zBi6cmTxhamDx77AG+5H0X;@llS`jcuv#M^-7fhHo(41F7WNKKb%7AkGjDw5RFWOCm zJ$Su_*u~%!9u||4LWx>|#d?)gpgtnIq=M2eKa!l=Si6+`F}0x}(Xsq368f_rQyUuN z>j-~B<&Pkz{A1csj3jdp3UPWa#@7BUOCPZ(*<_&P7v({p`h7`&3Xt4{U|_tBLZOk+ ze!(!5rr#pT&L}jQMxp=FKi^XpFwB*sdXGqW zELFG1=!~3IwyQ<2_`GWZH?&Eo^QwaRZ>y5&SATv8)GWp?^48~v znnB674rK_H#Dei(8na8sm=(d`#g=-;q-IVyAt=>J4Q5Wi>I)icLyBZ2GC(%q5xUUlN^}(P_RZF8Y{w zi8^^a!cNTW1pHj341Jk|VW?Suxn-xttT}34<=11NV3&X0rx;yxd{q{!*`PE@_P6h_ zB2p+C&7F}xKL7O*Q>G|WVB^IH?1V|6j~~(pi?EUpQRrt18aIo@&GccsnbiG|>_tXQ zn;AAgj)o2!S8ml$`_Hx3j6+8&i5O&Pjp%TeqgQ-W0-3}t<1YM`Or>{_5@RZnCu_Ko z7**zxr0pyHjET=>3VG2YZ!F$cmSAx;ramQk>f1F;W*vPQjGI!{@2}_!b(VCec$@7zt>dAe_be8Z<1In z)(e!6Gq$#e-1JH~@gZPYJB%tZ#eovV%v(|GG7Rxhz%5@4qf(BUju>X+sGs)V)d1D5 zUACS(O7%6m8u)nFuk{Bz_9wI~S@wzQ%By=yTBCm8K-cK2SnMP#D`mI<{8~#z&FDGK zMlhP`_iLLFCN_HbwT(3Yin=D_)2?vTP<_J^_e$O{kk-3b@^uyFb&Yjxq$|D0l|DUv zAI0+xlUCy@rV&~K(JH>4VxdV|O|crV?3ZR>?HlW3w>VNqd{KCTphPF(h{q)a6>$YG zrAP_V!eAMP%K5SJ%>3RpeMeiv;o`(C(wVCQd;otvs`$JpC{XtBac!D;t$?FA%%f}xUf9YO|H@J}YlIIA2DSgN1ln(7H~O zA;O4bsWPoZHwjr;iR&`av_{l#_n9Cu=kz|4EcbnQO&e+;Q@hfzxG8!j9Ht-w+2N61A=C6dlQ;DCp#iz zqMsV20iV;bPa<`qfh-E0X3s?bNtBP(f1)i&XwT4pN{~cz;v`~IFpGjxpp=&6SJ1L+ z46UgDiz-wu#e$ns(zS84Gg0HgbJzX#NkR^N6{Rs=`(Ff@=Xd&&LY- zu0&8!spny=Oh=5yfi;n!GjIuF;DQ~`w{+ntFa$=IN>*%5k)BLD88YG0HWd|EIlYVI z!yof;x`;oqVVWu^S-rc&))p!wVX91(C8?7-^fZmIbdyuf5eM5m>hcyu~Qh z#W_Pz{j(27xcznS{6(U@c81c6kz+WfCpBqDdhyU4(nP`AM_tS=*EIZt;Vu{MNw)ctgF!yWTCk7G=2!O_~n$w=Oa4o zyG*1D#@1ApZ|q2RlmUzCF+@WaEx&St>SZpkPbei(!8$HCw)85d3~7s)Q;aA?95!N? zq9`xB5{k7G#E@Nv_6yUGZWrPIq;|%%M;WO1LLV(Bm~kM5bv?y(c#*%0In^Ew52Ue8pdvrU=Xh>%x?Rc24h>hp^&5f7S zP$3F47?ytsHr$jZWUxU==!CJ5Zq#Og-7!t8GtkLq!;D81G@rH1Xjj-_V_Uu?le|m} zpladACG$%Y9uz~|^652N8@5aVBWZ`By60dCyoRqx3(IBhXf*zj$wo&fr1k__aI4`c zTx|zzKx!l=s01P5m=KDi#)JeALR)}cLP3Pk{$DpF6(NN&At_49gj71^(T$XbNChz= z$;yPLlWO8kg+muTb`&7~A@5?NHM$r+M=w zL;X;=_?<&L{?1X3&8IFNP7ft+rr2b=Q3I2Zu+dh)ataSZNi5rZ)acTk^%-{+qs*B* z4<#W(XXl}K%*Lof*0$5P1E|p#<`5%=1pDps-goyNBAUDP(0HIb%V*n-E#28&`l2p2zCqh&AXXa=x-l$`w7VoDdh;OW7D zPfkt_N*tTIePxm~`n{cxEH_@<{^$qNF=?nEAQK8{e%ha_HQD6he8;9_+P~`49!Fp@ zrHK{y2m@) z^sig)x{W6MwM>hi2z>uFDhWyJVndPyciKFV6NN#0`-MkLqy#UyR)<%XLS>7CNN`T7 z*6=mFzQ!{>Sij)#akNc1w8r?p2mAI6VNk`^b1;Hk-AwxfW_QH$6|=9e`qE`drc#4r zvPSHTvhK(lQMDjy0HbA+yqml6_7Ty)UuFyqvm?hQ*r%=BK?jxa1e>%`1O)rjeV0~U8CD>+mrYGP@3*?0Jq~5)7!zKdv9k)jB>%b>T?bg z5&3faFto~$$aBMF&HF_lMYiUg+q#S{pLu(?b zxWTXVRKRSFjwx4y+wSfj6Q3hnRqdPuO#D8$cCBtQ`Zx#wmSSH?TLUoaMW{+{Jwvrn%z+&n;&W zBd?qdO7wDS>wy( zu{7-Xg@H6{f-xoqYmgcfh8cG1Aky*>$8(JO2hq}U0Bhz-9l%D#v1Zf`KvyU>dE>DG ztW-^~&IR)|q+*s1$rWrUbazCBt-EsvL3gpB-`3qLDp+suR4|a`yF7^=XWd^No{k*I z1{h7tE3yZ%-pNmi ztuFOE-(dY%HW}I^<1d3)ZoGhQ8Pu_ie|)RRNI4{78N)PmEMqJFuPfsmT4xzk@RJT@ zv>PQR%o^b$%&CFaY@A~et?myhpg8Ept%#;+rpXqx^s76X=2+wVbEbK$wFR|v(`-5b zlLSxjf|FSg4kGP!Gks(EVAfZg?3kvIGSRtDrF)vrphiZym)xgZYkU_+VdXjF^*kD{ zzcs+fsARn@@7)Y?oDTFjPRVotE2j@i3Uu-(F?z`ZvWVjozkZzZ<2phYSQDPwmEVIe zm{j!CK^Qf0u8MJk@jxXThXV6X0vmZ%tiyKBQ>xfN#EWrVxQp{g+uBY2{RD~MV<#>q z(e1>=Vkmf#_2(L!NK0YR3HJ-nKcEXLgol+JFvx(p4FFM4>#W@X zqW+=oX@{8(yi%Jv_`KzFsCP=mB5Y9vQ%iyn;N?f^-+xOkn;18%Ghv-!Q%N=DYwWFJ zT|L|PQLU|08D6n6E0jVk+NLG|S|kEQU)!VLgtI%PpL9T)%N}FFR_~Kqov78Mqq%pb zj%gsGS#DOEYxkSw?sB7*Q+L8kQ)sEjUGBVtfZbqpW#V59!Zs(fx|qqEa)n4^cVmm% zYrEuV{daruKsRVFB4{ zsqtort+-BS3R>?MoBKB)lk~kbQ43INFtWB^6UPF^_M?n>BgnMJ1zL?ik}0&45sDT= zD?MHSCyx{zmCjMa<4`!5u)86TVrqPbEi)7&gv&;;k!C!%trxjN|HEEiy8q1r!&l7; z;^|q%15SZjGaecncdg>6x}C4zp4D3Q%55k*YTCp=D|yHPS) z*k-RX>yC|b`ww@GW;M~f(eXzcgrC*s9UUs?RN*)qL=FQ<+a9C#RNvxEg=J@cK}Bc! zm+QO#KBrrl2F|LfUv^;GJXA(x)L42%$H})&w+J~NY^yGq4GhT-;^ef+jLw#eI*o{g zWn89>EFrT>_CcJJFf2}ejWfoI7Bogp6RGZ}W7z!Kj(QhM(fFB?{cs(3^ks8s^`mp}*hpD=`Xs zZwHQllY+XH{Je>*SGuU=tI54dRnu5Hk>&VTkpt46MT+UNwNGT_1MU@`K&l^(%5>IZ zlbBBWZxuVZjL}Cd{f#YuaG2lp<0O{Ja#kWwGCBDbEOfvHU&vA#jGmL(EXItxCbMCu z)L|LEVZ53C+)<9B|tjPl4I{HtGlFO(>x9?&@?lzXouI`qv#Pl~z(U1$4TWG_Pp23x z5Kd#UyhGRr;hRi6;&);6y*k{{8~{8bEcB9b>J)Ywn(mlU?YmRhk?e6}z*J19#;#B{ zqEqdb-mRVH3-y#x z&a!q>EmQ8M%_xsSj$m^=76fQ_iogOKMXR;UWuZ(^qA@b|g=mk{q--clgdqAxNqL3S zyXw$6Ccy*OSOgyjL6O9DbFGjktdOWS-wxVfN4m`pX|_Y2vO}Ik2$Fh=INK}&3qtdm z;6Qnqhe@YpuLeDzjbaU83-VlA?`s@ApGx|Ukk za_dTt0!rvm>pH}`4i9Z&oIX53!Xn0)X{}MFFYyQ;BZR>^d_#U)>W~t_%MqI&$F)Gt*dHXi>+&^buG89*bN|Xhg#Pm;#yS6hld^w&^H1S zacoTe6RR+KoPc@$m(2SU-TP3`%9>BHUbeU|jnJPQP$=7q7%(Favx%+u#8Is{DHgF% zu@w-qsh@YEOR?N~nP$hvnoY7;`1r2HOVLSA?BpThm14dsGHOr4@Zn{n$H{EDG3w9k zmGrGV^c2H^31*qmi-#424TE-Jg{aW@r;QIzW<#Sdz>3n|H3)Bu9J-66zM2W6?mW%H zWOPL{japV}RyHz6&|7?b86};G7LV?gR@q(~MJ<<%Q@t@Uhr`%8lEYMxIPDleXklnf z?9*_M+|)?cQ{^QoMPT#G7uji?nFtgvoaV%^)3XN3aGaqJS}`+=G;D2B*RxXvW#6vI;iZ zSbQprq%INMP-0rWvFTJ+7NVp2Zn~XeG(W}o;Z)W~6|)y&c@`-9GO^||w6Bt9M)^#! zZoA$XcN#190~VHz>c7M3z2Y>c@cP@E9zKnoE*rULvPhn9Qkq}QNcS@?`*7;H#?5as ztTv{c$@&Fa?u4Y3urcRMc2t-9sA)kFUTR*-Q+pWiT*AVvI}xvBg~o`pSb07j%BhB+ zhh~P$BYr5m6i!YpGOj#}9h->C?z31iCQ>abWB$el6v-qncw~?<`u41vN(*Ww?UOs1 zrYco}pJaz0W7k=%o6-0WmT9E^jScH&rVrWr)pX35;S(Vw9!bilB)S?W{f%V}p}w^H z623J_O;b}57c=6>pqd16LNAd1rKlKme7Tu-ee2>JW5eIr;>+40ShJnCW5y(|Tdz6U{znWt6 z4}L5bUS8bIc=!S~sUr&^lZ7Y$!Oq6yQs490-I*h4Pk1S17kpsoI?{Oee9WMYGxlPNlckM9{M3JotXq%V`}7*2La>M3eS3r<&4 zF9d=1C>`-DYbRR<*BCv#_-(JHD$$k*C48K+?l|l770=$hFTWMCIV{qN>ohI z|D}kCumD5_JmM)Wt~6o`8wr*&;wdMtJZQfluRXlfq9h=gZ$%MdtyfGDfi=pjSoSr| zb23yoTl98SAv^SXHezWmQo{Igfs-}NJVOGGD7@LBQk??YDcWf9-8Y(~rrZnbL2MCM zkd!uG6c>h%ov>x}xP)~LSUeiTFJZbz?^`cnuO+V4k6mil>LqN7as9toZ*>|H&h}~y znano9Lc7qISN_Fjd5Hh{GPW?c9!*OZX9B4UEx=C>Elx6mm$QpPx71T(i|j$&uD+Zd z*=p2@oRJQUyH0AZ>?L8k%*oeD(Xp)jgvvfN$+t!Sq1fn*Q_ ziIztVL3G+o7EPWONjGU3`)0Djf+=`3w|c6{YN{Gij>4hzFd^84XjDYmC`VZ?j-qpZ z2ag1)GFn_=KdDu%>2OK2TAS-p)u0j)M&7LwSW*=#HXR)zOWXl-2P{TW88&@0JE2Dy zgRLfWU}V>_+#*yUb0!l^R?=jdDI)5)z{VIy)UxhNg zM22>B!fuO0X^pB`tTG)#Ejw6NjxsKv#fG7{EFl|D%wqkzPeF=SaRq@!G|{eOy#vZC zFq_?4ZB_1&niQHQI+?th@^h)>5<-Jwu4)5|7?1U&#c&wHkv_vcg%;Upo6UMn!YGfL z9s+_TbT8072!*->iuWbH6DUT*h;2;0l4Xsy$UrAik3#rb zprq{+TeD5_D#y~e5FKw~rhvANx-{TRDKY0mF}}Z&RYV(KVWDfdOy98MGbn41N957! z+?5*bVhdaV@t{|JAb_Koh*Uj>$odyQZWB9z5F2Lz9vFrBX$pKnI1Ktfss3flRR5SaK6`(g)cDk> zWnI9=)ayq~JoSt3@IozapWjyc6JCs&|KVvFAId+Cs;>vF$Av`= z&JdRwS8gDx%a%u=OiPJEy_zo7FGmn=!!Vwb@#d9md#`nnNg3)0Mj`lm6`n@l_tR_d zZ@cQphE{3jXf`8)26f#l##?h(&-@)Sd4nY7O-{n2;-IhWq)E!>M($PY@IX6y6Oyvs zIPEG{RQv*5gIE`Qp?RtxiBx$30~yhyF^~9A-ZqwB#Uk1cQ8yH#jz~L5w1`0WZ)2W; z92GQMjn8lJ<`zO)cgl9eL`#O$ldfh(Lj`vxW9W^-RZ5?eA$lsmP(-v&76DbTiL(_V z5)C|*cH`u$SuI;(?7W&4X04D5gdV6Ds^CET0H3lk(yzg^-!^0FHLN;qudJ++^J#}i zFwBhe=doO4?KSK&w#ulO%g)2)j=AhJT;^TN8ri$Xi0fFN5jy&~tXu*qc!lUIJl$b^ z(XeZal9kOewrhxvhAak_D2F;4(dG+{>x3SFn;~(EE0^c|C=CNb>b+U2Z zJoYf#VHDrMCbKt;3vXck*+<6G8(1&)wz263c;?7?$V-TI~iL+Ab^GjI5j4D}$j1-H=2GAHYIpQ7=e5_|S~TLViiv$3r<1 zF-q!gz5{>X8Ts?sQJ5M!dp`RYYc<}Rk5y4W8JRlkj)Lm1vnhCrnwJ)x{R1U5Y5}_f zy8HM7_8>c8Ok0ShQ{NhM7qa!ZjJ<{3&1+@jvs>69cnllNpvOlIHXhC#I3fPYXUWFD z7O|eF9k(xHm-E@Ok$)>z%j`E!yOoWi$7Q!-gUo*8;gpg zlNrdSK#ZvZWiqE{jK087t?wd*ULhn?&4AoRyi_&AjHlZ1nk9;7EWDkK>h_kL z9|}#v1|+b_sNhiYROP=lKD!<6@o$?7?_jsEerCmn89)YTKvT8Dt*9MbPxM0k^JEv*sue}#8oW6(7{tzHC;`?4ioq`(o}h30YpA)73(`x z@YzKTsa?)NO5_|!3yaU0RbVKUT%#omoj{G%;zVJ5u!>zr30`n7n}d@3=3ch;3_&eT z%`t@+munTBZO9Ipq02duOgmNzfD0AZlHdBb?%KK6HhwQQ9C8zsHXnEY>6Vw`qA zi@@;Dxt~?V#zWiS#+w-X?t1UL662^wmQgZKHs?D;H;Z^sZtM_plQFxI^+p4;s*&Bz z^roo~z^1Xa#y=iphvV|#gP3YsYaDnGE%91o^g~$AwAPsY5S!k0m2d>o>MyO{x(~?J z#?FUXpX7yDHHWrGdDR%ThW&*tH11dft8kC8ZVeX7E;PPe!)|5|7<1O5WxL0CXsrnR zY%SbB+l)aEW2yc^6I9 zqt7~aFwoLZiXjeCu29>vnuwZ`L*Vw>W<#`Z_q(V)=xF?JpHE`-E8qi|>>X&5r2Z~vfi$$Ch3t#PM$d2T(Mlzp$Pc2TpObZZZcQtmf;Jq}BCukpvn z*;(vC{0H}FarOC+Lz>3D)XZ4Rn z2FR$i0RcYMoRx|J3T5(c7S5q-8w+>AaTmQPo<_Wg^|6h{zs#paFTxl!8r#jM?_WehjYjE9 zBIfv)Sk-`6A&4@$S^RFolnrVpX&88Ilxx%+HP6xiX6XOD#(gibV$#%rR)_b1*3*5x zY-?&aH6NP##Y;FhANe-%L^2#wbD_lRWMz>t@nv>WuC0~WOrW(xo_GtpZ5ZocW;IZ; z-Yx8ST%s))b}YPQD?0}d=WfM<%7w<}t!x20cBj0;dSxtt2LP=sZ5%_3cdN1B6*f2X zb_|KA*5D_I6tPoZ{S(hM#=Oe@O6Cq;B|psFzh7m405$(MR*lQJZR{}8di0@`FtzYc zt}<@g#!kX8WzRNN=379W(!AH$pAh%L*91E|UqdUq%}`&*D#caC`EOv8Q_bsaK#G+F zQCR*un^tB%r>W^PAOw>%tLZ0U{q1Dzy78&0qa_u#QF+)H{st?`ftw4RqHqw_lA3gj z7my$0rTq9C?4tfAWwgA1L>nJN+3X{Eg3v)Q9(WB3Y+^ibC@S){w3Qu!-0W$E_1|Xr z-$aLYfl>A*o0ckM%r*Grlsk>P-ekwH`lfwvBJb=jW7u}~1>0$q?_eLYZB1EkW2nVe z8xwc26LGm~7mH@BrekF*P(H|MKv`oP(#BTcU27YASiA$@C^|Li9A!<@?eDNNl3KrbL^p5zL$M!-rr>hO>Ad3veiv*wzKV& z#kF5SH&!=ge$9^Ir6P|=8G~}{eeuopzK>f)5Yyzk++|M3hd9TUgZq#Q~yQ$sANaC+~)H3DKroa4%AqsoV zC^*2L1?b%a7{Mm9%!JDMAzA~Jk%H#541foZPXERWF#85*#+xIwCBz$8%&zKV8f1pQbR0{8EYzXm? zNwfEG3XLI2iHMJ;I`phWBQe)g16nZ>_mi<xN_(du^hx&&wrcDta5^V#EA8uGyAHlT2n2U%1Yw+hoKN$h<+)`{RM}czSo4=4@ z*fe;gTqgZ0c1jbOB=g@ga_yP_#;=;45&KkLFj8PEg{YLth**J{QmM&NQOY5zG z_EGh;oq+~9xG1O?G*v95BdUdj2u)47{02Grl<*cPi<*us;8$>7ztMQ1kQedVjZJ$B zc{by98=F`UejP_unHT1N=MCG9Z^H1;wr)52M|gg?WjkgYXj8q0tZOq>`4Tug8n%;T zoP2BRwi{K| zZ#Opg-i<<$5 z%6P??ww*X`+;Vlc;yy{m9A~ncG&v0uw<;DTq(Ef-r1y8?JKYzg`OJ!GGb(_)cN!Ue z_<)?3Wz3C6$6*yi(DtIv*<~EthY#ybiO}K4grh{DcF3UWo18|9EKR~m1yID7jWvCE z7%O~U?}KB(=k796`-;c@eR)1YkLb$>Lzzy{9^~l}pGHcK&K7Ab6*4qN+d)C%9^NT%t*OSp z%X#lXLMy-lyc5t7s0OqP6D`O;j?+^y8(WGyQ*Y`h!HwIEU_U-4ikN072#^>M_Z*T1 zJwo0V1<*)9f$Am%hG}l9pDYr@PINPucvAggY=cHij1#Xk0B(N#T zrcE(U7{Fho8r!=9uU3m!!rY)%Pp#m~N=e`*zmyoT5m|#kQ6v|L9HMIl!NP154CIfN zw!TdUh4MzRL5@}jQ0$-?8(NOop#9@OewR~Fs5_Whq=E|me}!EQa23@R-gh4PAt5xB zASfcY4>2zg5)udrKY@hAAU_TPX=|Y&ZeBLYhL?Sh-3>ni^V+c;+UlrV>{DnwXMaD)9Fm9_B(g?y_bX(cINIqd+xdCo^$Ux=ic4B zZ=b+7I<7ZR?^IHC&6Udmeq{?Ap(W@qz`P}ziv<&RMSkR&a3gp>rxFK$m6>FPMRVoEv6So2J^QTd%^s} z#k9Z+rUJeIQwT31b1GXXmI47@0;T-bca_-CTkI9 zF{S;zmLBGT*|+=}&5tanof9Dsf9FNx4}+o?N>@k^hZz|+VTpPQ6SQ!(p5WhFK6bhCLS zZJKeBH^&g-;riT7JlbBDh7mpG&sS1au@{xGBaK28ESV6U=1MT-M7Q{fj z(m)$Hcui+s5 z9{HYJzS>jo)796g7hW^mp1}~KGO#9P&w*5M}_-xXE+Nb2#E#8$MttWoeHNBZ`#dETnW?Da)A9Lad z1ym;jVgiQ0pm0Dw){Mo^ae2HMH)O}Qck0iHch1Og;wRFpALXJQ23o-^0u!)^(y?( zA|D72@c7bBK07>M?3wY~Wy7wp!I`GhWb0X_@YB&C)F`ZfdUHE1%p-+wN|&T`gjmQ7sa4w2o*jW@8;} z$9k=Ht;e*&ttDEIzKgR+RPTw0TT1~trlmRCQPBmnXsnY{rDp7kC(B!@BQVJ}dSW{a zuH@|0xsE(=AKjijb00l+%a@&)?S@Ol9>IXvvo{*sSt`2B&aS-zpjf70u}|#F%M*$w z9EtVBb=$B}2`C}V4iWxB8Y@gkG+8Bby+Jo8JVMda>$sxL5W48-wIZ$=v&upxs_s5@ z-rj3QwsHHd;rXQ^0&QI}PgF4IH>JpI!|k;#;dYr0u9ZN;YNiFxR7(sOF{4ciE5r`n z#@l+e0{XZn%hehlgN-Mu5ThH5k0s=AvP3v8=CU5#pBb?-sw*9C(74~rDN$MbEzGY) z^$DX*Xu#T`%M`97W{YsQFs%fm%gVw`KChxAqc;y(s&C68dNdkVY`a@ZMV!e5whsM+ znVYOd8pBPxz^W>yCk7My*Qt{3mb^rYiO-#jd^X;|d*_i1=T>+uJ$ATCG0Z5fiqvJA zqi-ALT$WRHs~fu~*|LYem7C1|2Hdis-Pk4OYpX5JE0WFMq>6F$Mpg2GZ{vYcBD_@7 zvNSxAK`H~Bi#&u>?c-+wt_3_E`Rz!n0FOgH8)=_F6Y17nMTaK*FHuPQ&uHrtGLn6?Nt z+p$ht??F`T6mdhhqs|fp7za@?YKT~eXtT{|)YPqr5h_dZ`yvF_MVIb$i5@*J*irln zj(NY~h^XN>u;YYoiHh=t%*BNS@mRb!s&jY{OeS=zJ;e}&x^3&bRfDlu)X*(Qv5o3> zr;+0BltB~3MaNXabs4=jG&dsx*ET{khch9dZ``mUQ_ohGI>Tn9jJhLs8quggZX4~r z5s2M`0B`Tcu;`tJr>p1S97pGfg$UxqdRpv}HHT=%O)5&5+?AO^F;9*^OtTtHp0w&>Kf!OrAo&(azSyme3y-jR$SqewyC`zt(OdH=M$@CsGt;CJ--R}1<GJIBRCF*NEM0WOtEJ(0DCy%Upl6W^kbcO{ieosgzY;udNu*GpL-8}C z$QXBY4BT_0a1%jy47lg~CZ0#mxEDszVc%FA9EnS4jC^?{QU$^jKJFOG`QVt7I#NRC z0daCv-F)C)^>G7!1&&>Ouz-BL;APsW%IVi4hy2Pf%1>XT;&cb)qRyF7Z87eRF>r5= zfjc(}$3go17`O{Q&KL2Z6rbi~Fl;`Nrf&3*DE)Bel^W?yf)%iyX zb6mkE_&h%8b2}+74$(|`X^4uXd77rddX~uxL-?WKInYhbI}5ruk-lfj{|u28_-PvZ jGhmOJ^1;*8MuVO54`=8l>M~JW9jqUGJNf%F6wUr05UJ3g delta 52297 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 diff --git a/try/main.try.c b/try/main.try.c new file mode 100644 index 00000000..2cb3a4b3 --- /dev/null +++ b/try/main.try.c @@ -0,0 +1,39 @@ +#include "../test/test.h" + +#include +#include + +static WrenVM* vm = NULL; + +//This is a simple program that exposes wren to the browser +//for https://wren.io/try and runs scripts. + +static WrenVM* initVM() +{ + WrenConfiguration config; + wrenInitConfiguration(&config); + + config.resolveModuleFn = resolveModule; + config.loadModuleFn = readModule; + config.writeFn = vm_write; + config.errorFn = reportError; + + // Might be a more reasonable value, + // but since this is simple, keep it simple. + config.initialHeapSize = 1024 * 1024 * 100; + return wrenNewVM(&config); +} + +//The endpoint we call from the browser +int wren_compile(const char* input) { + WrenVM* vm = initVM(); + WrenInterpretResult result = wrenInterpret(vm, "compile", input); + wrenFreeVM(vm); + return (int)result; +} + +//Main not used, but required. We call wren_compile directly. +int main(int argc, const char* argv[]) { + return 0; +} + diff --git a/try/make.emscripten/Makefile b/try/make.emscripten/Makefile new file mode 100644 index 00000000..2bda9414 --- /dev/null +++ b/try/make.emscripten/Makefile @@ -0,0 +1,59 @@ +# Copied from projects/make and modified for emscripten +# To run, make sure emsdk is in your path (our sourced via their scripts) +# run `emmake make` + +ifndef config + config=release_32bit +endif + +ifndef verbose + SILENT = @ +endif + +ifeq ($(config),debug_32bit) + wren_config = debug_32bit + wren_try_config = debug_32bit + +else ifeq ($(config),release_32bit) + wren_config = release_32bit + wren_try_config = release_32bit + +else + $(error "invalid configuration $(config)") +endif + +PROJECTS := wren wren_try + +.PHONY: all clean help $(PROJECTS) + +all: $(PROJECTS) + +wren: +ifneq (,$(wren_config)) + @echo "==== Building wren ($(wren_config)) ====" + @${MAKE} --no-print-directory -C . -f wren.make config=$(wren_config) +endif + +wren_try: wren +ifneq (,$(wren_try_config)) + @echo "==== Building wren_try ($(wren_try_config)) ====" + @${MAKE} --no-print-directory -C . -f wren_try.make config=$(wren_try_config) +endif + +clean: + @${MAKE} --no-print-directory -C . -f wren.make clean + @${MAKE} --no-print-directory -C . -f wren_try.make clean + +help: + @echo "Usage: make [config=name] [target]" + @echo "" + @echo "CONFIGURATIONS:" + @echo " release_32bit" + @echo " debug_32bit" + @echo "" + @echo "TARGETS:" + @echo " all (default)" + @echo " clean" + @echo " wren" + @echo " wren_try" + @echo "" diff --git a/try/make.emscripten/wren.make b/try/make.emscripten/wren.make new file mode 100644 index 00000000..66bc3075 --- /dev/null +++ b/try/make.emscripten/wren.make @@ -0,0 +1,171 @@ +# Copied from projects/make and modified for emscripten + +DEFINES += -D WREN_OPT_RANDOM -D WREN_OPT_META +LDFLAGS += " -s WASM=1 -s FILESYSTEM=0" + +ifndef config + config=release_32bit +endif + +ifndef verbose + SILENT = @ +endif + +.PHONY: clean prebuild + +SHELLTYPE := posix +ifeq (.exe,$(findstring .exe,$(ComSpec))) + SHELLTYPE := msdos +endif + +# Configurations +# ############################################# + +RESCOMP = windres +INCLUDES += -I../../src/include -I../../src/vm -I../../src/optional +FORCE_INCLUDE += +ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) +ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) +LIBS += -lm +LDDEPS += +LINKCMD = $(AR) -rcs "$@" $(OBJECTS) +define PREBUILDCMDS +endef +define PRELINKCMDS +endef +define POSTBUILDCMDS +endef + +ifeq ($(config),release_32bit) +TARGETDIR = ../../lib +TARGET = $(TARGETDIR)/libwren.bc +OBJDIR = obj/32bit/Release/wren +DEFINES += -DNDEBUG +ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -O3 -std=c99 +ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -m32 -O3 +ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -m32 -s + +else ifeq ($(config),debug_32bit) +TARGETDIR = ../../lib +TARGET = $(TARGETDIR)/libwren_d.bc +OBJDIR = obj/32bit/Debug/wren +DEFINES += -DDEBUG +ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -g -std=c99 +ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -m32 -g +ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -m32 + +else + $(error "invalid configuration $(config)") +endif + +# Per File Configurations +# ############################################# + + +# File sets +# ############################################# + +OBJECTS := + +OBJECTS += $(OBJDIR)/wren_compiler.o +OBJECTS += $(OBJDIR)/wren_core.o +OBJECTS += $(OBJDIR)/wren_debug.o +OBJECTS += $(OBJDIR)/wren_opt_meta.o +OBJECTS += $(OBJDIR)/wren_opt_random.o +OBJECTS += $(OBJDIR)/wren_primitive.o +OBJECTS += $(OBJDIR)/wren_utils.o +OBJECTS += $(OBJDIR)/wren_value.o +OBJECTS += $(OBJDIR)/wren_vm.o + +# Rules +# ############################################# + +all: $(TARGET) + @: + +$(TARGET): $(OBJECTS) $(LDDEPS) | $(TARGETDIR) + $(PRELINKCMDS) + @echo Linking wren + $(SILENT) $(LINKCMD) + $(POSTBUILDCMDS) + +$(TARGETDIR): + @echo Creating $(TARGETDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) mkdir -p $(TARGETDIR) +else + $(SILENT) mkdir $(subst /,\\,$(TARGETDIR)) +endif + +$(OBJDIR): + @echo Creating $(OBJDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) mkdir -p $(OBJDIR) +else + $(SILENT) mkdir $(subst /,\\,$(OBJDIR)) +endif + +clean: + @echo Cleaning wren +ifeq (posix,$(SHELLTYPE)) + $(SILENT) rm -f $(TARGET) + $(SILENT) rm -rf $(OBJDIR) +else + $(SILENT) if exist $(subst /,\\,$(TARGET)) del $(subst /,\\,$(TARGET)) + $(SILENT) if exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR)) +endif + +prebuild: | $(OBJDIR) + $(PREBUILDCMDS) + +ifneq (,$(PCH)) +$(OBJECTS): $(GCH) | $(PCH_PLACEHOLDER) +$(GCH): $(PCH) | prebuild + @echo $(notdir $<) + $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<" +$(PCH_PLACEHOLDER): $(GCH) | $(OBJDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) touch "$@" +else + $(SILENT) echo $null >> "$@" +endif +else +$(OBJECTS): | prebuild +endif + + +# File Rules +# ############################################# + +$(OBJDIR)/wren_opt_meta.o: ../../src/optional/wren_opt_meta.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_opt_random.o: ../../src/optional/wren_opt_random.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_compiler.o: ../../src/vm/wren_compiler.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_core.o: ../../src/vm/wren_core.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_debug.o: ../../src/vm/wren_debug.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_primitive.o: ../../src/vm/wren_primitive.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_utils.o: ../../src/vm/wren_utils.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_value.o: ../../src/vm/wren_value.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/wren_vm.o: ../../src/vm/wren_vm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" + +-include $(OBJECTS:%.o=%.d) +ifneq (,$(PCH)) + -include $(PCH_PLACEHOLDER).d +endif \ No newline at end of file diff --git a/try/make.emscripten/wren_try.make b/try/make.emscripten/wren_try.make new file mode 100644 index 00000000..35e05990 --- /dev/null +++ b/try/make.emscripten/wren_try.make @@ -0,0 +1,147 @@ +# Copied from projects/make and modified for emscripten + +DEFINES += -D WREN_OPT_RANDOM -D WREN_OPT_META +LDFLAGS += -s WASM=1 -s FILESYSTEM=0 -s EXIT_RUNTIME=0 -s ENVIRONMENT='web' +LDFLAGS += -s EXPORTED_FUNCTIONS='["_main", "_wren_compile"]' +LDFLAGS += -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' + +ifndef config + config=release_32bit +endif + +ifndef verbose + SILENT = @ +endif + +.PHONY: clean prebuild + +SHELLTYPE := posix +ifeq (.exe,$(findstring .exe,$(ComSpec))) + SHELLTYPE := msdos +endif + +# Configurations +# ############################################# + +RESCOMP = windres +INCLUDES += -I../../src/include +FORCE_INCLUDE += +ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) +ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) +LINKCMD = $(CC) -o "$@.html" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS) +define PREBUILDCMDS +endef +define PRELINKCMDS +endef +define POSTBUILDCMDS +endef + +ifeq ($(config),release_32bit) +TARGETDIR = ../../bin +TARGET = $(TARGETDIR)/wren_try +OBJDIR = obj/32bit/Release/wren_try +DEFINES += -DNDEBUG +ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -O2 -std=c99 +ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -m32 -O2 +LIBS += ../../lib/libwren.bc -lm +LDDEPS += ../../lib/libwren.bc +ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -m32 -s + +else ifeq ($(config),debug_32bit) +TARGETDIR = ../../bin +TARGET = $(TARGETDIR)/wren_try_d +OBJDIR = obj/32bit/Debug/wren_try +DEFINES += -DDEBUG +ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -g -std=c99 +ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS) -m32 -g +LIBS += ../../lib/libwren_d.bc -lm +LDDEPS += ../../lib/libwren_d.bc +ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -m32 + +else + $(error "invalid configuration $(config)") +endif + +# Per File Configurations +# ############################################# + + +# File sets +# ############################################# + +OBJECTS := + + +OBJECTS += $(OBJDIR)/main.try.o +OBJECTS += $(OBJDIR)/test.o + +# Rules +# ############################################# + +all: $(TARGET) + @: + +$(TARGET): $(OBJECTS) $(LDDEPS) | $(TARGETDIR) + $(PRELINKCMDS) + @echo Linking wren_try + $(SILENT) $(LINKCMD) + $(POSTBUILDCMDS) + +$(TARGETDIR): + @echo Creating $(TARGETDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) mkdir -p $(TARGETDIR) +else + $(SILENT) mkdir $(subst /,\\,$(TARGETDIR)) +endif + +$(OBJDIR): + @echo Creating $(OBJDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) mkdir -p $(OBJDIR) +else + $(SILENT) mkdir $(subst /,\\,$(OBJDIR)) +endif + +clean: + @echo Cleaning wren_try +ifeq (posix,$(SHELLTYPE)) + $(SILENT) rm -f $(TARGET) + $(SILENT) rm -rf $(OBJDIR) +else + $(SILENT) if exist $(subst /,\\,$(TARGET)) del $(subst /,\\,$(TARGET)) + $(SILENT) if exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR)) +endif + +prebuild: | $(OBJDIR) + $(PREBUILDCMDS) + +ifneq (,$(PCH)) +$(OBJECTS): $(GCH) | $(PCH_PLACEHOLDER) +$(GCH): $(PCH) | prebuild + @echo $(notdir $<) + $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<" +$(PCH_PLACEHOLDER): $(GCH) | $(OBJDIR) +ifeq (posix,$(SHELLTYPE)) + $(SILENT) touch "$@" +else + $(SILENT) echo $null >> "$@" +endif +else +$(OBJECTS): | prebuild +endif + + +# File Rules +# ############################################# +$(OBJDIR)/main.try.o: ../main.try.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" +$(OBJDIR)/test.o: ../../test/test.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<" + +-include $(OBJECTS:%.o=%.d) +ifneq (,$(PCH)) + -include $(PCH_PLACEHOLDER).d +endif \ No newline at end of file diff --git a/try/readme.md b/try/readme.md new file mode 100644 index 00000000..242ccbab --- /dev/null +++ b/try/readme.md @@ -0,0 +1,30 @@ +# try wren implementation + +This is the code to build the https://wren.io/try wasm component. + +### How to build + +- Install emscripten sdk from https://emscripten.org/ +- Make the emsdk available to your terminal/PATH + - for example: + - source ~/dev/emsdk/emsdk_env.sh +- Run the emmake command to build + - emmake make + +That should be all. This builds a js + wasm file for the page. + +### How does the page work? + +The page is at `doc/site/try/template.html`. + +It loads `wren_try.js` which loads `wren_try.wasm`. +The page uses emscripten API to call the `wren_compile` C function, found in `main.try.c`. +The page hooks up printf/logging to the console for display. + +### Notes + +- The binaries land in bin/wren_try.wasm and bin/wren_try.js when building +- The default html output from emsripten is not used, doc/site/try/template.html is +- The wren_try.js and wren_try.wasm files are copied to doc/site/static +- The make project is a modified version of projects/make +- The code relies on code in test/ \ No newline at end of file