From 80955c6276b87195054ba0552c350c35c650a59c Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 14 Aug 2020 16:51:51 -0500 Subject: [PATCH] code cleanup and bug fixes --- core/alloc.onyx | 56 +++++++++++++ docs/plan | 12 ++- onyx | Bin 402888 -> 401792 bytes progs/stack_based.onyx | 44 ++++++---- src/onyxwasm.c | 182 +++++++++++++++-------------------------- 5 files changed, 157 insertions(+), 137 deletions(-) diff --git a/core/alloc.onyx b/core/alloc.onyx index fe975ed3..81a96dd2 100644 --- a/core/alloc.onyx +++ b/core/alloc.onyx @@ -162,3 +162,59 @@ heap_alloc_proc :: proc (data: rawptr, aa: AllocAction, size: u32, align: u32, o malloc :: proc (size: u32) -> rawptr do return alloc(^heap_allocator, size); mfree :: proc (ptr: rawptr) do free(^heap_allocator, ptr); mresize :: proc (ptr: rawptr, size: u32) -> rawptr do return resize(^heap_allocator, ptr, size); + + + +#private +ScratchState :: struct { + base_ptr : rawptr; + size : u32; + curr_ptr : rawptr; +} + +#private +scratch_alloc_proc :: proc (data: rawptr, aa: AllocAction, size: u32, align: u32, oldptr: rawptr) -> rawptr { + ss := cast(^ScratchState) data; + + if aa == AllocAction.Alloc { + retval := null; + rem := ss.size - cast(u32) ss.curr_ptr + cast(u32) ss.base_ptr; + + if size >= rem { + retval = ss.curr_ptr; + ss.curr_ptr = cast(rawptr) (cast(u32) ss.curr_ptr + size); + } else { + ss.curr_ptr = ss.base_ptr; + retval = ss.base_ptr; + } + + return retval; + } + + return null; +} + +scratch_state_init :: proc (use ss: ^ScratchState, buffer: rawptr, length: u32) { + base_ptr = buffer; + curr_ptr = buffer; + size = length; +} + +scratch_alloc_init :: proc (a: ^Allocator, ss: ^ScratchState) { + a.func = scratch_alloc_proc; + a.data = ss; +} + + +#private return_scratch_size :: 256 +#private return_scratch_buff : [return_scratch_size] u8 + +return_scratch_state : ScratchState; +return_scratch_alloc : Allocator; + +memory_init :: proc { + heap_init(); + + scratch_state_init(^return_scratch_state, return_scratch_buff, return_scratch_size); + scratch_alloc_init(^return_scratch_alloc, ^return_scratch_state); +} \ No newline at end of file diff --git a/docs/plan b/docs/plan index d56405af..d35ece7a 100644 --- a/docs/plan +++ b/docs/plan @@ -179,8 +179,6 @@ HOW: b := 5 a, b = b, a; - [ ] multiple return values - [ ] All code paths return correct value [ ] Add slices @@ -197,6 +195,16 @@ HOW: - Dynamic resizing? - They are just very hard to use at the moment + [ ] multiple return values + - THIS IS NOT GOING TO BE FUN. + - Wasm multi-value proposal is not finalized and nothing has implemented it yet + - This means other methods of returning multiple things would be needed: + - globals + - on the stack + + [ ] returning structs + - This will put forward a lot of the work that will be done for multiple return values + [ ] Type parameterized structs [ ] Array literals diff --git a/onyx b/onyx index 301d6b49f82c296dcde8f67fb7b90fe4a27bc3cb..9e1bc71ea4113c5886750394d5353ce4b709c02e 100755 GIT binary patch delta 58281 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

bt}&9gO`>r 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 J)jZp+|9{k4k{|#8 delta 60331 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
wNx6ad z+4O9Ew)iHwMcubp#@-@D6nef6Gu07jBbik=2&z z4~T`*O_f>oMeNmhRSXkZ=xCgn^=K0<%Q^==2E zX_CY4e2OGFY{;VwNe)XvJgy-{K_=woMMH8@K80F_=2J?NLk~`+I4XEyuzH}Nt>FawwBeIV3q0%cqP<4$k=$s{ZuBUis(w6jZvGM?u?bARdp- zQ$8~1JR9>G2M%7ox6bne4+kP)$)#-U zQ?k!BeM$ZjSiOW*dWJ8*Y>H%ao{=OP7RlV7lT~znINS9c`&YdPcHub=(sAL;IR~?- zYBQFKjtb~J}{H8v`b4WdsDqTl*25byjI#@S^!;l{STKyaQM#xA|URI`Lx zUcMkFsMFRE;ZxJimp7GQmtT{<{-STaAB;mq!IZ5dAcuw5T(tr##vDDHEzTwH=uaitd@FhF$`bPPQW7i+G~!O^A>XCz z>F=%wX6EPZm}!|y==VlC&)d?*k#1Fd?|H~Q=W|1}@L+B#okM4NSeQzi5L(yWa;q@y zjqmIhVf9_;AMtVQm1Pm}j%MeavM=188L7pKOfLV0;lk z+Z3K;V|atHC4fd1jHbz))RnjCCI@zJc@>-W_N`J^!;L^{wSK+W$q-u7 zwM8$3;ds1QCiO<;u*cv9huZO)(oJk#rQKz)xZ%d=BEF0$<^4_b@qSK!j-$qP0zj3zoSJ0k4Pj#xf~QA&!X z92WF^K*MBgOPA5r_T4O=;j}MtecdI0mS=ad%#5Hr3e%gdSY%CFjUH=d8BmkrJJzfA zuu-)rzCU)CEv`k+(?2`2UbX2hdUPubs7t-s=-RYB+fs*qMStJIIW6hex7nz=v^d?> zoXxFEYm`nxPyrhrjCIK7gNU&y-N~xSV_)P>cC#)mOPe)kN)I**on}pP3 zDfL81&0f#H$eMC29*~kcUl7%P;8`i&=K;-=-*Fwc{K2bPdI|Xl4eVBZ+L$)m!h#ym zN#2KXh55K8M&=wZEKW10o3dREXc#@&lw~!b!LD_-p!I>-NzGu)2jL1vT6tL zw7qTBp5U4LhgA!@W7Uq~>4GnKyu!2Ko>dF`)2f}u)B7*0_5sh*`&KRLfmQnv&!C4^ zjbvN3)p%+=vTF68ShXv_k$*$O$5w3N|A)Z;U*!3B-zH#7}W5%(%CR&EoFwqd!+eDk2u!4$e+GuZ0`)HK-3+@Ft zT}-oTMk>=o95t;m9?t(ieb#ws+Fg{di+aDXT1C0{sJpbSo>btUrXrd)%0<(hTxG=$ z?wWQ5PdhJ7t5;al9FYI{QxgS0=lwsWga4<3mkYrncvd@Wn&nbFoj^?+D`{G*%KyJT zrvFzOKY&i0x9dnU)!O@1{z@eii^&K&EK)`^$6Z*nS8V*&_ zwDJGTGYfhAG2_{4lN&j3bp@d(-k#zPPp^)xNo#`LiX8i0nr z<45xNbY$P5qqqW3I%*n!rgX@Ebl!iVE~n>l`WrktZPF9}rx=35`ty0^ybfOZ|Ba{d z{~h7HUi+ebZJ`}) zh`01gqA!W5@*WKJH=5?NS7IsbQ4g@Ma-RPDguPWy|8F>87hKbBP2>2v+_JC#&4Y~p zzXa_IPT$F%&7;Rn0ZVeVXw_g?zcg111+G|@s|^8u&2qIQpv&@HEgjeucn&ybN3Qk+ zIQi>b%^ly8Sq6*(eg}*LmfxAHjRB?s7XeQK_X3OU%GE9bLw4tCuYpDO%38Jcz-FOVEfcr|cn5e2XuylM z9AE%&QW&BqU~+krRU3drk8rD&2z&_K3_Mr?K@adXZXEss9OgmYy&@ z(AW!>^EDV~A6O2!sxK@DG{yCU>5v!%To0TL%mn)Mhv|UBfd)T=;imyG9kBI4tJVZ) z1r7lA9t6t)?*lgjOAdzRfYpY;a=;CfVY!l6j$grY!00Kk9Plx4Oi8SN7YxB7FzNvJ z0?l)++9lx4B&(JKtdNXJR|*!Ghe-!)n1Tv`t>>cx;2Yo~;L22#2liWt@|?dImIGc~ zf=O2z7G8!)2RynGJqO-fk2ttA)_W1=uQA(!-|fR}2S#S1VSkL(Nthhi`V>qK z+;|$36Ti`Opz9WDq5$`SnrmLE^ z--JY64^7JgdKcBSPr#eNl7U$F-UuIn7Q7)H01WWOTYKPKU^=j5kfvP#b_&(B9N?93 zP4f!E*hXktRp4B_0_Xy4hM;H~(7T$Ztp|>;scD(OY@q255^1%tft0~-z-wz-0PrC& z8kki_)A|74)YY_j;BLe+>w*5!r~nwzP}A-JV;iGCLwVpi9H;vL-?l(` z;NzAk53Je-<$;~!G?R7*iDzw5L0K$A#2Ep=8wdfSfodmI0Bi(|2Mz?T2d)KX0#5<& z0AB(PAsFM%C=a{_j0P6#g7UyYz=0ASOFh-rZt zi?D2gAAsk8;fwL}RudBU%ozJh@B>RQ_P`^+mcVDrFnNH-8O9D+c{LmcurKfzVCXtn z4wwQgQQ2UavH^+%k8MQHfj5BDfR7P>t_S|HPt#5Vdt1;jF#eFHdAL`>wunR*py4pa znr&Z7%i-sQmzUyRDJz-%y_E8wOnNM%{`hrMB@R7VTMo%=>@r%0Ok+zq^k#=RvlsiF z!*KQ}XKMg~Pc|Z+BG96ttNR?< z*u_z)LW&e}GGGrdL{Q8mc9)^%qKqsDRAYf0y0M1KQAKsUlLobh&E`;qZQ(G2o#Bwi z?sITw4l5wphlQI*5P;1IA^U9ss8&pnKGVhhN3_bW8tGyDP-!so zQ+9VHEMAg1uL4zrg#na?Pjc}FnEE*GcQ6=sJYmCD(b6PyLOO|!<ZX~@s{U-DNY-<`Ex1Er$aSPper8iz00 zHynDi%K+u!dt93znbIMiWnIaFa|*TPbT*isJj*dZ{LbPYD$OnnM9 zaW)vv>cjvL4?y^>qowE>1FO9bL-dZYZtE~a?b!5nv`m@b6a+8!eHxtKry?qxn_^`t z7AO<}q9nV!PAEjyQ~xrjj8+XloyxbWQax{G&4=_Y2P-qJMA4lf%Cf%ep>It#8%60E zXSQ`cl)2!{z6YXj_rWH8nZpL;ZgpiL8=ztp)*K`;v7wy1)055HfHH?Y*$$59JXwWp zv>3ay0qd;-d$a-7mtrm(A$rM+RoE!1ZN0g|4m%+_-D7wi~kZ?48}bN2aa%*rvR8Y{gS zxVI*&55)Itdu~RZt=M!9BiI@a-Pkb>CU%QMXO_#MIV-hAK)o&Kz;M==Q?6_#fLa=} zja#7UoyP3@EvWr?40`~?N^;nW>>P$FIbG^(43`igDPq48x8~5uK*>xCkB(R z#Q~lOvzSjh1Shgu91>Vp06j8{O-YB6e+_3VfutBa#B=Mj-vP>_kybW(4_5sEoR+SQ zV!qoU(v#KNPW_wS8;$U^z(o2^Or!wJtD{PV5)MNY{iR0Lt_Ym7ihRlLL5_Br#vFIhAXB$ln8a{%pVeK_Xser_*~ZSX zYK7rcK9j-yr)>WyWV#?$UxhXPnasjMHkmt+`PppMhPf1wDat$2%f%*S#DUIx13L`G z=-(UI?Hw@Z%Z<#+=^(r|_!`J|u%;Zp-pPh>eDFP605o|cW^YlT<1u+1FNt$rgCDJ0 zC;NP9#1>qLdrf|59E*7Wvb~IQA+L@;$Pc<`)%Z`7KI^1E2BN(f34YKFyNnBOoa^$0 zT8PogDq-tnI%J+a!kO;h7EN-r$y|U;j~qUtr5$sS_ISy5?4-Vq?l^EBe96x51ivcM zbzie*NVn*M^cQcf8vinGUc0h`J@pPwgUq6LR&6ju@?>Z~v?w>b)yV(t9qY7sZ<;d0|qlFVXcEDNFekf4M>AXrpk>6WI;QMby?r=o{P_89p$`xUb zyU~d;NPp+b%JVcoB#-oDt#?!3Lj0iowKsl(2&eAIPs@g4YymPH`H4BX7~9R$Uf9## z7h@NBx+>D^inC`t-2v$_C7A0Tq$eOf(uY;x=_N=z`mxqLy&vh$CD|yR{srkKrPuECW!N*G?tpZkVCK3P=?O@W4q+8|dI{2vLs@H{-jDQ% z@@y1O|H5U$*#e$^jr4;EwtFuvrt)d$g@bg}itHk26Q`?!Hb-e1qR;$M8Yb*3w(Aba z--!I0_W9%U^CuwxF!FJB%P-$6KYt1Gk0HO7ef|WIA0Zmp4}ohCz}YRog5LQR{DS=J zQ5vhmFfy+}{2j$y4^dx}7t{~Nd32tAK{{KM6g|Vo0^~>A=f@-{lOVzKJK$qC^5g9D z=@)tBCm^4{Bxq3}KSs|lWLN?Lr^;->VQh*BLXBVS2csU|3UsnBffi{?QAl(*3o@f2 zgE^kx-G&KDTbowzkUyxh#-4Ab-f943O5oz*pUUjoKFrv^4tFBi+3wv+{Hwr03U^^6^N|!FIbJ{Pjp*sl|HnbSBcJYqJ?VeFy37wb@#pHsAuI zWF2;#rvs4I>ag299gXzly3D#CdJaJPT3sPuC=u!A^)S%s7+j<~T(mvl7NW*{zetDuHAE(KDD-X&a1!Dki1nT2ZW}i>H>tkyO35Gxm2wW;4@ME4p z6XbuW&&S@^Gyv&}4K%G+0oks3vWdtaiTv&b@;l|_Z$^Il|5E-m@*n)qvp@OvanL)O%S@!W}YlSXWq1>?-`llnGd^LY9R(kmOW9XwqG*F^0av-3P1f%L-0 zlHU^PW=$l21k#C3SowpHnU8ei7}kQPcOpGCM#^76x=K?vkMo}({Y6u@;~;c!hbt=E zj9ujXD5O_3W6yXx4(T4T!gn~1L3&v%s{lXZxCrS=Em&)w-ivhEmTVMHUqbqI8#%{w zkdBUHyE)$-o~nNwyU5c~NZ*cQ&v-fx=@$6THKv5)7^K^@m1}4b((!FsYtG+`^pSRK z6i;75x?_7Wg&cE`p4Xo3=6v_E@X8(7MV^jA`r8id*_x$+Ud)JH1P2 z&UJG`TFe~aV05L1X_EK}L9n8eYZiO@6lz{&gPzeA_-6Ar&rlS<@qGB4Rsa;sp>+Z60q%}fQLY53 zx*H)us5{zSmqY8InHxEDC1fVOpz}#Ti}I4rASA>x>lGbIpq=H#Yg&gQBl0b+W-KK% zQHh68#a*ZZO6cOA#Y`V*1Uk0!Bi?>zv2!13S6RT7_}LWzr5C9GiME#_ZUsa@=_0#7 z(Rrw|R<5YCV=iqEYP+P)M@|r73gsiM=fyzMX zl`U38Wrt*eUnTWPQYDNcuYpl%ggR$QIAc`Wf-3GHnB5$d)}XdKi1yAnD11WrI4Z4W zv%N`iyFP%@n@x07_^P|@C~65TB#PH7B#Ng=YL}#llgKOOq}ydMaj>fslwM~aC#5Fp zTpdNCNi4 zdk2UGe24__1su>AcO%Y+Nx%V~lgLgK#*w}dn_onE51%*3MQI24-39m21DT7f;zRaW z%DF0Tlq|N?a7QNo!qz+wC5YaLw(Ry$P8RYw(!gLK{UL#fmZl8}&tmaD${YH=3Y+Y! z41|BU<*TgrINu0TCuy-xHMmrla7W8LKSiPBs%1ebB@~XwVkxccrevUHP@rPvUbEB{ zg?r6UWtA#hjc@(DX;vSntprd~5#|Wi2Y#bg5p)3{?shlI&aVwy^A(p-s6yeX|8VDC3<-zRv7lzSY-e#TD!S2gMxeL3!&1lUkFR| zX{j`lHXBDAMD4}-F5v`fw*oAlWjWDONrPIfZCgGywq@f_Hbc2b?S*osI^-)S)*SZB zKRO8IYIT&#b?+#Zo7hPxm(@wRA$CY7`yCR*V1!QCAuSg>V_9M*yy+rlLTpzo70dwd z?#eQ*|IVI5|8qTs8~Z4!;=Po4vK#I;H&#M)1C*$?L>4>V%jTb*JPL?_(nTut*5`xn zpJgqebdk-y^;$4VM2DpaC|$&>kC-y8`iL2@x{pxzU?08e0R_r|(#uuot5>c2FIhDx zU1V)vrKarWD4QRWBA|4USAB(3^X(^^t=>;KwTqJayPt4s3;T<_ulwsN=}t{n21>6i zaDdIJIl-xQ!>wpZ?$n&%)L!BKv?OhWi!RJ$s8g) zO6Q@9jKdre!r9_5i+QLbLb$cV#bmlN+%}mC245A}sS!#zhW^WHM=W{JG; zSt8FQsa2ACE~&x^wjG-2i$|&pN>{gaf>_ow6GUZe5)>Ywo|n`E6bI#!DDuJ*1r;Z$ z5t1?|3J-ftg3oN>r-#oL%-yrag3O&Qiu=qFdXAhUm`CRbX4V{Gp2~A=PLb$~Rq6>! z*E4OdZh3vNN)b@H2uTutpmvg|x>J%+ce( z?G%I;?Cm1VaSs-frko^4EZJ#F5)Tu`nw8^(OtwTVRp#(8!LnQ|>eef4VFF*&dYG_i z1rHOJtrSs0`ISmJzFo9it#A1OZ0l;}mVU<41BbLV!t#&T$QACgR<7`J>%&P(+p)RIkNIbYf&mhC{V z_N{PCKS=8Sx4LV`LCLN-D7|=v1G=*-M;z=#K zUW;>8SxM1EOOK0)d)zsbgq7tr)3mtY*_KI{l&u8q=O4mKvnyBNo2{90#3jQlwN$#UwR9OK=NlKKMm?4{`bWSz;Vu-jl8eaLeFug^Dd<4e|KM4xYPsL z<^!QYs-(6*u#491szpJISGE?vJ(NNi!^*F*4gh5MGJ2piV%KfwxAAVi`LyA z2`b_dX21VIcn;+&(9@4SL1o26@n^)DOO!A;I#olZZnasd zH;S*gw;%{e^a4%ah`W=$EY$Hnz{Q!J^(+bcmD^J)F@ML;9gw_o}wjrmb>SCUh{XftDqd}U8jWz*9Y(#O?xsG8E^~Ck^bB)JF zOT&#g=`8);$S;@M6QeljT%ksB1Yc(~+9D$StldMj?8Lb0&z3V_lJTvm`n=g+-m&g^m0Qv2GDTbt$5^;8~zJ zD82Z_JP`y&b}fL?MVh$iN+2+@69J`*?9UTHU}Pr(N*4)s)oVduWG4bj7g>@gg22d5 z1e7jfbkl1=U}Pr(N*9@sCxXDpP6U)L@>iY+0wX&SP`XG5cfBF_L^}~sy2$A~5d=nd zBA|4Usvbrjp>+2U!!cP>YbAA9QgtW9!N*IYther5nf^!k>=UlF_3qHmW(`vX-)!VfRUf($w ziYkEic)TEp_nX&nL97;2+`w_J0uNQlSO;v?$8|HlW~x5Gg|I=bT@AiUorX`UowG~owr>QmI}rWQhV?&@w- zj@lEY>Z<4PSx;>aH(y_E1|=G(ZP0wQIvVl~ z)sraONDV@|vAPQBChAIbAVw`#1>eP1OF#)zGc^kZV%5L!*<9U>s#~a$$o@i2gfUyH zi}2Y>&4AHbt0(Z;Ms1skQLgS&hMG z7qt2o5o4)EC^thk89i0B^ z2=sM;It%H6>U5|wNL`C22dnp>^bmC!K8LFOk8}-FUC^`P>Kmj-s6V34k!lt`N2wQJ zr_t)~_#C5F#phVnR1Koz)Nv3UuUN$K)RfAA=n%V%L(^Ue_3^f3KHK~)JXuMhr@-x+@_?)FCqp<|_2CS8+rlaQBY9H8j zj=IJK)?9T5K9kgEXeL?xfX{jAA@nRo?FkdjSARkSsVe`C!~(S^R9vV|L3NANwrD0z zT>v{RRxjYwtgb`u5_K#jm#SOP<7H|MsKwOsnAFSFP{^!MEvR#)Iv8rLQd4W042IR} zCN!`{ZH{7V)iGLv zbhQgUx2s)I+YWUtEb+A(j#;%+t%uKD>R@zfxB3-6_oxk_&|bBDHO&8S)NvTOeQF{; zGt@{_x?gR8&u>*nG<-nafd(wQT(Rt)OtFEW{0- zOVBM_&{^!ZztO)L z7f}ln#Q_q*%V8FqE5)BAngW*E3@n5CGgKmKB&P+^55P2YSA&UrBCq8kCXQN`IP+-N;915OR0wh9zn4Y1025@@ zazyD0(Xi9Jd7_39_X-$#5$USs_1ODw^iGW=E)?fOch85IrfQU=qCCg*PE;n|yjYxP zIo@J5nb*bhDj&ic#Fsn1FFp708B>=Otqm&Pb7d_*ko8H?Xpl*s+j+qTl3L_BklhG0 z`k5lR(V7syb`VMTOyMFi*ycg)^$g-Ot10p81?r%u7iPBFjQ9-zl_|~`YAo>^2I`#W zI&Qt@#E-Xo$@4hZsim}Rmgi(X#;qiE({l*#XKP8_@%*I&roY-ol7D$x_~eX}RJP}R z-e6lvJ@MSj6>TS}9M4z0qwOX2+A|A_OYKNh-u%1r_1OBACy!uQ!C48I zEkz@aCN*C3!#~oHG*ywBOqE_3Ef=b#!Q-v4!J}dHK_Mr+TZM`Yt zF3;(zy7j>ci>5{65Hkj~R_qG@sZ>#m@b&oY7N1bq9b~fxvU(a?sL&7ZV!&-V~b1?j5Dg5RIyBzw9Tf7KD<*k^ID783Y#l+bb9XSN#2>QIce?2hl}-SPdrJAS&dJ8ix3|ExDbxNUn-61wxPPQo<;lXVb zsygtgEYvkre9Bo4QrW6Eq?Tp!l>Lq?D@r-2L9&!?dk3{jp6v-Az(QO%^dAE&P3^8L zx6`Jahn;S-Y;6tDb?e5h=Bheymn(Ivd=KkM+3)P~I7=$jJa0~P!ca=R_B)s7deOAl z3cQ9rpxQ)`8;Rv$w}FTR!s$wtrpB6X~oXN(bZ;3DLd8sz-h3K``5*$Npdn^DsA zDK*krUyf3bF}i?0rN&A{!~%KyD+>rUdXFtO#3%S^rJJ)0_dZ-E zVlDR*-JDBu1|PnA(V%-cyYPDGGcObF2k=d5RKWj{ z)$`FmIYJT6m84y=XUO>(;oL;p<<1N_Q6hCSz)-@4MadBo9TGmQiZ1bKhMdAx^&v_! zMJ$SjCN)gDNTR7y=oP6)Cf5c3gdJ<<+p&!;f40mvNIOD614BuJZxv<)Lz;0p?_9+b z+)6k-ax2CDEL-6JSt$QUR-0;KqmeyU^&ab|`4r zUD+p2pY1TuoeD0Xmt0^ZZ&}}BUODA&G1qL3f0C9mMBIpm=s!*lJlGIhOwo%{y?(lc z@Qfdvobx@Sq2gD3zWplu<9~r&4#$%FRo6Y;w&Z@*b;n8&KIodR`+nQh`u#KAZ|VYj zZ7%y(zUqdG2l+}lA{*U(UTQg30*0Ioi!iFDBTlw;uPbrH$+qrwC64QD=t`XYOo`LF zfUd+DdnIyt1hY{p@kac#5QmUFB}`}FD&Z{n(D)4g(WXkj3@bleN zY+{p~>J-?-Cd+1MS`Rp$Q3hqIPIrk|kKQZOWUG9utazOJ^ntR`KwF#NqfNH0g3*20 zK&R5uzqYJ8vhSB%u$-iAEe~|6p|>nLI4Hj*F_i~7c}jV%3BtI+b}ip;h?aZGmebC# zz=|+>Pp4q+&UnxGkq6oM-!?eiME10&J_dT2(Cf1XdwtemZ@UJE@`ce_Hkf@{nsGc`;-(@_ch>2eip$eDJ?MJS)38**W5JNnxq7tVwt*5D znov{wVOT;fnwpOAv8r389f=#nt9{6wEjnJF(D4~ybhBw6DyIPo2SAMu7vm3WPteWT zp=}z65s)6UVH!$X)9(p#Gb57*WifeQLejw5y$0zof*CYyfL}DeO!#~vJ#YCFWuW*r z=)_tR#jxsP$mx&V<$I{z{1wd66R$cWTK+#;1z+XzAE+Nl2?@n`Xyt~wflcQq%^EiZ zGiYgX`m;LMTdcV1AGOolYzS7s9pnDv4alk3wW`k9WP033xn@ISsS}lxI1F^FJ zzFZ@zr`b9vviIYCKCj z&?u*^0qc?=&w^0cTJagdEK(drhl@UrkQ2KF)81{=d0vIi^q37J5_)$FR!HrtV20g- zU1+ZX9Y)1+sy*F;r_-)ACgVm`2n89poM75Hk86g1PgK8rSg0N01Un@hLErL0-{xScfN;qx-Gr!a@(V6 zK*dK)A9s7vmOjt@R#3&>>GDpJRsUGL{C2F2txsLvXM%ZMu0faa7np^uEsF!pJ$9i; z`%?=uwgSx)Bx4Ek%jH6~>UYiWG#Qn1mRmD}mEJkOoHoy_%Uzi>VUC-M=51Z;rvHjX8krR{ zH)!F_^vk#ftxBtSl~$43ni0EeqsDI#9bY6e?k3`^peXCPZ@$)ZwVSP{s>m1}{eaGR zP`kt^-$W|i@A8LQtA79d*hHatN?51&1?!xY z+ble?m}q{T4@B4Ni2FD`qYkxYk?o)@=UbxK2_Nn4jiJ( zo%&E-OAc{+YWkX}dA}B#t6!*Z6ERwzr7cD?(JmP2r^jMuekW;w5HIq{qIEi7EYWoK z_Vb%gfnRL#jqy&Cv9>C3yXh_iQ?;p7w+h`%A`e@;zt+yH1XYpS5>pSqL4Fq$T~i~EBH zonysW)JcG1I5_dL_$R8N8E&E8Mi^FplqNEs%iVmSelQv|VXAslhiJHF&fQvtm$kZR z(0jmI_f9}Va2zVvX~6)HV3<&mPrgA~4{-y^S*+=c9k0b&E_d2gbE@)b>)|WM?0%;f z_@S6?HcUL-7YOvpmI83`7%{cetVt+8K!~1KvMh7I$>bJE$0UIBC=nt@_8& zh0MI;WU_M;WN-Oo*dmA?6tY(0-}1H8@$Pa8>AQnf{|xu(uQ!1omeU;WMmuiqn5Sv^ zatx?oHk=M`={j(uEk&|=zIF}(;+**vF4+zM4SI0SeC?c@Y%UQDN%Of=9|dM%Ypvg@ zpT@VK;JP(2cTg#YbKR}oYV%%|RgXn_HPkjn0985Xk{O1z%13REcN-6k9`x7RGJ~qY zSI?gos?5{utau9TH*K;r#l!QB*gMx~1J4zoJWp(=(}v8Gc3wF(YT9o3f~;w@bLm@$ zRsZ1pa$dS_u?y+z4LS@X_RS*A;6o@t&jHfBpc}~F^~F6tztD)yyI#|s<7&Elu$5dn z;j+mX@6`6w?CdztSoYfay7kl;)!RWhf~h8;&e|<6fX}$PG35^@P#yy1d{CBWwgSl? zcFUQCs79Vd;xc#~G+f3y}xInT9%PI26yY{6^q(di>RHwn?J#JiMS(99{klzC(L zh>g2NldTaly6vHI0+em-6l!Jn&(~$r#*qz2IP6!+bxdbAF2dpkilYu%ot#3g`7X)V zCy_6D$x=-plWe*J?c$uWE5s$CYfBG@3*V~Wjm|c9uyt0LgFi+&QbQg> zwyT%xY<~Bd1%}$qQ=B~QWoneYSEzR&(!0btWeF8q{dO^WhWfb&K6rJfI&_h3u9~aa z@m)4h)NDBSOur=ptvg3dueh56K)1xT@rt(Pnt^VKn5uI(H7(H+Acm#x#^2COf&oY9f zT-9)zUG%Zd%dXT6`1T?Ynhnn>IHzFoo$TAD=wyC91vo_oe|s9 z*SBXt`7Wv<{e9)NeY-#$wra#a3~yu^t4tVHIoAljg1@VVQ}&j&+42gl@*w?!%8f(e zf8Eyuf3nU1By{HP1_0e?Q3qLN08Uo9)p3=%>uTexTvz@Vxvi}o(MzQ9v1dh>HdOxf ztb{6+msJ^7)$s}xHO0y3k@#VPF2@OsDwFnL?AT$Mv+J}D=ND*g&4#@R9e_Sr2LQAV15qcg z6b?jxe0KA^C9|6W$GF9tqMCXmtetc7?^h#{2Pf%Fe%!GGefh)6GhnSX+zQiF5Cvbpxfbd3 zEnZ0n>id+JkqYDeiZP)4yf|f;Z1G7GOnkYfq>P}xBI9^pv7m|c6@=lwBFzZ?1|6zi zuSE7j%WQR~HmQw%p|4l~Qr%SmO%^4(W~9j=>YA5l!G6lm*N@XDDRyYFZ%|!1oxZS2 zE$N8I8&!v?XUMh84uiF*qwqLAX2Z^eM4+`qS&Ja8B@U}ND%pt`8X0jnv@HXMq!9dt zfcZZ?HCw*oj@ed?^bG-87tInGRRPdNvmjpabVM^Ca#|s4OI{4f{1#tGu9$#*(U$`e z>dATbPjl7yD*>@>Sh^>6>#sI@%Md>3#=7K5C=@WUr^5SEyI@5D^(|3wh2Damdy>wX3a*F z$haiq^8#UAlvLt(3!QJ`w?K08cNW8ZcdgzD&(%na_y*xdV=21>^w!U>^DEH4@cA4Ny(99IG}HbY3e4V5kqkxbZDz83q7Nr+F`C1=W_}J_)w6c||$GZ?F9VXOcI+nr zw4cz~aX$orcGDv1r6WmhS_$@HYrF3zRyQjk-wfcDyNaP$p|3x@LVk-|r}z-Kg&kMq z1F!?ajw|*7@CrMw#0U6JAkplEd?QF!Ry|Knc-u4wm+HDQ11BlyF&kQ)>pKDH2ddEj zQOnX!03=aa-lsVh0D7qP`}3V8r8eVK2Q^EcTLUtHryiEVa%%|xs8nM>ls3|+h&>`wcweoZ6y#*tX zuP6H$!ddTt4i93zjjG?P;ml`E^DX-9g-5n^P#p2=6XgLsRm#K;BGObEa8L#J8c0j8 zp~u#3x-94uY}JuU2v}>HM^4cKj_(+b8|#-h&`E;`1jHeM7Eu*+^*eFUJ3(mGdKB?x z3@C3;4fI}pIF|Ot%5SIz;69V1r>y#?_cIEhbZv|sT${Lz~6j}&=%(uX!+fR?1zL!fA=lISK60_ z>f}-D8lTU2e4Y53Dm|_yrj_=QJk9ieVQMy9O-4U>o`#I6ebI8KcpVwd5E}X z5@BySU;U=BMMHs|rfP>GZ^?KycBp+?y8$BE=vqmofa?TF>53e!^Z@-rNnAT#?HFoD z&CAq}L+uWoo`9LBu>*f=r)RZOjqVr1an|dZw9T_TOXnPzU=W(1&K_pB@N#MV+mo$V zNK+A9a=*G^nB6>Z>IAi6m>q3;=>&+U)lR?+bfPYpz6ayYX==itj!K`}v9%@(@P$OTK57ThQ5nCMAa{c!UL-F?tO*8d$ z{JpAxX=X!!rJ8Zxa(p7QR_Cvwyw6}G(^^|Ve>)+|z_y?DXdz>YDEDK{`R~s7jAO-L zD4_(t)I-OB>Gs9|6r{gH`@lTIP6=ItM0hu}u~Sn`G9>&E)Uh*iS`!uSOdO6_3#TH~ zGXPXi&^eW9kATbw&jSaiI*mqwP$L|HgWy!$clHsOIV*BO*{1enV3PD%{Pj6k8T;lo5WEQ5N5 zns6yR>YSTH3yA^Y-!MmW#&V)Ad^^cGFDFE(so}o{H=a4do=I`p&z)`4ejHp#*rayqZ-lJe@cnap4-Xr)wVB`^%+1a$N1wMZP@RFsgnZBR0 zyhP%>7ol~)tAHW4cRwH@ZxOObj6BL=_A;#}DSP>GN7R~~(wn)+KNkEAZ%RMnavJau zNn~a}(>j7Yd48}km0r#uHGGuawt5gT9c)_FV37YAvWiYa%=Bf%^B6#ex0E#Z)}KuhKmY|8lQZ*lgfIe($xX#Zo*!U*H+bbdpdxj4^ZpO?L55YP z^&`O&LB|u(E^}x12MR&QLr@e(E_43Q44)0o8M&CE8s>LqCZ)1-3)RdzM3qo>^Lx`O zMDCoCq=6X;WNc3GLOinYQk&{*x<{>Ov`x1K3>g>oN8g~rdxGcLo(qm1U3fVB|$ayF^YAs`XeOxZ!=M>W4p zB#Efz{$bx_L^W$Q{itR_W#sx%&4ZDmsAl5kh73v-HC{T#=BVbeV^RH^HQqMX?xin= zYtlB{9fWpxnfl~B4ukA6&gP5ZMvp_Wp`V|9zD+kceQ>_5Z*WTeB}3<+uwo=KQ>la4 z)%eDEL}udhfgdN>bUR%C3+&(N-hti|?NxLq*oTujy7I_mTVDW|ir``9lgoUNVn(^U zRNpBaO8oW|&hX6?4khk2l~dX5!|J6PO|8GpoNu!c}VU6TkI|0o+9>N;Q zPoGqVp5V(apz%0_)#DIWk3(2J4q^2;gw^8^R*yqiJq}^@IE2;X5LQozuzDQA>Tw9G z$04j9hp>7a!s>Adt7p|9gw^8^R*yqiJq}^@IE2;X5LS;vSUnD5^*Dsp;}BMlLs&fy zVf8qK)#DIWZ#{>wdK|*)aR{sTSx1DhdK|*)aR{r&A*>#UuzF8GiBmleVf8qK)#DIW zk3(2J4q^2;gw^8^R&NKm_4YV~)#DIWZ%r*iSUnD5^>hfU$04j9hp>7a!s>AdtH&X% z9*3}c9Kz~7*8?G}9*3}c9Kz~x2&=~-tR9E3dK|*)aR{r|EoK;_JPu*?dSkLa+T##b zk3(2J9m49xq0xCBhp>7a!s>AdtH&X%-u1Bf0*^yjJq}^@t^uP-9*3}c9Kz~x2&=~- ztR9E3dK|*)aR{sTI{07W?ZW?;dK|*)aR{r&A*`MbVf8qK)#DIWk3(2J4q^4mApT0P z68~T2aR{q72IA*>9Kz~x2&=~-tR9E3dK|*)aR{r&A*>#UuzDQA>Tw9G$04j9hp>7& zgw^8^R_`Fh+~EC&|8Mj-gw^8^R*yqiJq}^@IE2;X5LS;vSUnD5^*Dsp;}BMlLs-50 zVeu-j3)EE}hp>7a!s>AdtH&X%o(^I4IE2;X5LS;vSUnD5^*Dsp;}BMlLs-31w9ETE z4q^2;gw;C}li&>=hp>7a!s>AdtH&X%9*3}c9Kz~x2&=~-tR9E3dOC#Fn}vb%pB{&> zdK|*)aR{r&A*>#UuzDQA>Tw9G$04j9hp>7a!s>AdtH&X%9*3}c9Kz~d1Yhp(Zh?x= zdmO^*mBK3$!W#L)D#ou}U2cz!QwVG1duus*l@N!pMh<8EiA0!oks?3jQ+K0hU6CL2 zUn43V!W#L>`hZdtjanZ0C1Z3;kkPTK$ge!^8R6R?FY;TM5O$cNS|h)6B0Ee`t&w9q zp|HxrZPk=3?80WmDDsz;0`eRVYmFeR^--j9*Q>j)u$#4@6>h{f3kg<<0hqMRBgzQk zSudw-Pox+1=VCALRYUQ*x!*UBZAP?P;016dngfvuF?pj zXHZCG>hXqVun~l=(u6o<UEXfJWjv}Cb>C)wSR%+ zm=VON(#I^Gsznf^s^={fqZ&bs>RCK*`3ikd1Tm_Vs?42D+9F1kvJK0n7}W@3R0&s? zOEIbu#Hbzu?y6jhQH>x*^=G6OSHzwv^9*ixfHk>LEvgSQX6wAa5aL!)oi3T=ThKm1c9psNNvfbz|{x>SBsI_ z&U4oY0#{oh^-AvDXT*U-iGnXP)BZyojSMJKC$khlI+LZb@mm*gqh+L)A?%elD zH3Y6wYF{n|u0{~JN~!(16u25e;3}oQ&85KA2m)6rbtsntS0e~qrPNQk2wY7yB8Xfi z@xPY$RQvvBUl^xCh~UDWGf^THfAqn8JU#pS02+X``2b#cGG}7usw-TeS^6B9;`PT2 z-SD=8+Vt#!G>5l{2)|1;6zI^eSR+&hN;1AjB1|*zK&dX(aBrIMx5y$U8Lcx;$Ko*1 zlGU@#qU_cm6KN|+pOPJZ0%8Jf3W!Z!_&UnkmJ`L{VaOV2mr07YLHnV%MN$Lptp%XY z%*TpVRGygLwH=gw3pot0l$I9WgMC5i4T1Vr+#3kKwl|<3&0H+X7r59mk)z{COv>{D zflD&zM=!(O2yE3@erKtm>6a0Gu?q;lXYt1py{HV~iHrbBD9^ZV$cH;u z1dDUfq!W!*|Hs^_c4XyhvtS50wEocC*d|hKt(nK{>uuah5y>!OQbUq{2Q+@k)JFjdPN)UJL=aaZ^x@(%BOig4q%ql15s?9vRByf0; zI%A$)S-XjfWRU6o0>9A-b)(C@1bHj%qY9lp16@5mX2WeAP=>7ATa~0IeLd~ENj)>q zJ|%FlLVY~XZV|}rsLc6xi_UbAG4O5{eWs#g>_&A-rDo@fHWiPNt3Jr*%1N8%M)kC) z8Z#eTVOK}h-{#vztyUAoryY=zo3->!=NL`pxML+H63 zw4^=>ySrBSia*_1E53Pt*F~yD+^$U9Lq)hQofN&Py&504I|V-Kt5(JBwt2P5rWd!G9Y% z`fAK&|6#|qYa@xDdp0#3D%aF@nmW_>5?#d?Sng0Grw9b2%VKI9=cZK&cd+EgZ1@*( z2fG5GW18PoqeljHJRO=*1>M#{9a~_xjH6xy)L+-?Me(j&t2>;fD>Y(3xh+>non9NS zE^DcE+A4;0yT}Oia%gQ#`_Z^p=1lnB+!AsRmTHQf37sCSM1?EGe?S*f0wxct{$1#3 zhk>40Uo;YPYsjHhI9ut4Xt?Tm6`W(<9de&8){JAKf!W|iiLv@-p&hNJFFEGsP;=Tx zpdIRH=`a9Rg)-*=&|R`p?V-nPn544~zsBxZwuLC`L(V)Hv$sfdAEOCDxkXdn2g>56 zq~d~*+g>_}#zf_6j}Z>4{CJJsyLwAkP%Q~%)0P44y4Spc9?F~^$|K!=ljzQ9BI{i` z>$Gd_O0%!J<68TaVTVw>=ERWum=IIHOpn>{788>%Cx)79Ursf8?f`*V7jpYI)7sN! zrKYdNqyTz_7um($G}68+AvXqm=iTV3;<3@EIufCdoY-g^1$p8KKgMQ} zoIm|^-_8{2hhJI|eswX6_*tQFCGuPK+v2rx5||Y-UujB4c=#7>N1pm9=#Y#*a#ZYk zyMHF@^{KDd)YzNq#_R2(B4+nxkl6+5&oQDiDentGt|x7B)GLX+FQ1sVXtAI7?Gy6$ z8;HEOYPp*|b>3ooz^N>EnV)xj%%DYnQkkp|nvZ6w&lcNF zYgoZMeIbLix!Z&0@7cP{Vok_l8-0fjHlkyxDJ|3%V4Jk_5|macw81+)1^ui!TjOdn z)on}c9Bgf@Ut)I*yq2l{y#xiCK}~#c&^;Pib%R|UWBmsQJL&pVQ`LZB2k2gurcZ9w z`59V~5~+^x?9?0V!jv*9s9r(0E~0J)qh8FYm(OUJX4FeF!YL>1h?-#fL^Le=vJm}* zJP{2BX}@!6y23&A)6F;488^c7^Qf(L4)Rtg^&-)`$gZ~9u5Rh-h8yjcMO^dBPhfZ< zc`92I#naTAH`@JrF;P>WXngg1Y1$gd=BM)v!)zAB`a&yZL@y!x54l`F%2L(vo9sG| znH+XS_3_n*Qq|KqMIZl!>O&yN`>KdqMK||RA3)x8-S?VkF&N$WF&iSMp$+%w$>>&; zfDfv^(d1EGStepooE8L^Y%=6k*L_sDv`larnc(uOTdGFgZ0EAQJnl+^pBS4=Mc3#`13*95mkM{i>-H4^@Bu$&Lv=#HdS3wO=aNEq zyY8;AR%m*H{yNYHs(Ppyx1i2!B{_GyHCm5}Ml?w6mE5MuN8M&mYFUdqW&Y`~S=&vm;PHXZszDk3r=Qw$ zo82R_lB_+VNk757rbE3wHIhy4|JDi8G-)7!_to2d%pPigy*(hk1?l;@#+~t(>bcAw zlfI6ae4=4lf2sA$>`tw?9)Id&+O=3CSZjaRS{P9}m2bYUX;1re)pC1a`i~^;O|8S{ z$JD6hc5g^qv)t~GelD5$f=1cL)W4S7b?Il3b=x#-!yoFj6?Ug0y6MM!&XE~2W(7Zx z$DYtcZ~v~Au7I42iD;9C&H7z^k;u6Dgp6NN39r{gYkpH*S0dvGQt&2+8+`3=>eiKZ z=icemw_T@U_HS?$9&9G^V>WyW@l_O!3z81BeBthF9d-Qk9PdjPp(00BaFyMKX67}k z?Ba9^88R={xR$@FOIO*g2)AmLT@>f9YqK1#f_!u%T8b87Uf}S&?2TWv^wA0F2K23B zmt5d9Ti=_c*TtC0g${pLp;37fd1#`aMrYfC+%ryFbc^upMLcOXWj36hU^>oeu9;5N zO?{lxMt6?mtL`E1jdMCvgW_J9LIun*n(2@enKI9f37%toMTO@Wr*(qoDa3S)Q=MQs zk7~tmCqkbB^M6tAC_9IIwO`pC<3k8{hW5<1pS5SsB`ffl4K*0rwP()o1=huGpei}o z_r!P%JH(@(<}qG)jMFT@V?}~TzXXq}Eu>>Vr{%>oQ>IA`Gwpu@)9fqY+r^XLAaIE;&1+<(xijII&ahBB zx5O#Z>I~58lsIiQ=NesON}L`vxX@ZrSD6y$3@TkZuT|Aj6|b?27KN?FO3~mkvr|`%s6S==-XKr zTdYRjX_u$JLfz#`+o4^^%0uebJM9*2QpqJN?NX||B#DQaRd(cUC>^$ze4~e%*h}g^ zcaj2Bhpy2a?)+Yb?y_5)!yK-$OEiZ%&EZ-*G62m2N5B#s$P3rmVG>TAcS=i0tOHFG z^rwiMt+|Za!c@)shl6S%c#qB|?WWpAw5v!f8P@J1J93zL&+vKYk-gIsykjn@d5O)# zJ9W+6RbS@&V`A)^KI+(Ac2WBMly9UKdHq4v?ryt9CW{3?W6PRj3KmG{dQHUs(4wQ@J6%Jj>lgaCVi;G&^FSe?PJlKnDa&r{`>JK?!@KPw z?@u^{z|@?$MYmEZYwa%SQ>mXh#ZKov?C;djwRWqNuZcyj?QZ&3#VNgpYDk*xR(-2B zt+lHsEX9k_$ezSnc1x*7|lysQozDYqf<0tw^hlv{t(> z)E>CbE@{DP1FY5F7_Xw=l_b`*Y^Ae@v9aowb+B*AH=6%!X#=s2YTG)yFnt<%@Lv|& zx94khU>)qane2JVa_hcU`S;lUQyQtkK4rQ8JfJSR$F7dwtkbo=eeB|=t>gABBBx!g z?K}FV7W|a1)F_stXZiLC3C#wyfdG(!bn##n*B<~#3hmldbuHFhRpGsMSQi-3+VUl^ zTy?$I?%1v8el71FG4wu2i|wF3>SilVFZMRaW9Lv2-D0Kbx#*U7_2B(#?Y(wU^%s); zS>I2GDeIkn*2g95U4B+99Dm%ee!ACgmEN3M`W)@b&%RV`?z3B_w4eq!-EyaYsYcyL z6Xq|~y!)^?Z6ps(w%pP$)q2qNZ9-M*bnUTOUuX+9iwb5#|FeCM2}zKjrZFvinvU>S*3b8kI;m@q;a*y zdl8%WsW(8B$wbvwdreeVm9c6)`YV@gj%v!u`&7kxyG2K)j9M)clr;T~S{2`-oo_`L(S^eek(@7pNkx9Br*Koqqr>ho=1J1stmPgFjc<8|;4A zpBl5lE{}C2)QD6XyMNfLU3+{T@id|ky8cFGJmM5uDZsN`{~Dm4+F%!^4JV%r|SYIsotEypu6^}jvMV3X)$ul=?t2*SDjCw*U1BY7}R^Ox|Kjzk`kw;(J8%@ zz3RD*c24_gB=yvGdYqiv{lck8b>$;{^%IQ&vk2RndEke6|JrEpzdZOTmerQAQ)h8F zXN52U0>BDQ!vChb)x9b-)z8J4VCYuH)G^hGESyw#xzo&=@d`d|W)?fGLSsUcow6@Z zl>Bd}9NB`Qt;AA2Q|6SZcdl^Ss0C$C3$?kU6H>d&oP1R>$SJo%p)1tUGN-i#wv8iN zI`|2=$&EL(au!=@&R|yIVJFQE?NWv9oDsGg7@Mbdw{~7rg>9UU>hku^znT;ph2()ChMuWL@4^Q{kKw2%cE=2K@gLqY7F&G4*n#v&w=b z1xc4vJ#rgAj5dIgIAP zHSfb3rz&H5h$?vinW06~P@O8Qb*|3I!cROq`PPg&r|4lPyTZvC9cY=`xUSa0&$)*7 zHD>m4wwV2L#yZU&b}}lQ%+VpV=yRR4M?yd1`>yj}h)ig8EpV;>8`rq6uk)Je{$qaV z1MA(!$NM`qxdHTHKaX`@8{GKH15Ry*%G~NKY23Wkxi6z23tcKbV=#ZDhh{MJv>r;o zQeM#PDxKs5#rSjcQl0+CQbzwF=#_ud;5G8LuV(bW-78M>lnRSz}>F( z!TP;dqkZsy7WrWP{#>IUe_AJNpV9BmGHK}Y?DCm~of}_x!|6`HzODjqITZ!Q%`ySf zwEVwiWEvT(8V9}Q%uh21s8>I7&Ns)awjVo1@mDZV(32m+m}I0G$t+rhyAFLJS`S?FiVEydvcZvJUR04c7Z2{T5b?{a`5Y80#A;$-NEp9 znvr}P%=?ldIqd2yfhXTt@rS^ZZ%4=qYmX+!uyqhPhwqoe4SxLo8G=Z@v*04Y$#rYh z;ZK~V@$C}lP@p|%D9M%_Qn*>N?H2lcp?^u>ez0w-z(4lk^K=EOl$!CS@Rx}1xIrP` z^!y|l{2=Re4K`9zwBaX)s1vF{;2T$I&MUC~rKh#PlSB183H;<+vCz=^3nKaQf%5<- zNBQ>y_|wkW0PSM?iBj*LZ7YmG#(>(oGP&(@b#UaSA|g{-HwOn zB5~b*c#2C-=(8AW7$1rN|3>$HLcdq|d@Pq#Z4~&=0;kKXxTASl7^O5J0r`f1z)wyD6AuikAh@S-;~A6h@rQzP)? z`;JEn+`m>mK2TgVRS?P7InNU~U2IK{tc#6h0-y4phEEW|>jnPG`x?+u_&+7^Up~-q z**+X(yex?13+Ueyc=9d!UkW_=#{!P3f9!Rd4n#HOIy_!Bd@@*TY%dAi-w5*Ip1}Rh zC%**6?;XXrmF|OX=(Yf?D|6W>{9zBk)&L zbRYD6Q}`tx?D;M4$rmVrTBgo1cKi3rifV`gBJ_DcLgbu(dNxHtJGQR|RH_(}gcPait zbM=KDRJDY*(I1k~lRf}Ju&34$y0xH7r3nraow_sH9uBm6=S?RoVDwb)AVd5TKr(S> z)cB9JxCK(!^Mq0I2J%{9j56f3!N_r8o_h^;h!q5>cM zxfXw;zz1r$YQ5jdbk3s$X4zTM8A6`?h4FfUkIvU(>xIo7YT!HZsO3=R$#_-g0^~|BoNyQtOa=-~yl#=4EU-pwWUg7E87&8G7dlLJ2&1 zukHb5e(f}!^rWEM6FqtB z%tMlMU#^xkP3$#sM2RX#TA9u>Sh9KoABg^do)rQwCOC04yQ{-6A%8dkRO^hdG-0I> zPE;k|06jsYpP~`iz?Gj)#8<3EmX;$VS6)G z^gKZ?P1jss6DHFHo_w(GO3pUnCP62E8e1dqeECvcE$lW5{O#Yh$Nbj+q`(h2TKxAi zqP?i1-@%3twJG1J2}l+GDa4CbYOWoGc^XC&F5UcM`U@^uXK68_g%MLbz+hl+L9cc+ zdZREnQ{c&;ai$3Tc_}czmRzn%4#KrJ2|D?Z%^EcvXlFB_xzfF@76K6eMCk2fTKs1s ze!sw{%a|}*;Ku~Ms*46B?9I_u{vqveztA@m_-0u|+xJ+9$n44gn> z)=!JtJ0ydlw8U}|{I0;04<&sr@Z@t5zi9hXvAiX3CV%iN6L{qzEmxY2(HZbe%rG~9 zt<}Qt#m`Wo&y^ZBOyJ`MzCdPLlLS6P!^arOXB`$whU;X!Tp<~j3w*>;t58b=rg24{!_C3N8riFn!gly^B*-~zPSB}zDlYQh4>ITR zt4|ub<_sghol#sU9hYQ?AOktj5C@JIcyAT`5w$yy(RoHqQhjSJayH3;JY2GM5%~32 zYrs^24^;JFmp@9_jZd1APF6dBHfQqW!Mt7_rqnV$l~^w`A&_6fY@ubO{_)XM;RQ@F1ke%e&~+dnXxsS*EmSiVF} z_!*_uNzlnB+-g-lp+^YXk#Dl+h_&ac9fY0%bY|ecr;UGChY7txawnhFS+7cd0eZWj z?~=A8Q#Io~H5_PjFKZb8L#UoE)`s~p3r(8o3UjN{I{8C&p}@Pzd}XAl+)m&JuhxKD z#B)6aJ|s``Zz6EIixVD=8#uGcIX)Lgqb0+gvf5rQ@M!{1J~A~|;5c&1lyaopSS;|G zRhmJK@VQgqlh`f2@GHcEcvKL{hZf!x_~$Zfs1y2+057Gw9{)usCQGmEuPM#u+K10w ztFyF|VJcVP3zAf8CGalNoP0?!fhQl8?h80ZP0y&2S#(!X?Ho1XC~ClL$yfc8hEKPdevi9MJH_ z*1tJBgJvi7tLfI7F;)14(^Q=waHDE;z|Bx^Jm{pWwE;KBtlIEoz%|XN+GD!8W~F-5 zatqX6)6F)!5hzDRa2#jV;y||g-Ey-V-?iO?S&h%-xg}O$PMO-<%&kcAS2*|}Q_$S) zZ~mnwG proc () -> i32 { some_value := 20 + 30 * 4 + 15 / 5; start :: proc #export { - heap_init(); + memory_init(); print("Hello, World!"); print_hex(cast(u64) some_value); @@ -142,22 +142,32 @@ start :: proc #export { stupid_idea(1234)() |> print(); - varr : [5] Vec3; - varr[2].x = 4; - varr[2].y = 5; - varr[2].z = 6; - mag_squared(varr[2]) |> print(); - - v1 : Vec3; - v1.x = 1; - v1.y = 2; - v1.z = 4; + { + varr : [5] Vec3; + varr[2].x = 4; + varr[2].y = 5; + varr[2].z = 6; + mag_squared(varr[2]) |> print(); + + v1 : Vec3; + v1.x = 1; + v1.y = 2; + v1.z = 4; + + v2 := v1; + + v3 : Vec3 = *vadd(v1, v2); + print(v3.x); + print(v3.y); + print(v3.z); + } +} - v2 := ^v1; +vadd :: proc (v1: Vec3, v2: Vec3) -> ^Vec3 { + out := cast(^Vec3) alloc(^return_scratch_alloc, sizeof Vec3); + out.x = v1.x + v2.x; + out.y = v1.y + v2.y; + out.z = v1.z + v2.z; - v3 : Vec3; - vec_add(v1, *v2, ^v3); - print(v3.x); - print(v3.y); - print(v3.z); + return out; } \ No newline at end of file diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 34f0d74c..debefaae 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -344,7 +344,7 @@ static u64 local_lookup_idx(LocalAllocator* la, u64 value) { #define COMPILE_FUNC(kind, ...) static void compile_ ## kind (OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, __VA_ARGS__) COMPILE_FUNC(function_body, AstFunction* fd); -COMPILE_FUNC(block, AstBlock* block); +COMPILE_FUNC(block, AstBlock* block, b32 generate_block_headers); COMPILE_FUNC(statement, AstNode* stmt); COMPILE_FUNC(assignment, AstBinaryOp* assign); COMPILE_FUNC(store_instruction, Type* type, u32 offset); @@ -361,7 +361,7 @@ COMPILE_FUNC(intrinsic_call, AstIntrinsicCall* call); COMPILE_FUNC(array_access_location, AstArrayAccess* aa, u64* offset_return); COMPILE_FUNC(field_access_location, AstFieldAccess* field, u64* offset_return); COMPILE_FUNC(local_location, AstLocal* local, u64* offset_return); -COMPILE_FUNC(struct_load, AstTyped* expr); +COMPILE_FUNC(struct_load, Type* type, u64 offset); COMPILE_FUNC(struct_store, AstTyped* lval); COMPILE_FUNC(expression, AstTyped* expr); COMPILE_FUNC(cast, AstUnaryOp* cast); @@ -372,44 +372,34 @@ COMPILE_FUNC(stack_leave, u32 unused); COMPILE_FUNC(function_body, AstFunction* fd) { if (fd->body == NULL) return; - bh_arr(WasmInstruction) code = *pcode; - - bh_arr_each(AstLocal *, local, fd->body->locals) - bh_imap_put(&mod->local_map, (u64) *local, local_allocate(mod->local_alloc, *local)); - - forll (AstNode, stmt, fd->body->body, next) { - compile_statement(mod, &code, stmt); - } - - compile_deferred_stmts(mod, &code, (AstNode *) fd); - - bh_arr_each(AstLocal *, local, fd->body->locals) - local_free(mod->local_alloc, *local); - - *pcode = code; + compile_block(mod, pcode, fd->body, 0); } -COMPILE_FUNC(block, AstBlock* block) { +COMPILE_FUNC(block, AstBlock* block, b32 generate_block_headers) { bh_arr(WasmInstruction) code = *pcode; + if (generate_block_headers) { + bh_arr_push(mod->structured_jump_target, 1); + WID(WI_BLOCK_START, 0x40); + } + bh_arr_each(AstLocal *, local, block->locals) bh_imap_put(&mod->local_map, (u64) *local, local_allocate(mod->local_alloc, *local)); - bh_arr_push(mod->structured_jump_target, 1); - WID(WI_BLOCK_START, 0x40); - forll (AstNode, stmt, block->body, next) { compile_statement(mod, &code, stmt); } compile_deferred_stmts(mod, &code, (AstNode *) block); - WI(WI_BLOCK_END); - bh_arr_pop(mod->structured_jump_target); - bh_arr_each(AstLocal *, local, block->locals) local_free(mod->local_alloc, *local); + if (generate_block_headers) { + WI(WI_BLOCK_END); + bh_arr_pop(mod->structured_jump_target); + } + *pcode = code; } @@ -452,7 +442,7 @@ COMPILE_FUNC(statement, AstNode* stmt) { case Ast_Kind_For: compile_for(mod, &code, (AstFor *) stmt); break; case Ast_Kind_Break: compile_structured_jump(mod, &code, ((AstBreak *) stmt)->count); break; case Ast_Kind_Continue: compile_structured_jump(mod, &code, -((AstContinue *) stmt)->count); break; - case Ast_Kind_Block: compile_block(mod, &code, (AstBlock *) stmt); break; + case Ast_Kind_Block: compile_block(mod, &code, (AstBlock *) stmt, 1); break; case Ast_Kind_Defer: compile_defer(mod, &code, (AstDefer *) stmt); break; default: compile_expression(mod, &code, (AstTyped *) stmt); break; } @@ -566,7 +556,10 @@ COMPILE_FUNC(store_instruction, Type* type, u32 offset) { COMPILE_FUNC(load_instruction, Type* type, u32 offset) { bh_arr(WasmInstruction) code = *pcode; - assert(("Should use compile_struct_load instead", type->kind != Type_Kind_Struct)); + if (type->kind == Type_Kind_Struct) { + compile_struct_load(mod, pcode, type, offset); + return; + } if (type->kind == Type_Kind_Array) { if (offset != 0) { @@ -574,6 +567,7 @@ COMPILE_FUNC(load_instruction, Type* type, u32 offset) { WI(WI_I32_ADD); } + *pcode = code; return; } @@ -630,17 +624,7 @@ COMPILE_FUNC(if, AstIf* if_node) { bh_arr_push(mod->structured_jump_target, 0); - if (if_node->true_stmt) { - bh_arr_each(AstLocal *, local, if_node->true_stmt->locals) - bh_imap_put(&mod->local_map, (u64) *local, local_allocate(mod->local_alloc, *local)); - - forll (AstNode, stmt, if_node->true_stmt->body, next) { - compile_statement(mod, &code, stmt); - } - - bh_arr_each(AstLocal *, local, if_node->true_stmt->locals) - local_free(mod->local_alloc, *local); - } + if (if_node->true_stmt) compile_block(mod, &code, if_node->true_stmt, 0); if (if_node->false_stmt) { WI(WI_ELSE); @@ -648,20 +632,10 @@ COMPILE_FUNC(if, AstIf* if_node) { if (if_node->false_stmt->kind == Ast_Kind_If) { compile_if(mod, &code, (AstIf *) if_node->false_stmt); } else { - bh_arr_each(AstLocal *, local, ((AstBlock *) if_node->false_stmt)->locals) - bh_imap_put(&mod->local_map, (u64) *local, local_allocate(mod->local_alloc, *local)); - - forll (AstNode, stmt, ((AstBlock *) if_node->false_stmt)->body, next) { - compile_statement(mod, &code, stmt); - } - - bh_arr_each(AstLocal *, local, ((AstBlock *) if_node->false_stmt)->locals) - local_free(mod->local_alloc, *local); + compile_block(mod, &code, if_node->false_stmt, 0); } } - compile_deferred_stmts(mod, &code, (AstNode *) if_node); - bh_arr_pop(mod->structured_jump_target); WI(WI_IF_END); @@ -682,17 +656,7 @@ COMPILE_FUNC(while, AstWhile* while_node) { bh_arr_push(mod->structured_jump_target, 1); bh_arr_push(mod->structured_jump_target, 2); - bh_arr_each(AstLocal *, local, while_node->stmt->locals) - bh_imap_put(&mod->local_map, (u64) *local, local_allocate(mod->local_alloc, *local)); - - forll (AstNode, stmt, while_node->stmt->body, next) { - compile_statement(mod, &code, stmt); - } - - bh_arr_each(AstLocal *, local, while_node->stmt->locals) - local_free(mod->local_alloc, *local); - - compile_deferred_stmts(mod, &code, (AstNode *) while_node); + compile_block(mod, &code, while_node->stmt, 0); bh_arr_pop(mod->structured_jump_target); bh_arr_pop(mod->structured_jump_target); @@ -746,15 +710,7 @@ COMPILE_FUNC(for, AstFor* for_node) { WI(ge_instr); WID(WI_COND_JUMP, 0x01); - bh_arr_each(AstLocal *, local, for_node->stmt->locals) - bh_imap_put(&mod->local_map, (u64) *local, local_allocate(mod->local_alloc, *local)); - - forll (AstNode, stmt, for_node->stmt->body, next) { - compile_statement(mod, &code, stmt); - } - - bh_arr_each(AstLocal *, local, for_node->stmt->locals) - local_free(mod->local_alloc, *local); + compile_block(mod, &code, for_node->stmt, 0); if (it_is_local) { WIL(WI_LOCAL_GET, tmp); @@ -772,8 +728,6 @@ COMPILE_FUNC(for, AstFor* for_node) { compile_store_instruction(mod, &code, var->type, offset); } - compile_deferred_stmts(mod, &code, (AstNode *) for_node); - bh_arr_pop(mod->structured_jump_target); bh_arr_pop(mod->structured_jump_target); @@ -1101,61 +1055,73 @@ COMPILE_FUNC(local_location, AstLocal* local, u64* offset_return) { *pcode = code; } -COMPILE_FUNC(struct_load, AstTyped* expr) { - bh_arr(WasmInstruction) code = *pcode; - - assert(expr->type->kind == Type_Kind_Struct); +COMPILE_FUNC(struct_load, Type* type, u64 offset) { + // NOTE: Expects the stack to look like: + // - u64 offset = 0; + bh_arr(WasmInstruction) code = *pcode; - bh_arr_each(StructMember *, smem, expr->type->Struct.memarr) { - offset = 0; + assert(type->kind == Type_Kind_Struct); - switch (expr->kind) { - case Ast_Kind_Local: compile_local_location(mod, &code, (AstLocal *) expr, &offset); break; - case Ast_Kind_Dereference: compile_expression(mod, &code, ((AstDereference *) expr)->expr); break; - case Ast_Kind_Array_Access: compile_array_access_location(mod, &code, (AstArrayAccess *) expr, &offset); break; - case Ast_Kind_Field_Access: compile_field_access_location(mod, &code, (AstFieldAccess *) expr, &offset); break; + if (type->Struct.mem_count == 1) { + compile_load_instruction(mod, &code, type->Struct.memarr[0]->type, 0); + *pcode = code; + return; + } - default: assert(0); - } + u64 tmp_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32); + WIL(WI_LOCAL_SET, tmp_idx); + bh_arr_each(StructMember *, smem, type->Struct.memarr) { + WIL(WI_LOCAL_GET, tmp_idx); compile_load_instruction(mod, &code, (*smem)->type, offset + (*smem)->offset); } + local_raw_free(mod->local_alloc, WASM_TYPE_INT32); + *pcode = code; } COMPILE_FUNC(struct_store, AstTyped* lval) { + // NOTE: Expects the stack to look like: + // mem_1 + // mem_2 + // ... + // mem_n + bh_arr(WasmInstruction) code = *pcode; assert(lval->type->kind == Type_Kind_Struct); u64 offset = 0; - bh_arr_rev_each(StructMember *, smem, lval->type->Struct.memarr) { - offset = 0; + switch (lval->kind) { + case Ast_Kind_Local: compile_local_location(mod, &code, (AstLocal *) lval, &offset); break; + case Ast_Kind_Dereference: compile_expression(mod, &code, ((AstDereference *) lval)->expr); break; + case Ast_Kind_Array_Access: compile_array_access_location(mod, &code, (AstArrayAccess *) lval, &offset); break; + case Ast_Kind_Field_Access: compile_field_access_location(mod, &code, (AstFieldAccess *) lval, &offset); break; - WasmType wt = onyx_type_to_wasm_type((*smem)->type); - u64 localidx = local_raw_allocate(mod->local_alloc, wt); + default: assert(0); + } - WIL(WI_LOCAL_SET, localidx); + u64 loc_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32); + WIL(WI_LOCAL_SET, loc_idx); - switch (lval->kind) { - case Ast_Kind_Local: compile_local_location(mod, &code, (AstLocal *) lval, &offset); break; - case Ast_Kind_Dereference: compile_expression(mod, &code, ((AstDereference *) lval)->expr); break; - case Ast_Kind_Array_Access: compile_array_access_location(mod, &code, (AstArrayAccess *) lval, &offset); break; - case Ast_Kind_Field_Access: compile_field_access_location(mod, &code, (AstFieldAccess *) lval, &offset); break; + bh_arr_rev_each(StructMember *, smem, lval->type->Struct.memarr) { + WasmType wt = onyx_type_to_wasm_type((*smem)->type); + u64 tmp_idx = local_raw_allocate(mod->local_alloc, wt); - default: assert(0); - } - WIL(WI_LOCAL_GET, localidx); + WIL(WI_LOCAL_SET, tmp_idx); + WIL(WI_LOCAL_GET, loc_idx); + WIL(WI_LOCAL_GET, tmp_idx); compile_store_instruction(mod, &code, (*smem)->type, offset + (*smem)->offset); local_raw_free(mod->local_alloc, wt); } + local_raw_free(mod->local_alloc, WASM_TYPE_INT32); + *pcode = code; } @@ -1176,11 +1142,6 @@ COMPILE_FUNC(expression, AstTyped* expr) { WIL(WI_LOCAL_GET, tmp); } else { - if (expr->type->kind == Type_Kind_Struct) { - compile_struct_load(mod, &code, expr); - break; - } - u64 offset = 0; compile_local_location(mod, &code, (AstLocal *) expr, &offset); @@ -1236,7 +1197,7 @@ COMPILE_FUNC(expression, AstTyped* expr) { break; } - case Ast_Kind_Block: compile_block(mod, &code, (AstBlock *) expr); break; + case Ast_Kind_Block: compile_block(mod, &code, (AstBlock *) expr, 1); break; case Ast_Kind_Call: compile_call(mod, &code, (AstCall *) expr); break; case Ast_Kind_Intrinsic_Call: compile_intrinsic_call(mod, &code, (AstIntrinsicCall *) expr); break; case Ast_Kind_Binary_Op: compile_binop(mod, &code, (AstBinaryOp *) expr); break; @@ -1299,11 +1260,6 @@ COMPILE_FUNC(expression, AstTyped* expr) { } case Ast_Kind_Dereference: { - if (expr->type->kind == Type_Kind_Struct) { - compile_struct_load(mod, &code, expr); - break; - } - AstDereference* deref = (AstDereference *) expr; compile_expression(mod, &code, deref->expr); compile_load_instruction(mod, &code, deref->type, 0); @@ -1311,11 +1267,6 @@ COMPILE_FUNC(expression, AstTyped* expr) { } case Ast_Kind_Array_Access: { - if (expr->type->kind == Type_Kind_Struct) { - compile_struct_load(mod, &code, expr); - break; - } - AstArrayAccess* aa = (AstArrayAccess *) expr; u64 offset = 0; compile_array_access_location(mod, &code, aa, &offset); @@ -1324,11 +1275,6 @@ COMPILE_FUNC(expression, AstTyped* expr) { } case Ast_Kind_Field_Access: { - if (expr->type->kind == Type_Kind_Struct) { - compile_struct_load(mod, &code, expr); - break; - } - AstFieldAccess* field = (AstFieldAccess* ) expr; if (field->expr->kind == Ast_Kind_Param && field->expr->type->kind == Type_Kind_Struct) { -- 2.25.1