From f2e7d4e1212ba39fa98bcc11e1c5d8b508b6ad37 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 18 Dec 2020 10:11:38 -0600 Subject: [PATCH] added 'unique' names for structs and enums --- docs/todo | 16 ++++++++++++++ include/onyxtypes.h | 8 ++++++- misc/onyx.sublime-build | 2 +- onyx | Bin 516812 -> 519196 bytes src/onyxtypes.c | 47 ++++++++++++++++++++++++++++++++++++++++ src/onyxutils.c | 4 ++-- 6 files changed, 73 insertions(+), 4 deletions(-) diff --git a/docs/todo b/docs/todo index 310ccc53..f761d865 100644 --- a/docs/todo +++ b/docs/todo @@ -79,6 +79,22 @@ Language Cohesion: easier to talk about types in a concrete way (for polymorphism and such), and would prepare the compiler to output type information into data section. + [ ] Switches should have range based statements, i.e. + switch expr { + case 10 .. 14 do ... + } + + The only reason I have not implemented this feature is because it would + introduce a slight inconsistency in the language design. Generally, the + range (..) operator talks about ranges as inclusive low and exclusive + high, which makes sense for for-loops and the like. However, for the switch + statement, I think that would be very confusing. In the example above, + I would expect the case to trip when `expr` is 14. This isn't a techinal + problem; implementing this feature will be fairly straight forward. It + is just a language design problems, because it requires a bit of extra + thought to remember that ranges in for-loops and slices are NOT inclusive + on the upper end. + API Expansion: There are many different places where the standard API for WASI and JS backends could be improved. Here are some of the target areas. diff --git a/include/onyxtypes.h b/include/onyxtypes.h index 7dbe2a4c..15bf0856 100644 --- a/include/onyxtypes.h +++ b/include/onyxtypes.h @@ -79,6 +79,7 @@ typedef struct StructMember { Type* params[]; \ }) \ TYPE_KIND(Struct, struct { \ + u64 unique_id; \ char* name; \ u32 size; \ u16 alignment, mem_count; \ @@ -90,7 +91,11 @@ typedef struct StructMember { TYPE_KIND(Slice, struct { Type *ptr_to_data; }) \ TYPE_KIND(DynArray, struct { Type *ptr_to_data; }) \ TYPE_KIND(VarArgs, struct { Type *ptr_to_data; }) \ - TYPE_KIND(Enum, struct { char* name; Type* backing; }) + TYPE_KIND(Enum, struct { \ + u64 unique_id; \ + char* name; \ + Type* backing; \ + }) typedef enum TypeKind { Type_Kind_Invalid, @@ -140,6 +145,7 @@ Type* type_make_slice(bh_allocator alloc, Type* of); Type* type_make_dynarray(bh_allocator alloc, Type* of); Type* type_make_varargs(bh_allocator alloc, Type* of); +const char* type_get_unique_name(Type* type); const char* type_get_name(Type* type); u32 type_get_alignment_log2(Type* type); diff --git a/misc/onyx.sublime-build b/misc/onyx.sublime-build index fcf81eac..333000a3 100644 --- a/misc/onyx.sublime-build +++ b/misc/onyx.sublime-build @@ -1,6 +1,6 @@ { "target": "exec", - "shell_cmd": "/usr/bin/onyx -o \"${folder}/${file_base_name}.wasm\" \"$file\"", + "shell_cmd": "/usr/bin/onyx -V -o \"${folder}/${file_base_name}.wasm\" \"$file\"", "working_dir": "${folder}", "selector": "source.onyx", "file_regex": "^\\(([^:]+):([0-9]+),([0-9]+)\\) (.*)", diff --git a/onyx b/onyx index 94eaf2bc5177bb50869e37e48c495bf12f844b5b..c499787463be7e3b09f7c6e374074c20b2e0d652 100755 GIT binary patch delta 59413 zcmb5X30#iZ`v?4-Q%?)+>S+;WiI9{vTMCga*>|#MOIfp42uZ}jWnX``8BBySV=0Vv zkYx;p%3ij~HZlh9b(SZ${=eV*e%|{t$9?Ya_d3^g&UN;4-%s<~uO91fd8E2H(!*Y?noFnPRlGSxlv}+Et(HqK_zaeQ~MaL-G&#WzLp?7i% zx0J?bC_Y*7_MKUj-q}_8#X_-Z$lB{{bfbmy!0d2o}UF zMgOf*yTr3EdV}k^IO#l3MLS~odBOIw+GfsfLGj|;vs7lZEJ>Wo>S={{yT&S-8{ED= zluk}j^dCxHcpM8udh-*h)#$}9ioP|Q%|^QB)RrP$F2ek(Zz7EznZ@=YZ82Tae@Iq0 z0BP=stT`;#+~E3XhNQPEdag=6i&lJ(U6$`X5xW>dwy0W4VEBYoI zhl!`Vv=#Uf#pWxvo-5mEVQ^dSAn9PNR(=t58h6(9a_lnd&TKAqS2UNjkD`m%XA9@{ z-eHn$qY`&eY*c57_ji`51}Xe$q{J6WSQn#kuN!QjrJ;SewakmPQny;s8z#tPS*q{t zQ20PwDbIb)uY(Ft8qJPd8saR*$YjR)zOCra$E34ISjl8>6}~{p8&p{>&>VL~wK%D# zgUVJ##ChGN%^fKecvGpzSILi^CG^MXI!RpDRuPVI(r^W(sIO4upo=Zlw4xLqUkXo9 zcxowprNVc8hhwp~DNWhL>m!u{iAMhlhvd4)$#mbjO~A1ZuO zSy>TxRl(kJJPr+POq2$us|40&(y+^Xi5my3>IyfVCh`8NMw=*n{3wa9Q+nDXE=Jey zO03fjQSwPMTk1r$KU4{(D#Bcqps&IgDExl7EZGLkIlopb{GY25uSF%EhB!C8x|HGb zO8%Ydi%ci&>uxDx$rPz*z0{+7r|>*AFzAUSC^kM`H8&EJCzQO4!u{rak9#Y;<#mZC zTFV3h=2(8NsCO@ExW6(GsuCM#=9~_=E$}z`Zh(IHB;jRU|&qM&g$h zp1eikaW9mj+luH>P7?d^nO{W;H!Cl3f>pvVa~$G%$;>NB`~{VGd4(@lRWMn?x>^d4 zm?^8^jFgYlg&@HPip)~;STB{pZk|lAMk$I`_-=*2SNL3okEkm%v|nXtnZoxHiSM$P z3Dyfd&P?}bQ%U@!>SnJ>u&BAjQx$$f;chJ?eo%Shn!+!KNPG;Al>BKG z@N@m8Cw2(`BiUIIergFkN+lSea2sctV5}Oxfk{FI&p zN>9-(ssA#^dHrW8;z+I}jI&>k!mpaj5}a3x?koJPUgE|K{jKnHD)Eg*h{tiFi-}AyP7z)zL61C{A*xDNPvO1tC9YF=Ya@PN;`s{isc^sN5+9)S4^uds zA1vE{v?69JqV;2$z_`;(QTVji60fcdtXBAu)&1|_vka#?|)SC)fDboB=wY2c>Op< zytpfgONt0nc$)Hrg~B5gUPqOhD)EL&&k}{l%_x+FQPEaK zR91K&rRaddQ&e3JQTPdk&r%t!r|{nt{+E)UuM9s^_?^Fm-8h{zuhV@{#NtO1$yAE0 zaOJ{Xy7`U7jazIth1XMU!l;HdLEA65TGnL@D>XydF zvQ^=cSEQo-O8#esuT~@JYGvSp!i%cOj4n{}e<(Z!m-(Xq8Rz3dMWl|CWBWUm;2(uY ztPB>&US+__R#r`!7@47}<}yK5g*Q@%1?QBW1`3b=Tgu}(kL>@!iXh{Hgs4Fo=%w(W zD2dBD)9FSke78DwS*+xzE4)n^nbDbQ_DfWF=mLp1GLt!4V~h5A;|h5$iG8Y$cd7*0 zBc&(GEBv6sePd+_J}LuQi1SIyB4eb`Y@D=ySMrOP)Zanc)jd}D=(rVrJGdi`ptjn4b*7+zrR2{sHS9lY|`Q#L#7A)QhZ>Qu}{wejxZBRrXMP#Xg z$VcH(O3`Yi$W!6dm3;NzrJ^u}FI9M`8ZnJ}b}M}IMCs9yvS4w#UldVS8D63kT~zpF zW#GEP^A*0NxAerH3V*5aPkki*m%{&1_^f^s|3%^ExDW8uu?Ifo()YT3Ftr^yeA1xF zQKMoe4<8gYc--*xjUH}RRWXw`7))hmRZ5-iCdT+$@(o8I=7xE>;l}02UJl`9tm$s@ zQO9SL8!FCkywClkd0wI7o7DX?-XCCSgy9ngbCgeHF}}{M$j5Zl?}!+$+ZZwK)URQD z83ulWHWx!U27VovH}UTb{C7GAFAbJ}@q6l-JDP8_zu-NT1^ZR+^P^%+5aril4974m z=MU<#QXGG@G=l2BSl#)GiZ@VRH5)OkX7_!ZYi`Au_L`%4xPtK$7(|;PY;Enzas1qi zj|0^(ti{0RiC-}o_kkGI@!sUYBkG#3?q7|7x|^XcKFD>&@VCMqs{2@V=eHCU->lQI zp|$N@Q}OvF20pMc494pt7N}gMXU0c$udePV@&1;_Ss!1I3dVL@9)bHDRo8yJ4??%s zs_?Hu4&eO*2ENWKQrKf|iTTxWvEGNsRSZut6kxh4HH_=WgGzP^-Y;XAh`|y|d;#x# zJXn~%rA{)bWRFo-44p9a#LyW-e+*4A@M|z@=U=_jFpP~5&)@zTf>B&^ifbra=I=qq zu>JndapMq)!_Zz*x&i8LybU)-@ZJT3aRbcP8oc|vVK81RF%qpFmg0RDhCmFq7@RP) z#t?}CFsS9914ebaW*8P=sDL4f^{HDWE&^loFzm#z1_QrhFzmv>2khAx>S9=gVIYP> z7=FgUuOJM`7}{dkh9Lw4zm8zY#*l?!1BPEPRKXCB;V6cmFz~A?_s9epFZnl0#YW?O zCWdM1ISucz7;@C}Exhl>kf)yW@jep64)y#9?@utCRnNxTRE+$F;Sz>dyhbi!WE}>6 z^~10oLpp}@82*Dnd)eW`Bn-_l+{J(mM_i}z-!m9~!0;Rc-yFQadq)hXFz}UXZ@ibm zds&sJfWJKAwPl9E1B3A@y2otl8{CT3%Oy@%GIIQ$%L0+M$mOM#sVj?^{KqbrMIr5? zXbVL>i;?1OyYisEETy`Akg&Mk!hEC08uaI7?QSPsyH|Mg74GnI) zG^tHBbXqP8LpoEFy1s_a%4M^WKBu7@YUrF?wh!rB8s&NoouA8ckuK1r=3UEp73DIU zMp)k(x`~nF_dFJev_+n*Kwe|bG_+kFi$dB(Lvs=1<(bDeBJHiAjZK1!_~o(7NCzmI zS4j}Z)fJS-z91c{NnOUs;XOQ$`37KpYv{5XIwFq^L^@JKx6;tjd29*Nu^QSqf^ez$ zJa!!Eg&Ml8CUt5adxi9B4XuVcA+$MSVMQ$(7JqC(Z*_uP%kAd@>yUL zgPWbAc_s6i$#}WsvnZrJH8dY_jF)#l+laKEhVE57N;6HFT)Ljd@x) zN9HkH;k?}p(8%}BXTD7hZV?)FgEVwxJ{yR1v?ldn4IP`$mNYfAkJr#cHS|IaK1_qB zYOD>{;H&f5E3~#*L(AMtnO*s;Vl#tVnuZ>wNu8O`!kQV{XKCm$8v2|DAFIK06wW=v zr+(vgE1&H{Yx$aF-#Tu>OO`P{-iFl*nD;ncvai0Y?$2Oy( zCmT7uyWD3{NPB8%K0O*Q@B3^c(taA+I2&`3fcxw+(m@(}hA}DLL+`UMNQZ0aSsJ?c zedZg8O+-WEWL$DZ-e&`mj@Hl#B_yr{?z1IG$7|@h8hYVCgx43)0~lny&_pSMLYRHy9g$hTdf4@E-Yq4MaLxLvPX0 zu@BgiU>qYf^fnE>P=jk1aj6RDRk&Rvzxn}th1ND}lI_&cyB@HLEe$m70SjwssGF&g zvermtX>h(0G+yT(u-PrK0chwwMh@?{910J%= zNC#hO9j&3WG<57kwgl;T4SiBW zFMP<3Bb}Xr!_<_<0R}?jf5U zf(<}JU)0dI9{He#BlOy;(!w(a^gdv5KL%ve3|c(`dXhAF(i`vov(Bk;D7BM{G9IIT|`&L*IJD z_930Gp&w}If=4VD=^_pNNJAH6<7kJ|#^Z0J#uE)~@t6f7ZKt6NG_=cO7S+x`Js-1; zDCMn@a?wcnJ!Y5N8R`aTXjcs#q`_Zk@X*KX3u+D5(62Of@5juyJq{8Yx=2GuK4t@v zj@Hm`G<57^wgl;T4gF3-FMQ07Bb}*72SZ$uhAug-K(S(t zQRAx)ky?G8#D@jrD^8AEXmI0^C&%p+&NHt)5q6O{o7mBwdOl$rI~wYGYgD-NwCeKH z;QU0_cm+IRmpdA0&=d9rQ-^A#Di}rZ94{e<~;G6Y6wXzg)qqz12OOoR7m zh4b=Q6Fg8fu=q{}!>gs$b)m`De~DZ3BD{Tddb5=6=@e{ORi(PFUDCbix*_ISvLj>#3QmZtv@*3+!a0(VrObhh9| z8CIspQ~Jr0z3ow}OniBX9=1&P?rBPBmId?e6+~xSu;^aV)XF0LL9g|c)^=vuecjmF zzFzd50i&(yetvUfmHO4BF)})`pBHT)qq{Kr(MbptqQFrZt<&F&Cdg=X|C%&VMh_!O zW%L6^&pC=@0Rw8%1u{B&fER5qqbD$GE27H>)}+6e6QXS}x=KbDW3-!$UK{8|-DI@f zpqliygOKfm(X}$VX^))LTYd4)G$-SytcjY%a$3irDEPHOXiZD>KxK`r0!8p)KfZ z8=-75A_ryk5=N)UsLimNw4RK1ALd2hTMOBhh#tV`uoiTZMBIma(S|ZQV0caX)=J22 zL-df0KEmi!8TA_BMH|cLh!I}o6N?#Gp6$fgF%c`kSe%H}80kfVMQk+2On5B)$B_nN z+4O^%Zf>#8HjxF7a%8!Yx60&M$OcvM@ARxufrQ$;Up^+24tvM^#~N79m_hXOTa5lg z?ccK64cJJy&l`_@Hgz^xSHAFRkcCd2PmdR{oT-s?SOIGi8$|0Cu$i$F>44$vb*vK& zleZSbna4DDI`}DTJ}r!rrz~Y!sL$8pYPu1&H&L;E-Y{+l^PL=0gf=WNo`Z1=qU&#X z!pQXI)OQ#Q!dr_cEN*%mYW{?so$g1sKV~1NucTidvD6t|thNo2o=&!2GX#ej19g4G z^fSG!dX?avB!1~(dY75o2*u6K-?PFf?nB$m-a-9v^E*41?#O3XiYv24ajWRRdFhqo zYoX8bP=8&PklvR&BRlpQqv5v#SNFEzi$7A%=!0iCgA30e89?5*l11wUP7b(S`v z2@lzrrK73yRrbfy=GM_+#=?&Xs}9TJNI8|^uR?nc4dSi;sTZ=MPK`#XtT1x zuD`$@tUN|%++|x<^`*G$1n-?=TcABnILBT>kmuL4D3P4#{TZDi zIs(8Scjc+=!wkqD?0}gIw&K(&hFZT`WA&uckZqvH@3Gu)_z2nY`I!21_>4imYk+G#a@FaXo>qG;$3?8%|F)Z>TrI)}>>+HyDRm~oWO+r`Rc9;BCdvaHM) z+HWVTcVvq5+e|dx_?+!LJ&rkr_I%(;(dTBetRs7<=MEP2b4Pk@d-~Cz_Yf<0TrTht zBH7xZvM9~+ZEW$;sWfRD(;qu-(r&96Y*}gI$nG55Y_fHW8FX1`YGCa6FEnsVdiaSg zgs$7f-ez5;=Qgr4*;ncN4Q$QH2h@H8n{_IYZup6rp6*M1*RzPz&a{Ucn|8W0J-v=y zI2}k&yRtIB4xnD^*r;D?&?c^I1wO4?oBsCK!ITE9W~bFq-V<6J7G zJy)`Ti`Qww3TFM=XzH|rP5W&CJ6>z95QD=KQK5^sXeu;p z3G=%aO<$z2t=AUP2aB1{^)0mXVs_>Fa(XeD4ZSgqrX{o78@s7KnI-+6W!03=jKalM1Z(=3KgEA)EEb5!!QMdcdtZg#J38jk;aYp~G5XxMT); zJfE$(y@ht2kImeZ^}o}?s?fx!JkLZZAC$;W+=-``=CR;E<1PBl!vf$$09{U*xwFTA zCeq6D*x0*$tWFSPxyYcQ7;-fcyXtzy3S>eG}}Y}mb_)OQs-fA2FLk-*O7R&;P& z`F(EYC$QpNpr7N@m*q7gCavSlVDJsSGkcJ~nXa9kKJUIYp+C-I>_J1Hq-E7`(ms{R ze*cAN;MC9n=D`I?_?U;1Cpz&<>{y{#?n3?{^!z+Y7nV!Du@kByj$Fd4ff1=^B z?DEseriD|nTF)P@z`p+J%w`lUqUN#8ys!&>G?n!&JW8ibLI1cgzh_mf{NJG&;r#0F z*wwoRx^ps{`fMS!p3KPewI&IZRI@(#d?)pv#0I=*YW3o^G0B71BFT`6?C1+`tIZ|& zDv28=GK-gfRvk<5mJ&ZXf%SjcmioVD+h0zio#(UiuVxxn#+dP*_(viy_E|YTUyWgV zUv;F}iR{y>>9lhqoBCHWy)ZA`w8)uI`|+&8>xvGm=ZXX+O~8LV>-2grT^_~$eLdXz z`8d>?9J0C)o3{?SoFE1^?@e8La~#Wj(}uoESpGJSPEKG6Z;O0>86!k@CCeQ}NE&yG z7~Z4fzc+Dz4BPN7iH;byHs8_ z`+FS^N1?U3r#%ZliK$cn<5TwI--GC!QOxSYBf374z4`DbZ7~wp37K@|2&~k~;5op| zfu$WcWqsqV+2xP-=)&o2?>}AWlHtogEv37sv1OlX(!^=$$3B&%hQz77LGhi@fqY~B z@NLW0yT+Z-^}+1Z=NRfaghhQBMGp;5zx~CF&?ONo$T0e1(#jE}Fa2%M%9ErAO&kQS zghbSvI|#F!oD%evPkRI>z)%r8TTn(2iM{c$FbUsD7y98pSeNM&VGkjFP38|YTWLcL z;6X_sZ7~oAQ4&F$4}@$=oayNSaEFq^b=UXj+7t899jXQr3xsP_B^-^xVrUkdNBhG` z6SAMW_J_%)WF*}k4Y{VoKzsLxzfH+$`k*fy)strS!}p{KXl?7=)Eqj5NC22#md%`$N;!6{H!UjuHmk#L3*Yn5d z#vYJbhIrG{J>lmvq_xwM9+=CdkW6f=nQ9UI={l4vOJ>pa-C=oI;zM&sKvr4uB;ZMR zGhJa1Id6H6lEcPHJkXQF#^*?tfBo+wW*j!cyF;!OnN4%LiVa0Zj5YBwpMxeytfN;r+yEGcFrW$>eLw{apa638i>XY!{>$F{gy2sU$u zJ1%55UDE~r4cI8Yw(s1WdTC*7!P2qe0r{oAeKcX!gs zY6xGM2)n(rh5B19p-lzSnmV+G#T8KSWGlE^fwZ%j+RBXgg)~U@Ag<7+A~p)2RxqI= z3A4Q0Qc$U%;Z+^t0{1z$tR+}`kQvmmB`oqlKb#MS-}!xZFnD@mxgCOGu_x(FvxDHC zCs{-r1i`3E`245^{9K8wwemY^%vZIeB40b2Lu_Soi*^izu2o1AY8MDgs*uJsq#2yA zf(2dP6c$${lc-Nqpk8RGOEc)?h50AVU;}?X+!PA<^N6MpPz~>frm&FT&oqHs{63`# zcvmNftactY8s2bN7_JZi#2fwX*T@XQZB3owZ*TPXtcI|q2KqIw5qQ)jW2i$TSX>j$ zoNWky;D(;|YY44sVL5glC{cGns;dvghx|$X>Orm#=6hCM*ixG-ss|pvSV1-G!6aXD ziVm*}jq8wp4&iN3fo2qNsS7*mkQOwJDAkkOpfAgOS_IT=X& zAt;bktQ%EDo(|08A9Q5$gR{b~xEw8fkN;q*qGXG?AE~Wmk<=C5htxna)-Jy?cKz`v zB-0EBs}{tCbOf&!*hJ0sFs21*6xW0coj3ia$yBQ;O%nWQzygCIG`SP*h_f-CZLrO- zv&|rlPip1kzn8ZNO-9j=I@@`}F<(5dN>K@6GOweKXQTr72N5^AtP*qz!WQEKQ-ZJ~ zbgTqhgGg1Io*rg6Lxim6LvqbZa3hFxb9`SBv2Pk(LX#4MASIZ%*oi5J&>-EBMh9 z2DK*!m=;WIQEyT(>K)|?hk|jOZCnu^2jlpAzymIa5@)E_lI)=`E5iMjWIUZ&5xTY_ z;{(c~p~AI1|0(*djpPW*U#`m$G#(K-?++0%;|S_i0Y0`OUhWG&e*G${r^P=!g5Dj8 zGsWDGdfRy?Gn%v}BMB|<4%ON3@vzy|ANEk8Q^Pr=mOMU{VdqyRIrFf=m&f+LAL&9zDC~ms>8$$T z*cBH)HSM5#S2BXEg0|I<+~AA>RApNb|Wp#@8UUFiK<|0*wBqMs+w$VsLXwO zVQx0TL%ZF{)pWs0WkZwfaJA&gS76waA*UOuf?eWWH!{%1GxP}hN?drh2DAH<3P{cF zPQ0ylB%vlTzpYQ=qh00o*1T9HdQg`qPHR%F92DSLcj9MNwd=_7aHuCbY*bmW?nQ#??6eS?H}f@|SVecN%1fbE_P05U%U@-?a6ioKMH0&l zML0R}1*UPPBWzBg5+ggwWoo4e6#vb5Or3SA2MN1z2YOwC|lKjLGD z`C2KZP9lBM6Q1=WHK6TrS_K;RC#@@wHc<+t`~R=oJOK}R0x`dT_9x*c=TWck0L-w3 zi5UzUKq81EWDOwO9PE-)imcvIiyg`Xi{PtXOqPZDpkXEs?H2{4QFPt zAA}x^#E5wWB3IE`U<4v=hzyS)T}^r*@^b{K?&Dit_ICa&S29At>c@$2dDsjr+Kt?0{_``Rw&EF7@ zusRA+D$+3AXx1&aKJhwmxuRztjQ6%e&`A$t#>?;vV;$ItJ+Xzi!d3VjNWh?lI ze{G_0kQq!LLu&iK|66D~hX(KsLl)j{@jW0{>r$dNwnS}I47L}iIH_nFSCl6gPR3PD z$zo*Q1aA7<6oW)36vB}$DI_a2sgvAqaa-Id24!`vov|=)qK$F2<9J>w zRq4B5qefd(Na%ngbL2Q;#lqm5NO01-_n{p*vpvySo+9V#+ zVc@N+AV{c6jO9~evbafwX*R}EpW%CZ(J+rj@mwi|XNyo_ZLZKII3-#pmp7sJ3^uUP zq{K)`@SD`zv_x;m61^>j-hMKpow(j~eiR~}v1M>Q5ppONw}fIH(zYoLkt)Q+3Fc1n zN!i#ZiIRSvV}w&uBEcq#c*JeA#*&Criby#I@^x`{bj)|A#Q3Ob{J3;igC?GTr|{32 zj7H^1YBb89o}WS28vBzSt_g%l_I(q4$r$RMBu8O27)$?8!RCTF4uxgoNjcw8kuQFZ zqRHV7^oT~S1@3bS`9V@|upCd^$L_WIFQw|wz1WC5Kl3Z!Dd8pOo;m+b+E;4<_Ycz9 z@`kxPTdyuHyz~GbU!rzMiQ3+yHACG{t|;k$ z4Rw{cSHHDHIdIFNy0AMRo2;bU?a@qOtN$NbGDDsCSsPAuHX1d#mJlO zG(yusIuv~CAhXOw2k~kpcFov9GQ`pf&pR%Nh_-`lg7(q4Cp!Vr(WD{?g{9Ht5iY7H z#gIxSq)-nL?THiYjS-vNV=*Xs8Xm@wYLz!U(W^6(!SX12f~oWY?;JP^G%o;~iKLB} zr+_WwamwE~ykG~m|6cUkQ~VGh8hyGv$zmnuj6uvZ&_2UkD0*z3B=uQyUBMZ z`hxXDTt#*hsItI+IFA-ue=qqL#7-ps&4&;D9|npjSFBWQm(Bfw!1x#~%98+3P=))4 zA^$_gGFlBjP9asH*CY~)b8pTh+%9^;yGf)8iG@0oNq3XBq#DehOj@|N8~i_%yw+8N z`;*Bala&~0H3dZ%NBj@b7AUb1CCdB%FNtSgp?C_J>*>i4l#)6XU`dR#4MJ*>HaFW7 z)=eeueCJgG@+;#;WbBN;@e~8g({nbNN{+zg*Mz$c!BwhKow z91pTEn^~d!!yftim`~h%%y;7L|5Roe)~}qL4j>{o7du4ExVb2RWAUULnFsa>1b>I5 zq{JzLQDhhlP9O#^n-VUbXCE7F`8y)3FM4ug_Y)s?{wdc`SIC1MV}#LxiJAqV}ovqLIw3O7RndaC6Ed%?W!K8 z%_Y@wr@Un@y6XH5Vb4lyPyai-o=Ylt+mtA_5Q{Y7t%N^>Vz+Ka#dh7ex7?xYJS;^+ zh?_^6I6c2Ev<`F7l%hIZo=2PwKZ%5VKV#h$S)*IvNeU z?8ps}ap1iO2eU>Hwumex8IZe(^fryUq}M^(0z5+=lT2os9Q#cV_7A9G)nc^L3`Q*` z=jnutkhcg=J)>SzOX!}02hMLGJ%v;@y>bE5?mtMKp(useki+mb1@xHAn z#boeYN__3YxL|TT|2#f4**d5l3|vYKcpyG`DG8=eLLqZ0aW8i+R0stKAq(t~8KLlW zDH%%!L-$nD)XrMNV^^pKn^MVqr?|7C`uuSEDQWS)K$B&pFAi=imyu578a!M^R*>cy zvCD}sesp&Zb}_QVDeAOH7$OE@)m46g4l76+*4w`;NU+DqQz(&~=*=6HIKJvEMqDMk z2KuigsiZjL*s-+W8x2er|{*rig zhLWqH$@X~c<&E_vI{Y4Zn76z{)m1s|aI#GQf ze=Y~R4iX#c-V`zqlFIO(4fw({rwLr%fQKXdo50Hr#I4RO{OgsWNgRx(Sol^7W}%?<$;NPZ zBVkUpB_o=Ze0ebUXFVi@QdiipiA*iKS>ztyfFu#f{s}X@X*01aJ3*rP9DQAnxmWMJw zkYLgWI{rW^*yp_z7IAQt3*{Lw{RdJLN5<_xkXocQT>XJy3xvcUiHCj8i|=KF;Lwja zwR=MCJ;dG7Q>_y4Zinqt9?cHeL#h!^7W~))KKq+nX6)I6=iQb6{DJ2;F;)8sLB=zo zT;`%o#`C@85OFfyje;q9$3hK?6|Spu~JT(VaJX2k{!3F7th!K?YMzn5Rr}@*2xQ!((w&hVO6Q`Y*lWg5!f6g zA(p}a;a<|WRGg>aoJ{lZi5UE8!R_49d7p@;7A?0Uo6_#gJE~U_VOl976-J$bgGRp2zB|)qHTktvK z++iG|yIOg2n0KuL|7~1Pr&Mv^sekJs2sy%j5f8?Rr${`N8eywoE^xAO_k;_Xq#n++ zUouHmtG-eTSHB>`_XxgLY#xe#Viq0MxI#&Oqz!KgsNU=*o=Vvmun|ZWshV-@7ZOC8 z?_4Jot>y>k$??2kQqcklC`Hr6Qz=D9*GokMj}d>;+-a>)WX6xywTj-m3P34(DxOLy zs<}=mf}-Q(Mzj3YLeEu~QhKr^p!6INPo?y{UzJ4$m23VjC3=i6fmp_bEYgRTyULfa zGH;5h4!I}ERo|C<*;%qA$P-VcbUOgg79P;zXcKV?XS4UGNJrytVKa^cyTnRXyszqn zaq+Us69%6yy<0fv+l+BlA*sUA>Ust`y!kDu~n*+A}jVsP1oM~J9GOuBOm zT;$w5V~HMO)>B6h>luQUU7PPc#Cv!C`y;eI$cB#{)gb2+(ZiJoCKgb%o>-dbJ#Aq2 z1yal5d5Xy73w}^2E$~kq%bVzbwT9alNGlp|4HYkv%Cx^Vw7f`?n%`b55?tV?YTEX6 zL;|W*KZ>VPrFxaZ+mj=>|3X-~&3 zg5aGvCf2=77LY&T=gVXY?u-1dkR+#P3q`8P^O{uEGOk=9l?gcoZ*p*7J=9#}Q)R1% zcq)~xg)rbM8D_f;v+!-l_8hXW6EApw6(=y{HCsltEu5iDz|nZ#rlZy_Fx z=MQ^swbR*++Un_zj#at$zJJKa(N;2I*KX zhp%eCYt+>s?*<7W;Tc}PlQ3degD+)Ex?g!Jmmp(c?Mc;WRZKQ>W-BWs3~T2{#>D-oh2R7o^@Ij0)2wJEFiL z4(8n>J)BSdqm?hX%d?IykV^#1TvDUvXd!{9b%cnOT5PbHB1JwQ9Mg`XOGn_hgaMzX zAu4>0{!-IQ-bZ0dmHDc8D%Iv3Gw$c&0UGw-*LkD?$>q0l&?KMO^95W!euU*T6Sm}& zX-PJqm51>xXc6b`h ze2SlJn7;;iO6uBOFVdJiThI}1KP3&^S49g=X>#khK&p`4;3Cv4z!RWeFuMT1emyY} ze4ded)NK+Benxs5;_>S)bn)5!!l+DfbUa*nMw-!q6T$j9?wQL^gz)F23gi~zuKnZ$ zh%3PTbWN!B3>}jQ5znx(J|8F4^i0#J!E=pgq&X=BtLLO8*#VuO<9g&*NPSM)l(XSW zbiSY}aoSiYd``wWg^d-8?(NekS_ETWkXp83e5uaIJ3LUrX&AP@ARDUoea=DS7}rre zm8#0686#fe(Kp>X7VbPH_1#~LLKFNosTgC|@6lMQlyTz~X+@~@80hCiJ)vNOcr^ZFyiuw2R3=S58Qy)*5SF7U=7+XDX*{{VD*Lo&!SDEk(7AXT95TikKx4HJsX z?$Rj6Vd5=rq0L6FdWYl9*9^luJcFUSNT~Ln^z*1P6jR6-ma<5(J2Yu~z~=X)I|+jK z@A1Is*9^bENerI^w|>A4RsuZwK>Am@dk+(c9A6W$Qlo`_Fbpn6={c~i7&BTHE))~* zask`86<*)yNwI9p0sTiZEWGI;o*$0#-}oKgs>w_=r|^J}({fIme-~+CdZvh#GQAYb z29->4Jo)V-);Tt+kEE~lk&;9|-SuLxUpSFEFybHl#^DSs{fBHJlfeHIaka0xMVKy` zZr4J;Po%cVzx{CsU)ID4Hh&_cO%~zPeri$y@=lwTg$DnU=eUTd^qEwlb`j9#Gr5U- z>Iz?QvK+nfdu_WiI(;FliG9W`UIJr_-F-`qTpw3j(ecD`xy8!lQCeJ(@`@=Ci19Y}i_nAKAsb!xl=blFo33 z(wewecunabLXX~nuBJ4D^n)^bx*Q9#K~JX>Yj826O-NVhW=5Mi#;g)*&`H=NrLwND z&5WL)vdyK$!s(vmZ58%5<3ZM$8rso4fV^?jZW7(3d%)G*}&7X^e{E=2t^gBi~Yc5 zB3Vi0)`oLd^hB)+9WW(+y}&;%z(Ym;0#3Bj6n%2)_X%+EWleXH_R!CUy4v4f`aO$z zw4oD;6@0XzUiP#3Lb9ZeqtB~4&dLa}r4uOG3z_z`8_srC4zvTg1ic-oFWndlpI6`l zd!GY!YkxO{XG@$0%0;1Amx+2@p8UOK(gsDbkH~jQ@}<6bwc&{)%D<<;p&ZSif3}9- zT&au0@kON)hrs)Cbc?A?YwR~mkC_?lT}w&Shipe$$I`T|TGT@AcC-?>Ink<4BU+*5 z6#bqgp;NYnt%Uvap zT(qNdIYp#tcpg&e*t4zz%2HfF!|PXId9mlC~~*%Asoo)m&&$cwi8w zOHOpb6|MB4_`pv1&{payX$(WTXo(M}^XZ(w=n|Vf>w(A7a6)zf9Co4pRS)q6UrE*O z6i=lloY7F$m7XAX;G!#abvU1h2{iM$t_A$=8OmE=29JeA7#j9~Dn zjYswl?z9$l4uTf$v<7(rqul8nvIbtb;F{&`$C;LB1F!z&8e``EYuB2a@O=Uccv%q(yc#Na;H?-sdC*YPrA^U4ck^+cJL*AQJaYoL zwnXurjHtt{@j{7o1Z@oOJZOEg7;1Q8mr8@lo;29wRU?rmwB$_PTARibe)q)2(*(*^ zqJ5l#xGXm2IE~hsFs%|@@3gd`p!~EHuBs|y;>QqCnI=0OX&@xF%+@4+zp4stPVk(y z3ayR+E!mt*cPAIu1N9A+|aVBOBptb#xZ)O1-Hs zc?d1NX|PWvKTL*i%u4oQK_xTD)M-LhNjnr*e9!GqI z3X772Gh;P*cn)Q1(q>*g`3kS3yrJT$RC_F2560A_!DJWgtx0R+it|tW>ks(SBd8W_ zNw?O43$glbc@ zhaY`t=c-%zIB^4nz3unA7wXtc0!5_8h1mAu& z^*XV{Kb0KvPR=noGOq_GiM*maOJ>s9Fx8j#$7R+HJOXr27kdOt{1Xz~ zVgx|#Iy8a+EUAO@_gFYmhX&%bQe1~NaI~8EfAk)NU_TmNiz35c8?V539y}}fJLCym zman@Gh?w!6@cEs0{V1t^t{Tt$Etzfnf?kUL9%D2hJKq~HsY_3hC2+PbZG&TjO+Dd0!MQ&D%V}d3Op>Da883vS zr8`i*0qyBoi!UX`BCwK(m0AQ2gJlhHELaL>_^myBYCyYI=~Y>%Gmp}!V;n0PK99lu z0P3X2S+m(TSk#bqt9-VSNV8#_CXLB=X~3>2^?_QAuoAvPPkzIlVIx|fdQ{_$t{hxw zgk8%AJ~qNeH^mdxi4{F}`24XNtv^Eh09xHJaWi7l&GK6zUe}jlK>)q))XW1@r|4IW z(Ikt7S&eDkRxkNdv!t!&iKkL+bq-H0e@=i|;9oujV6#faIPQba7F>rnjcF~cw2Dn= zy3_Rv!c@=E8dJ6zPnzJ0F(`Bt2eBb)-r!>sE_j0mGX2Ckz^Tk2apx~-hptEQlC1Su zuSTrx5Ydb-reh-ERWrKG$*a6Dcypx2;9ywM90$<1aIHCQiTe?!K-!l~hUh>ViN8R) z9f)0Q71*|*o{rr|h-BK1bO2hlpj&EXxu9NbcE;5m|AzXx8$;+pa#5XNh{L6u6!X-8ydHw zRa>=n((~4EaELG?%P^N?CCzye|2C~e>j@#K)jAnAx57o%4mi<@c6DNoLSJL8zAI3z zHO@?3SD=lODr~(%RpAPVX-#We59DiZ;i~S-<=*NBWFvu<^H*zn1lJF{Luhr!!x1PZ z#xG;3>KdSW8(OidpZFlB%(tvg{Xe3ALA5rt25qn$y0oE<(8Wn@XpqS-_Bh{s#P!O< zHn{ywvk`z2s>95R#$^vQdmWaiF}_|SQ(AnuL}EHevBjZ zWh?A~#6;R-5`*I%Xg{Z9E0MoY!_&*}(3NPTtQAYnAvX}lltikqYJnBf>Q8E>LJ5yJe3cW=ZN*uVs z5_5*V2`bIT1J8M#si9XHtlYxtQiUjrB?k-|z=8vM4Pedz{#WOWHEza%hZ;a{4X-<6 zNBkA+!o{G{G@Mo@A7EfOWwK4(bDr2j{oD9hjF;VKZn+vtXq z(*aYIC|O6H?xqoZ3O3#8H0#N85EET%%pB3vO~+tH*uKsNIJ+HB339sAI4nhY584pd zs|$M25gr*-DaB-BmGQERMlYTW_QWN^Q}FFcgYYb7d{0`nMFJ)%T*#M>DYEHDSO^`( zViBT$#@0m~s?*r{Qk*ZUNKnylk`GIdEu8V;!gY2T4e(C>whG!4Ho2l!tRHFk{x%uwM;4X^++ zU$|cb%;&&n4UotI{uh*uIu1gYL3qybiK`mU@f11G-hml|XbOI}W*LEV(<^9%H}@Q@ zvTtwdW@5K3j1+xWUojTqBXH%m1AdCYPB{baL{M-311rXe~$J0Xq1eK>Y7+=C9M%{?nk zwlOeT8J8WXMW_(K)+Ig z1+&0q1g+3~s`tmLI zHKs{Qv=eVX^=l`1LEd@dWSApUmb@<)KicdB0g=>`cANlxBWVSb+9=%R0DsN6k?P@c zHFF!QZ>1`Tf#Z?X-*Wq3!bAIFpg59x(FHN!F^UG5c0w2`O*eCaiKA#Y$G{+sSLGnx z5AKYjgKX}!5RAlLLEF)I$hc2pC63L6S)-}D=Ul!)5EVB~#7b539yl_Z`r$tK*=Stv zPJmWp=#U1}0yXOAyfW35{Ejb(yD3?p8^x8%4+oO4M^SUi>CIr>INTl|gW_@2A3J5uD4Z$rOa+Kj+z$0 zfoPo3jzVEHbtiv;SqvRc+QHZuJb(NGJ7X{lwctVw&R{j6>;ybdv4LI_aN}YJD<|L| zfb<{6J%|5US05&uadmh#frgj_KQ)EaF4WUH>@j9bP3M(i=tMdWH<4E-qOrE{Y9fwS zAHjVRZHF&4M@*s~jz2v`aa@-qg*-CmcqXiwL_3?|8R3B2!Cj11)C?+s%4|Uk@62UZhlSmrZ`_zh1Zku>@N~( zPob?zJ(w_s`qX;YM6S;Gh$dHO*AS7WH;b6@NZ~G=pF-OkDm^N(ZOs0w`=%@X&7C1= zDsH3x!4L4U%FqK-=_s-Yn#STGWEu>Q#eu9MEQqE3!cOLi0^Z_o6=nP-KvTwdoJIc_ zwVUSSbBex#KaP=hqH)P;ej&9K;5UcZ|29-NF9Wvgs2Q0FeWqdg{(z0s@EBt!T%Ja! zSY_p+67@Mg8$8tshEK?;^~pXXZe&b764;Y6zcA8&cm~DYkDm{X&cH zO0m;%)PdUElVT?EC^qA+6dN2*zv4%YgA>qCeIYr44xwl7NXlsrIn+t?ww4Y1yPtEqcC2fqDhc?FEl5*SUq1?4Uq+E?eE;se2lna@Uaw#{Z z+`RcH_x5)wXR&}<5t@2K%K0p$4mg9hSV%`vs~b|{uZ3J<_cbX|ZV_raaZPIKx(IuX zS4Qe0+Mdu0Ia1ATRetk8jd<7p?7L98e7~ zemzYf|AE)*v4h}8CmU!KzE=Nb19l-#c)S5Y{6cvnT}6){fo0w%)!@rU+=byA&`mS| zhvUVY=o&gcvxKsNew%3FYe;qBy<>emlp_B7y<}f&wCfB3Q61Hq_V~me|s;M6qMXdRSvaQPfdmL8DQzomduY zu*CSYL^Q@IiHbE~)Sxj&jfwyFX5PVJ{QUX&@xAYxH+5%cXJ=>kx{DecA)T}P3&U4@ z1;Oxe2=*jhd3?W_ zjp6;%ab7ISk98_%4or8#k4%&niC?osZJE%vz(d{2V#*d+a11N>ybgY(8+y&kHu!aq zzSp(#B6|ya3D?sfwn8DpcB{mfZG(cte!6XNxf7y98XFBm&-66b%`L2oy|DwUsJp{J z`1Fq`kqMhl%=<;D?d+}hQds7IgWG`1KB6v3--}8+pgjG>#vO2ko!9R6U>|hv-y}4JRV@r{2gA?kw*k@xQb({(Vo?;g7q)?+Eg`cYxWOYWk?O|ou z{%WG~9#}T$DB6Hv<`hujb@_COlWUI9Aa$Bk6 zVS@nJ^z05v!7Fd|WdoVj(cdICKuYkI(y?^bE^N(aNGQot)+8&dJg%WlUe0BKAsv`- zM($;yrCNu|^sqMS^|ZR7B5p4XTJB==URa6!Ui`Y3_45CG6P8YHEX2#gRqRGGJxhxa z@zFl;hrweX`2Q@j_px5?qrZ~=^<{0o%Z0~c``Ph`^nXI+U^N*Qvee;C28%kpZKY

g(6HTh%l-kLQIherNyEHEZVJF5FQ-(=N1yAMk|RD33qUV>+(jE!OST#`34AiCm{`1vd3*Gg3EMk-w;<~9Ux|Jh zFvDsf&S$VSuyJAVLFnkE)??DM zhhRcfaf66C#Hxk&cu%}_uig`{s@Qr6rqeKaKg61po{7=mW(?C^K*E%lEb1R-!L^zP z$UaQnv$mvnx~Ett<2%dv7LNdtbQt>gQ-87ZFe@FNuToc`vtPn1z|f~o`v13Y!j}~f z!=y7qxF2D4di{=xE=ZEmtg6J)*|=;{51GG#epiSXmWphn8-TDZdpTDgI~s5>{almy8p=M zA$0sx;WGp320!=B`x10+GcO6hVfO#$gl~Y&o1KV$Ghf5&u6V0WF+{aYreoPFijOkk zJ||3U%48LMhX3)N61)^QGFdrr`6m-*?^{LH-{tz~KnG-zR&5)IY=jZmDsjB&yN8x(SCZppic1jCdycFH(32xzow5d;u zx@U+6r`f;3gO^|nIKKPSY%MigAjR2Tg7A-drO_NLVAtx;JdoMqJ_{s1G+FB=v_xKt3~P>~2(;?i062~2OR zpJM^cX{qRR4we#jh|TBNc(eC1C(-3M*dZQ$o;45hakU>sSE;>o6q|~T=UL~d(k|dN zJyT6l@u8c1T2MI!CS~|@CNO6FSxkD&m6O;44?RUhTwo!k530~>aNx0m6#twUcmbxS zCUNuvD`UO!YltbYwkLQbS#nShQ~J-S`z!q>>h4Ovg}Rf{Z=?PazC{jkrT$3iGR+*N zUq_!SO3z09jM9HW{fLKEMwS6K6>t>;HYr^eVx`i5Li<9c|A=~`ga23upE#voL!Xb8 zF4K=uy3F_kyKV)i`gQ=lih~~HpnEA@wve;Z?_maS;0gk@&qF<5=}%CHmF|st zccuHH-bU&Epj-1ADG0)VNTpXmJw)jhQTJ7PCDdJ&9)`L}>6KA`UQ)J1IO@4dm-b(j zF5_k?JrsRTN!@CZkl_%p!$D7V(3d&ra~9WGnRtKo< zpocl={tmjkgYM*@zbqkZFB5&_pywz(5Hr4_bZqv#GfFRGML42B9vhp|ebBy1>0YR> zRJteX3zhDUdZNw5Na@nY zOX;$cIy>0kz)u=NIx^9GrOV9jDZLn`f6c*uUg?mg6;1;MGSPiXcftr;9qelgBEVVT zpwDv96CC`9DP5)$>)_Mf!KV%C)+CE`YNP_pm~o`ir9H$Ug0IqLOSmds*4X4=e-7XE zftHYQbCoXB{6*;u)6a6STTeMe$Z*hiIOwSk5tb=kCN$SUpW@&XuXI_60ZNwz?d70% zP`XvtCR%|!1htheBZnzn*1%usGGlk8Ygij6rOUW4ix<}Zk%z^g^Y}xQR-ag&wPPnQ@%bWuZS-x{Mp6beCKl|36S5PpA4y zm#1G9rOWd*Na?{?V=tx45ztxb)zJP1=1XwwYong8^eEKtDLoqXYf5j0`gzcC{O^E} zsRFv9zEA1BP~WQbPf=f^^nR!(D?JW%{NggCGXnJlrH@5@n9?Vq9;@_esCQTTJkY!5 zwNbDP0~#rPJ?fE4PeVOK={D4Tm2RN!s`R6%o0NVk*YLZ_dbw!s#^@Z_01R^79TsU0 z9DZHRqpB9H({%ugns_-~Hy+(*Rm_1suPUd{3Y_YKMLGFgHR|TE2#a>k==X$uYG#=i zj1y1U9mZ~*HNJk%YB0^)xb}iAb<#!~L;q%0v-ZsR?O(QpX_;cGW^STQH;!nq=*>(Y z8%>?i26UZ-S_VfMwJa|pd zR3BA>x3%bvttv)&7jxSZZ1ff}%-7sWt7#neH8(UWEuT1Jas$AEhqUN9G zi`vfydtu%XRIG0%1W(VLtBKo{xsQn5ZE-SA`#5=+i&Z`P-;mdSPS2bI>wcy3H45_e z28+t~vjE$>p zTueqwa82Xm6jUx&H}aNakY82f`bxB%4mSpVi5B-TqsKb591S&Kr3fr~1>=XW(6TSc zi2WKZ{{|Q_+t9MTtZ`$z)4{ue!|Dgi7VZuAkm`=BJy=vtL+Ts*7F*7j(uNt+zq0f* zYrTzoUt1osT7l`B!=8$|c(((eeF{`5eOr)HGq9+XN(Txp%@PdTC_~aLRUo}CX_kCV zn`|`SVew>auRQ7PmWq@aOCrEtm5_+po(xE5H}PdWWj;Pl$p?)1c0*mhfv z)ta{bJ>?q$Zg{I`akkgAZ9&9xzQzWdWuyi>89mZ11Ke6e0x)hQ!s(nl)R>WO33i4z z7d9WV)CufWLM0PbkW4+Ws6rMiAzmJ`v{)o`!E*E08!JBpYSjic50&x{S&D^}Ow3B{gmf?)Z!Q`wrln)a1wSCg01 zQpAv&{1fd@;|x+U?>*SECo-HwvuJoGuGi+l><62OsLijie|8J44lm`pH5}Ri7X_wg zW{5o%%%w&6L|)uzUWeDz*xX%Wd|kd6p7-#2yb>!}SyZpb+r!%GY+_^j}s%4w#&cIwnUy;vRTCooG;gTQ96sBX1t zv9LDg`va?z&x-;d*8-pWi;S*K_yA|8tA4O@VVwfc+CNKR7UQQ@d;o*r;}MP9^1oe= zEQB=W;&=K&;W2{y7=7Atod*zh^@ zl;6aO&v|>-U*qioH{ylgKn`Eq7efc~iY(%_7~Y=;8hZxv7BH0_W_Norbj46!&Gqz9 zyWz-C5j7MN3>F^^<^C|$Nf^o}X|8OD-Qne6S!LlhoF8T*j>G3BoAPH zJ{7i+Je4^O6g@C7!;+M{LEm>A;NDI_pe$B0v05q{UDZe)nBhT&X zW+g;~=j3PLERthIv4;ggXH-xo1ZCnd@H@^j1FA=TGBGndjfB*eJnOifG~e?90YUC6L%)?8qkHk5_lzeme?o(2C?}J?ox$n#8M%j#Id+=SkQN>X_@vdn(tt zQ}|@|>aNTcc5yVBiq*O+^Ya~l7rI`&JVbDA~j#7h0jgy5BCEQuo`c=zm#xW$hPHK9M(o5%;4+-iuYvktK%@&s<65`@F~Af(pP* zk{ZNR1!Be8={ysU;0zeCd)`!8wH9B`;LSa2!|%j9wo>hzDywZ@!_M)TdECt%?tx@# zw9J1*G@A+8FBOw#LiWXOsO(=E&u4P@OyoAveKxPmKKogjJBxL*c`)pYJw6+7Qbp4V-OyTXth6TJli~3O()Z6{X|F%5L=@#-*-q)@`P_v>3<&+At zVGvw>9FNx;(RU#UU98O9sE8j(#7Z-_)XhJ;m4P_Xlj6vX{mC?nUsMQq=F32wVbwlO6nghN9o( zqJD$myoC`Y#d&fm@!b+QWTnJI5G?C^IdH;_ebuEfc5M|OF6A9r6j{T?$)!AuJ-wiu zZVT5G9?4P(lf@?~ydMit$lNZ7+bM8-vte%*jK$hnQDGVUgv$cL$zt>}UX?W_tST}w zv=iY?QF1x2!r)yZ8FvYMUz10`+Y57-Lw{-^(tupPIEPK%@>+(oShAe^!d9`D%lQN? zNyM+MLqgcyt)fiLuTZf@^ zDfBcLO5t-EL)Y*#Y}-kBim+8DMdn0aJ;3)cBt@t8!jlEb%4^0#v0*K5&Ah-BN9czq zg!VD?Bp3#pvA!o%vR%ZQb^H`u1N*M$rOM4cE>laDA3;ur5%h?<1SR98Zu@Z=#k(Om zz1!#OiPP(O5POlSQhgxwR6Yz(%TyQ(nr5og8s5oG<;^|(Gm93}UwCZb4XkN(?DK?F zsTG-G$dM2(oA{xVRo_7V@VXC8`I4$YJbcb)_sQ*5)FJ*q4)wr6`4>DrJ0bqJf!|}_ z922+uvr@*1jl8uJD^*Dp-@+?cpH?hiuya2bb(kFCjq5Gc;i`f9Rn%$c{sq*}D*Gwa zY3Kf7)YFwc9d+8dzYTTTxu1&qBIP4cpJ6g!=l&O(PX@%4?<0g@C_VM7WwhJI*J^Be zl*mitA#7xnD7l>nxcXM0R`u=6W&Ep6P`;V$W{g zHDV%m5jBxIw(Y-}d{_`6rjDp)gT%uNEWvfe$2RWoIt3b6-BgUOC}!DsCze)QTmj$G za{}zyO{raw&GD@wFb!TO4A}!`PwCoX&>lX~)hpDVhD)fLrL%M%=z1l@Zay2L?pK

`LmL+vcKu2Jhk8t-z^mpi1gw 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 T_1nt5PAnP^FSm&vuRH%Agft^X diff --git a/src/onyxtypes.c b/src/onyxtypes.c index 01d59c54..16eed850 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -4,6 +4,8 @@ #include "onyxutils.h" #include "onyxerrors.h" +static u32 next_unique_id = 1; + // NOTE: These have to be in the same order as Basic Type basic_types[] = { { Type_Kind_Basic, 0, { Basic_Kind_Void, 0, 0, 1, "void" } }, @@ -331,6 +333,7 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) { s_node->stcache = s_type; s_type->kind = Type_Kind_Struct; + s_type->Struct.unique_id = next_unique_id++; s_type->Struct.name = s_node->name; s_type->Struct.mem_count = bh_arr_length(s_node->members); s_type->Struct.memarr = NULL; @@ -412,6 +415,7 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) { enum_node->etcache = enum_type; enum_type->kind = Type_Kind_Enum; + enum_type->Enum.unique_id = next_unique_id++; enum_type->Enum.backing = enum_node->backing_type; enum_type->Enum.name = enum_node->name; @@ -542,6 +546,49 @@ Type* type_make_varargs(bh_allocator alloc, Type* of) { return va_type; } +const char* type_get_unique_name(Type* type) { + if (type == NULL) return "unknown"; + + switch (type->kind) { + case Type_Kind_Basic: return type->Basic.name; + case Type_Kind_Pointer: return bh_aprintf(global_scratch_allocator, "^%s", type_get_unique_name(type->Pointer.elem)); + case Type_Kind_Array: return bh_aprintf(global_scratch_allocator, "[%d] %s", type->Array.count, type_get_unique_name(type->Array.elem)); + case Type_Kind_Struct: + if (type->Struct.name) + return bh_aprintf(global_scratch_allocator, "%s@%l", type->Struct.name, type->Struct.unique_id); + else + return bh_aprintf(global_scratch_allocator, "%s@%l", "", type->Struct.unique_id); + case Type_Kind_Enum: + if (type->Enum.name) + return bh_aprintf(global_scratch_allocator, "%s@%l", type->Enum.name, type->Enum.unique_id); + else + return bh_aprintf(global_scratch_allocator, "%s@%l", "", type->Enum.unique_id); + + case Type_Kind_Slice: return bh_aprintf(global_scratch_allocator, "[] %s", type_get_unique_name(type->Slice.ptr_to_data->Pointer.elem)); + case Type_Kind_VarArgs: return bh_aprintf(global_scratch_allocator, "..%s", type_get_unique_name(type->VarArgs.ptr_to_data->Pointer.elem)); + case Type_Kind_DynArray: return bh_aprintf(global_scratch_allocator, "[..] %s", type_get_unique_name(type->DynArray.ptr_to_data->Pointer.elem)); + + case Type_Kind_Function: { + char buf[512]; + fori (i, 0, 512) buf[i] = 0; + + strncat(buf, "proc (", 511); + fori (i, 0, type->Function.param_count) { + strncat(buf, type_get_unique_name(type->Function.params[i]), 511); + if (i != type->Function.param_count - 1) + strncat(buf, ", ", 511); + } + + strncat(buf, ") -> ", 511); + strncat(buf, type_get_unique_name(type->Function.return_type), 511); + + return bh_aprintf(global_scratch_allocator, "%s", buf); + } + + default: return "unknown"; + } +} + const char* type_get_name(Type* type) { if (type == NULL) return "unknown"; diff --git a/src/onyxutils.c b/src/onyxutils.c index b1b3c51b..9111404e 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -579,7 +579,7 @@ AstFunction* polymorphic_proc_lookup(AstPolyProc* pp, PolyProcLookupMethod pp_lo bh_table_each_start(AstNode *, pp->poly_scope->symbols); strncat(key_buf, key, 1023); strncat(key_buf, "=", 1023); - strncat(key_buf, type_get_name(((AstTypeRawAlias *) value)->to), 1023); + strncat(key_buf, type_get_unique_name(((AstTypeRawAlias *) value)->to), 1023); strncat(key_buf, ";", 1023); bh_table_each_end; @@ -658,7 +658,7 @@ AstStructType* polymorphic_struct_lookup(AstPolyStructType* ps_type, bh_arr(Type bh_table_each_start(AstNode *, ps_type->scope->symbols); strncat(key_buf, key, 1023); strncat(key_buf, "=", 1023); - strncat(key_buf, type_get_name(((AstTypeRawAlias *) value)->to), 1023); + strncat(key_buf, type_get_unique_name(((AstTypeRawAlias *) value)->to), 1023); strncat(key_buf, ";", 1023); bh_table_each_end; -- 2.25.1