From 49af7b24f5b61c7b6c9ea62a51e62cac26f3e4e4 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 17 Jul 2020 08:45:05 -0500 Subject: [PATCH] Code cleanup --- include/onyxastnodes.h | 100 ++++++++++++------------ include/onyxsempass.h | 20 ++--- onyx | Bin 240984 -> 246776 bytes src/onyx.c | 15 +--- src/onyxchecker.c | 168 ++++++++++++++++++++--------------------- src/onyxparser.c | 112 +++++++++++++-------------- src/onyxsempass.c | 14 ++-- src/onyxsymres.c | 152 ++++++++++++++++++------------------- src/onyxwasm.c | 52 ++++++------- 9 files changed, 315 insertions(+), 318 deletions(-) diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index 7f6278f0..829008b6 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -115,50 +115,54 @@ typedef enum BinaryOp { // arguments existing in AstNode. I do this to avoid a nested // "inheiritance" where you would have to say node.base.base.next // for example -struct AstNode { - AstKind kind; - u32 flags; - OnyxToken *token; - AstNode *next; -}; -struct AstTyped { - AstKind kind; - u32 flags; - OnyxToken *token; - AstNode *next; - - // NOTE: 'type_node' is filled out by the parser. - // For a type such as '^^i32', the tree would look something like - // - // Typed Thing -> AstPointerType -> AstPointerType -> AstNode (symbol node) - // - // The symbol node will be filled out during symbol resolution. - // It will end up pointing to an AstBasicType that corresponds to - // the underlying type. - // - // 'type' is filled out afterwards. If it is NULL, the Type* is built - // using the type_node. This can then be used to typecheck this node. - AstType *type_node; - Type *type; +#define AstNode_members { \ + AstKind kind; \ + u32 flags; \ + OnyxToken *token; \ + AstNode *next; \ }; +#define AstNode_base struct AstNode_members; +struct AstNode AstNode_members; + +// NOTE: 'type_node' is filled out by the parser. \ +// For a type such as '^^i32', the tree would look something like +// +// Typed Thing -> AstPointerType -> AstPointerType -> AstNode (symbol node) +// +// The symbol node will be filled out during symbol resolution. +// It will end up pointing to an AstBasicType that corresponds to +// the underlying type. +// +// 'type' is filled out afterwards. If it is NULL, the Type* is built +// using the type_node. This can then be used to typecheck this node. +#define AstTyped_members { \ + AstKind kind; \ + u32 flags; \ + OnyxToken *token; \ + AstNode *next; \ + AstType *type_node; \ + Type *type; \ +} +#define AstTyped_base struct AstTyped_members; +struct AstTyped AstTyped_members; // Expression Nodes -struct AstBinOp { AstTyped base; BinaryOp operation; AstTyped *left, *right; }; -struct AstUnaryOp { AstTyped base; UnaryOp operation; AstTyped *expr; }; -struct AstAssign { AstNode base; AstTyped* lval; AstTyped* expr; }; -struct AstNumLit { AstTyped base; union { i32 i; i64 l; f32 f; f64 d; } value; }; -struct AstLocal { AstTyped base; AstLocal *prev_local; }; -struct AstReturn { AstNode base; AstTyped* expr; }; -struct AstCall { AstTyped base; AstArgument *arguments; AstNode *callee; }; -struct AstArgument { AstTyped base; AstTyped *value; }; +struct AstBinOp { AstTyped_base; BinaryOp operation; AstTyped *left, *right; }; +struct AstUnaryOp { AstTyped_base; UnaryOp operation; AstTyped *expr; }; +struct AstAssign { AstNode_base; AstTyped* lval; AstTyped* expr; }; +struct AstNumLit { AstTyped_base; union { i32 i; i64 l; f32 f; f64 d; } value; }; +struct AstLocal { AstTyped_base; AstLocal *prev_local; }; +struct AstReturn { AstNode_base; AstTyped* expr; }; +struct AstCall { AstTyped_base; AstArgument *arguments; AstNode *callee; }; +struct AstArgument { AstTyped_base; AstTyped *value; }; // Structure Nodes -struct AstLocalGroup { AstNode base; AstLocalGroup *prev_group; AstLocal *last_local; }; -struct AstBlock { AstNode base; AstNode *body; AstLocalGroup *locals; }; -struct AstWhile { AstNode base; AstTyped *cond; AstBlock *body; }; +struct AstLocalGroup { AstNode_base; AstLocalGroup *prev_group; AstLocal *last_local; }; +struct AstBlock { AstNode_base; AstNode *body; AstLocalGroup *locals; }; +struct AstWhile { AstNode_base; AstTyped *cond; AstBlock *body; }; struct AstIf { - AstNode base; + AstNode_base; AstTyped *cond; union { @@ -172,17 +176,19 @@ struct AstIf { // without the 'next' member. This is because types // can't be in expressions so a 'next' thing // doesn't make sense. -struct AstType { AstKind kind; u32 flags; char* name; }; -struct AstBasicType { AstType base; Type* type; }; -struct AstPointerType { AstType base; AstType* elem; }; -struct AstFunctionType { AstType base; AstType* return_type; u64 param_count; AstType* params[]; }; +#define AstType_members { AstKind kind; u32 flags; char* name; } +#define AstType_base struct AstType_members; +struct AstType AstType_members; +struct AstBasicType { AstType_base; Type* type; }; +struct AstPointerType { AstType_base; AstType* elem; }; +struct AstFunctionType { AstType_base; AstType* return_type; u64 param_count; AstType* params[]; }; // Top level nodes -struct AstBinding { AstTyped base; AstNode* node; }; -struct AstForeign { AstNode base; OnyxToken *mod_token, *name_token; AstNode *import; }; -struct AstUse { AstNode base; OnyxToken *filename; }; +struct AstBinding { AstTyped_base; AstNode* node; }; +struct AstForeign { AstNode_base; OnyxToken *mod_token, *name_token; AstNode *import; }; +struct AstUse { AstNode_base; OnyxToken *filename; }; struct AstGlobal { - AstTyped base; + AstTyped_base; union { // NOTE: Used when a global is exported with a specific name @@ -196,7 +202,7 @@ struct AstGlobal { }; }; struct AstFunction { - AstTyped base; + AstTyped_base; AstBlock *body; AstLocal *params; @@ -244,7 +250,7 @@ typedef enum OnyxIntrinsic { // NOTE: This needs to have 'arguments' in the // same position as AstNodeCall -struct AstIntrinsicCall { AstTyped base; AstArgument *arguments; OnyxIntrinsic intrinsic; }; +struct AstIntrinsicCall { AstTyped_base; AstArgument *arguments; OnyxIntrinsic intrinsic; }; // NOTE: Simple data structure for storing what comes out of the parser typedef struct ParserOutput { diff --git a/include/onyxsempass.h b/include/onyxsempass.h index c2d1a529..c5780fa6 100644 --- a/include/onyxsempass.h +++ b/include/onyxsempass.h @@ -7,12 +7,12 @@ #include "onyxastnodes.h" #include "onyxmsgs.h" -typedef struct SemPassSymbol { +typedef struct SemSymbol { AstNode *node; - struct SemPassSymbol *shadowed; -} SemPassSymbol; + struct SemSymbol *shadowed; +} SemSymbol; -typedef struct OnyxSemPassState { +typedef struct SemState { // NOTE: Adding node_allocator in case we need // to make any more node in the tree bh_allocator allocator, node_allocator; @@ -25,17 +25,17 @@ typedef struct OnyxSemPassState { Type* expected_return_type; // NOTE: All symbols a given point that we can resolve - bh_table(SemPassSymbol *) symbols; -} OnyxSemPassState; + bh_table(SemSymbol *) symbols; +} SemState; // NOTE: Resolving all symbols in the tree -void onyx_resolve_symbols(OnyxSemPassState* state, ParserOutput* program); +void onyx_resolve_symbols(SemState* state, ParserOutput* program); // NOTE: Inferring and checking types in the tree -void onyx_type_check(OnyxSemPassState* state, ParserOutput* program); +void onyx_type_check(SemState* state, ParserOutput* program); // NOTE: Full semantic pass -OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs); -void onyx_sempass(OnyxSemPassState* state, ParserOutput* program); +SemState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs); +void onyx_sempass(SemState* state, ParserOutput* program); #endif diff --git a/onyx b/onyx index fd4bedcb20862c19a59c7121606cc59296155794..391c5eeabf1cbe37ff9be6d1f02ec9540586dc45 100755 GIT binary patch delta 50959 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 delta 45121 zcmb@v2Y6J~7C(CSIaAJ@WM)p1A-zrNOhQir0i=Tj6~zwLfTE~i!2*IXs8{9MBgjDw zO;NCdAYvCA_O920Ua?`hD)x3&-tV{fIVZvIzVChi_uhP8W_DY@wf5R;m$UYo$*-5h z-+niCbxL2h=I(~u^hD#}k&mC)apv3`cHf>}@!P{YH~+Ns$_qc&w|uUPSMJe|PCE~5 z5xw=x`Z-_nbHNCw_&$6_COiA^^Tku0x%@o!Z09z9zB12wm!G$7*kau;ei5S4Ip5HG ziEU2b2SrJIV3Vc=>qJ(W(6mCk(dqNO$ahYEP~^q84MNSoMeawa(d>a+4ovFHL~K*O zriBK@uQpH^8|X|Jtru>Y_^>!ah;3VLe?)vN#3tvet)g82cXG@6ts-~Eq^UX2p2 zM&y?3go^_-SSxb2Gh=%~jC6&_c|xRp{)%AWmhn%BF8(hl{#$lEDJGER&~2hf9OoRq zO^k;itG9`Wi1lvOG&3E^0capL$GPumv7hMe1fLOCi7%aNpApw(&M_Y{(T(}GrbT8) z?~Sofq>9XOsXmD!bFTe<07$Xp1|l;zwj>UbHDf1<%%W!i5M??QnQzuaJhTPf(K6l9 z7IvYPYmxI6Tx?1Ypj{ce9@vFa$C0bDoadhvMVTe$G@>4wiv~+-D6bY9lwhWRJzA$? z-^?94-t&!`@SACl6$Orw8T}?*U4g5D5#ePD4 zwML|8xgCQJxZGv47WC@MRS2uv47Hkg+YK~9_v)f7ilGiyVi=OH7e@GNpI zu5d`hbYbLf^HHDXZb_5TV&`z`-QAya6GSCsR8sjoiI}d8Y&4?~MKRjwGWwG9d849< zy-wY494(jF*h-n1T!?<5;~{`X%1Vj=5M{b=WV1QaN84QUP)1I$134o$H_;X_V7=J$ z^3n+;V!AD|&0ORYJsnevgdC!0;~b)t;`&^i>h4=`DR^UYAIzRq7B3+T)2)&F%*{T` z{R(EEf_-VCnh^-0b+X_wwr09Avc>$uZ@tBxUtHHCTUxka7HSbn7!C}9<|Eayd!5Rc z#I^)!A{(J?w_-v}k2_x-tQR|pmqm?UA9q$p_2PoaF@_FdBd4I}Zp-%AqPX))RNp5P znQ1hkGGx-wL(d~-h6w0uNMz%(%ve?H| z*kgrMg%&%4tH$FpV`{~A}E~O&0IjZxSM&Bim=^GjNQ+1GyAe8*UenbshOuT z(X#=NvMl=nu!!Ltk6%R&HTR#Ac#b}ZV0OtIX#3uC*SE8fESs2Me> z*oEk+Rgt?b$65cDDAZreah`ok^vk>qwjwJQF}{6_R;FoH@3ABsCHCWP$rmh%qNJ}^ z@-s_fD4FP$7!Xp#QF6LhVzb0X$<>W`jH#ogx5{G9nRN7+$$lgc0e9k9J3%`hTYAozQ z{9uHJy9|((FVUHcl}q9OU{ovo=~{IVXF0Lm$R^^t!&O^HbrUkpCCxQhqS3^8{2h^7 z!(lc$zFkmL!~ShIj^yYX9d9qFm!iLC*n@MOUmKzkn=JWy8YeqjV zIC{r^H9S!wKm1;2zjsAtE$5zgsFGrYubHPHfRg+=W8l+yPRF~VAl{0?`ZR@DZWL|J zakjiG`n7V;H9GFg)Q^PT#G^(TCpP#t>~KLF6t=dS)XjBhwBD$C!geaRi^35ji;&-J zR6Z+-Mxbf>elobk$R+UC2P@({Up*z5M@q0uj6o1=&UR7J_JpLyFr~vB@M9G5q5~E2 zG{0B(`NYStSFYd_u;Yqj4f|Q!`Cz-q*DuO(2>oQthgWDxM2gsLda)8%l15Sh?^HJxf z_eE9wB45xy^nTFP8}GxQuO9?R-H1$(#&EorzM68ruIG|R_I?WW6kprF`53S3&B}n= z>VK!b|66yvHnILq>hA+D-(Eif<|%e~`APL<)XhgaS19M)e~Va#yV804C|+0lyq2Q3 zYGiNMQ~uzLkUKi&G1*e^f^2SrA&DO+5y{uC7{yurrzlDBa<+93+k?^PoInvj_2v|{>}sNh_u5QQ|A zk45kag6?!ey{Nf{PNIv-M+?3TyRuj=h67pf2KOmL}xokSN3c?#7#GSjuX@Ca4k z$8A>6hdQxX$g?TN8RB0^@%st6%D+8Wwfo6mWT%#U()aUh4#RaT2fDu~W-ZsldU^-M z0M#978t@R*Yhs|+!HM;9`Dpc8Y{=A~Lv0Qgu|-bj$6{2Jwt+$6fKD!T{`0X&PV6La zxk=ihk;bHV%+UIrOHExY#XY3i?G}uMFVWe*5|1u&GrqXdn;}V!ThS%)RnAeLh{C9W zQBBG@b_ERed=zC`S(G8}Qr9H!%Ov}=OUufLhyl@+Tb~K41)c7rKqlsF> zu>(|XwYywA!A4(_|K?Jj-;IuCnPe?j&U;->t1`)SKMwAr#jTY}n@Jud#S<07WPV{L zxeLP~o-F@&+!^_)C~W?MplME!FG|PAHdkk~hQJ`j`b71i#ZjYL{eV`^6`x{8s?JQJ zlIevCN#94vq|YKGJvM#T@JKW{kFZbnS4dqO!*eKA+MV2@R9) zAp#wIsV}92@9Zz7gD?0WIQZ6^(=asB!53a%{do{AB~^HRFGWQsLU{dPj=bwc2p5%| z0UG5*2yZa2BLJNU;SJR_NGm5octfA_F?6mIAzWN>Gijs~A$+&_qDzy}!gsqwbRvZB z?*Ai1aGeO@lFD~TB%KK1jb;g|6r+tU4bL;-jfzG(5yBfs{{{&P<>P#KhY04)lQgpEvgDw zm8}&PqP+-(dN_ICh{n)N)D&-W#(X1shE}TdIZVH*((90Jyd5*ESRSkgqzK6czgX^A z16s+Llcbb~{|Cd)?r%hy*w-oBC3@;x!_L0D#6Ecsf?jgZ)563GnJ+r)c8R1Ybe`KK zY7R(YU5^+ejsrAbIcxC7GD(xr!i7j{yI|-6EeqtPxC>p%z6_T83b=oH42kf-$5wb< zvt{VF;yT*YTi0oOiw#r|1XfJKqNMyPO|?5bd6;{T+;u=W2K6 z{wO+?1$Wu~OCde!jQvS8!n=LOPty3s&*B1jw{OSLNaHtWM?ZwtmGPT%+$lrvwt237 zK89I&x6Qe+URd^Ep!8^)X3-V^DDSp8-^_zX721OCXqoP43%k(DHS>H0C%xO|m9ZvZ zEAO@m?{?)c@NPTiIHGcXnNAJm)nfGPnojd@w1(e_9#S)}=wK8oZ>hP$T;$WNs6JZK za6>m&^r!U7S!%8rHx`*nuFYcx^3X$S_9*&@aMD|9t~3i^P^u3rU3nzh$|i*-g@dQxIP z5L1IE`}$CveN|pZ^Wiwf?wh|H@2%YzE3-PLe;9G5r1hr~1nTA$G$+7vlvl9gcTt|9 zdP35iL(&XGQsp6OJcXvYCU_>mi|DB{Z?h!;S{{HBCy%rK6@ zt`c4Xn6Y)3>*jYQS;*KBV>eoaum$MtNu~IJfyETKrkp_cx(HfLjMta)&<5POYBE53|mEp1&%f@OH>6c`U9Xk$o z6luym0+~YK9)i!1nZ}X_rz6q^aU#t|5k8_b&^;SYyd}uQXjxX4TphI7f1xBRyMz@c zC}-f)U~4OCFdcmb^&_l!#?~$m8uu3aTG;0OBcCZMUG2}ufJq!lfS!Kp8NSASU%nJ1&ewp*1-J&)_ zM`^_bxU|I~wM^q_p<*K_#36&{$!t4t5)!R|x?je+;%GxVl!wGYYeBD)s48T~ak#DO zoTBRQp|RtYl+Vz01)LZ-lvm&D){jRQ`5Ft>N%@G9F62bQ)00-Ud#b7&U^p?M$3!ou zOz4&6oYzJNAK3T`nZ&Fa$}R+R6H(_#p_iP{MBUM|R&fOd3yxFy9SbU?r!6>z!^P*= zq*Q7spSm+TaO~AC!Gmo8j%b*L+Q;cy;yym=M8z>1Q;n~03!Gu!irvmp58#CO|MGg9 zn|FG=zi&U*ec$FuMzjC6Z=*NC;d+D(3$?2P9tIB)m<4A}ne{XT}FQZt6bTFgjEBe0`Px0*}Lb~2J1`jQ%UL0wmyOZuM$ z0Cin$E*bYVGJQ39U2R%LGYBBBtIfqGpEzR~iLkgk!s4bkB?9Zs#cdKn-dCH84`4># zSEDMc_yNMn>uU2_a~I(x+O;(&NqOjSFt2SUjk>NjuN}h-I>g&%Gg|cDFn30I^=vvO zw`zspxbnD1lpiRMX7IY%j1~7mGj;WBE;A4JX_mQM`Cw`;Q(V>6vl%Zujx_S>8Qa1# zpXR!nj8Yx1p3Un9{zgXf>e;+*Uk)-<$LnS@r*sVw{%LAAGEfjtP&iE$fyh5i9qA*ijw%HAFr_r? z9;UJ|vHimoGhK(N6N%;>raC2Bh9|<6u0ZZ-O2N6OsUYF})6_a5c!#O?eR-C<0PbOm zeee%c96SKHhp8_J;2oyQEx35R(^R*~^1n}0ylys&${Mixsi#JBgLx1#N~s&FDURBz z%?*7xaWF&qq-Yjb977uU)M(yqUhLD{UHv|N7Mi?zHt+7wsRtrHDVimf*N{j)HJTgE zH+-UvE+alQnj003d}=hiKQ)>gCpRh0xre|VM3Yy~I0KpxONpJ?>>7}J2&64^9Rd?* z=N|$O@QEIXDXVo4fgB?L5J+|R%|8J}?$xtdS$rg6c=enzx0vVnFk8SHg*ZEOT_EGI zI67ON74z6IG777WIw6@y#LjY7MD_B#1Hhu&g|XQld((M2s_&m!h>DO&(+rs$4cv^% zG?#{uoOU6TW*3qZNFFG8!u1Z6GVLBH*(bE)q{-#5@b*hB`tp3q{(0w1uBGyPiM90U zLb%`SK-_c<0MEkm33A8GMGMNrX%e zSjc>rB^f!c-T{-`OGcvB{H+HJT`S=+#{6BSEBR#bUzI*F59vQtnis$3pDN93U-K`O z=B=-}Tc%5S>1*Nwk)Wl#^fiUbj49=z*3{i9-ujw`o8g(k47eHI`kFzNiR^I(&Wo!v z@Rb<$GXD%b6->M{a30eB8Mq0WbOW|hMQr7tfu|$GGjIhy7`!PfVhv_6dNhMq=E> zED@v~(?MPR#W}3gw5jSttKwQC&K5x$H{I|Mhw(ola|a4)PAt%z3k&pu`h$J8<3%6E zc6z0x9WO>G+IFqxb?31Hy{Ok>zwua4#_5&vN_4Ck&Ps|BGP#J=Y; zVD2fRQ(VBQ?s*#eo#G49Q}pyYDi82I#Zaz9mx%%1 z_?*jgc$wInhKG(+%B#dOF-a+|tvXum3ev~LsXJ@t>6)k#`HBKE*FWwIDbma83$Q{c zMa4WtO|O)fZZR=jwT67}IGG}7^>Dwj+0~h!*m+Y7Wu+Pj9wt&Rv-rDc$LUIhoqmt5 zN4vDNxbM=gLefn%(C-Fvl_o?gPJMh8J;Eg(sE9Mr=UYDYSFX8EZ;+R4UkzuK5`d?@ zR5md`iT-h#B6b~zfJkFwQUZL^&(&ypDj9wl#AS1J}E6P zAubxuofmYy=t}+(%_7Fz$18nSUq3_j zZQR)*Z(3f{&pb>`jkfBsF2)fqM&prG;;cfh#CnDcVCn~QJR$0wteUvm1-FNMZYK=! z2I@|B^@NG6;y_8X6B80m-Zpb*PR%CbQPFG{@iJfj8dNCxkD?t;1jZz(;bv4sjIExA z$GDVxc~Z+2w4!YS^%hb+aT_89WwiSCdq*u%?Q-1chQ z?O#u~e~ofxr1I1b!pf~Mzkv327ET7r4RUpna)azYThTP)ewD9zW&hvZApiGK{tlx2 zi=A|}e!>5|e|WcA=lw&dMtU%o*656`KNqKL&x5fP9r)iKj8^}!1`h_E1bEbO?;kD# zfbYTh&_`Pk?S}R@4~CB>?;j+b=fRi@Y~O?7yikixX^B~d^@yDLuj0Ty=$Sll#S0=V7^3E+7vnDL_P;jTE3aGty3ZXfR2nno#) z>#iV?@2+4553lr4z+Le$0hsO!Z^frRfaA*JdMhrbJifQ$JJMuiq&%L0ia@Niu*~J^ zx+^4C-(69QX1=@P2%qLUmyzqOxSWhUZv{sHnmYwi45pntfdEXmn!lJg@cuz@{iQp? zF9Q|Ad8GMe;xwH3f#CW())K+uQ`a39gm%n2>X*_?2jXgs#T~VD;8kWzi zE2M+U_jgwyEw%q zdOD`2p6u(harV`996T4N+tef|l&-%RYS1^e$N&h$R!BVF^t#3=P z@tzk=A7!bFrb8O^8WC2WgpZ(?Jv|B2l_wz&$RU%XgohHS5Km1q%~>0QLGzvC88T^_ z(vz?iB%UWhrd>}0JBfBQ#~!x1HA114>)^3ME@JN0)Z;QEucjUhW_ajVu7igYY*f09 zD4>5WLJcYU*Spid(MA74aH3ECk|bB2hnE$UbZta3hzD~WEAPZO^{n39U#u!jMv<|O z!RDh|$D+uvHeeSGSVw~(X!S&hTgbYF#Mb*LH?1rXM68pLwk!?hS=K_Nv#n)#k6HyN ziCKrBP29=?rfvO+_Z+JY@442+D9^JBz$Ib*i1!}WeBkF>nQ_PzSP5hbt)XaCWc3D6 zvGpFxORTq%F17x`dzp0*+LT-O;l08-7oe5a8nj7T=it4{+Jus7>t)o|SXZEZt+f*A zI_r6q*IPUBp0a*~plRzN)HY}a)nfjTF{nX#`&ViHZf}Bmly~O8B}}{CnLkP%MaK2c z{8jQ4GIp#Je9he@uOdS~!TtCQ$$1wtIY;miE=xF(@cb{+{9aOyycX1iaR!Pa@jaX( zr@2m%FHzOy6nO*>^PW@WG^DjW_hRthxP|bYB5dV5MV>^4PLX-|%wGijAdWsobvni)YSRZ;ojx)GfuPC5_;CM|A+a-thQBb|Nb9%F0cHDJ7 z!fzt25M2MpZ((iyQ?B)G&%e@pd&PH~G~Hhx+zR3#s?*N6s>S~?!qh#_3K@OY8Tc9|}eEHSI( z(RHl|cELUEECgKURv+#L(d>2T3dkyM5M%rf&BP28SE>#@d6@!z*2NZ`U;7wWiryZE z^fg>5hWQvnFmuIxg;C*R-0YMN&?EKz@Px1WG+#7&0MZdOUkv4hlUlve*>8YeRzW|5 zYTR4&VPl3qR?4UH-eSZ;XVCz?wC*-E!gJ9{?$GD2fv_x-Gso7#1gRbEJcqW8-y&Tn zHTst~9CdTj5caQ;tb#sa3OtL}E^%@OB06?09@Z7X9BBi*?X8nf;&TSEj`zd$@=^TU zTrM3zsIO)3Uy(Z|BTK)-nk8P%4c z5|JPA#y@Km-msCq36&KFwSE|Pd=Ck`pEiW$*`}WkWVg%owJ0{TQ+^sxHj5m4u>KdW zspCWBx3Gr}(Mt~H7ofxV7B>CMg*_UXs~1_MuGI1)ShvF|VN67i6Y_>SjL5S0k?X<8 zvM?gc#!wkOctagVWZ8*8v3vaN+&M&NWZCmW^xsP8IEmEtkl&jwayNt_+z|4Pb3WKh z$G4`P^iX|D!Lu}naH12+foVSlB)m$0bXE@q);8x+d=xy~f;NXuorN|^x&J__e1P-A zP`#hH+Nm9;4-xk`Q-fsojAJQD1oz7Jw^jn~~0VDN_w$}h<2A{CMgM_gjxUfXn z4%4(>2I(1W5PZsDxIwfQ^{L>e_E@MX_7N*~=03;9v0I$wBlUW{w!+yqQa=gtcU$_6 zLV$x8dpEi3;(p(jbIe20PkBrZ&yH4M&rr{^;qLKt;d5<)R%)LO&y6`Rj@EY;^@RXt zFpvCm+=xr^&-vYXVT^uCK?v0%E3poc5u<$@CBsJigtPxxy{BGY;hZ;CA0UQ1oA9-S z#(y=_hUvI=m6Y3{+yQ@5t$2NZy83*o!8s)#`28?UD`t1F2)K(`r4k#p9RsakNLZXF~szr-SnoXwn>y9q6Wt$O4@K-#&# zBxNp-xkPSTHFAUW$oa?>YH@-F2kQoZ%E0ymKN>N3N@`3iCBy?U%qvE0j+LN4JAaMG zo<@q`2;KM| z;Iw1i^gTF=%8elH#JcK7kPgG44(puj!6^ZN@4=bvqb-PbL(4?Ep)It1H0i;SaGnQe z46wUAI0qgeJvjFf)eShIyuJsAXKmkuvkyq&MQ}YhPf{!|;3R}|wgOmO(+yy8Q-9E; zVy*{A0(c%AX1aNBa)ID`aK`y?*Va6StyGJ-9vl++9vo&W)$b#i*~JGF;IJ%+Xf8G9 z`2b5@d8Aik>BNbYNAtWsmykyNJ_6i6>wO}}C34+9yov2{`#eY@&+GHCPqWOG)b;vE zNqw)+F4A~GDm4&NDeF4&$sp&teblc>@JNCn6%HHJ?Ye#Xg2;FKO!Ei{QF_*a_e5!{G;l>-M>q2ws@We~94540oH3 z>wBr`I4z2iTt9d{EZ9`PRDhV_UkKoZi&R7zC*!(()IhjyA1W0cr>h4s!;Sdx-99oz zLee}PQ#7vEhkfySi;)5ABpBSUa0+%xrh5jBw8vD?2%GQe z_qoIQ&%yd|{nZ$MaG)%42NsJxT|WKguMJGd@X;(}a>zp_l^!xFc9Cf=ZJ?ATCu!!= z0o-CrW*{|`t8d8(NR7FIspFB_cNJ2gZBI85=W2I1(f_YrqRjufo9O>nFHz?I+)ZRq zgT9w&J+$L_iJ11iL=Ph4dx;)H#`hAvhzxh~&G;M{GC5I0Cg)Vhd>Tc##DzJB%-3a_ z6DsbxiDsf`&(N7ua#iTePSkXHi5|e?wC5!{1!*nceJJ2BD)?R^w(`A1TalrcXf{6c zHiP69B>v_lVx8|L%E5!J=Ox-(e$CbkA7_p4B`QOPoh`s;$fOG+WD?r*61|6X$gD=K z@kx^2#B3fI!!0O?7WaX)R*pRn85!(mCFI#pi!lt&>JekBKIu*S7TbX*u(qx_2plQw46?kv4HllifwQow(23q@rajUf*#DlCi z&~mVK5Z;Gar=Vmn>qQ7U)T)OLhFK9%4Ywi?cZ4+%0*$oxN9`!u!24lV4oVKU%J4qPx)1FqTOR}S2&)bv9%;P~ z;f}J(dSMwm+Df9|$5v6DIZLLN6M(Y(Q{3h#rkgc&cf#uEC{eZs3dK9&5t*gLzo%I!;) z;Qe;%4q)D4J%aZ;t%cxnmvs%^*ISc;u)#V7?{`}>wxAyyt!L4LP1Y_{-(v|d+iX1v zQSP;NgLsSe3f}Lt7Nh0;*3Ec-!1@)!J!stks)wxaAACk+!X`YzAn^McDef zh}2q)kH*$FMWn=;i|wpkMiX+;Zy{#D`p&+UGwEd&ti?JYob`juh}c8ull7y_ z=&>)D`AKFnhGr1L`q?;HUm)Bv#8gsuP_|Kngku|)-VWfXmPf+BElGfR`!1AIWC%ny#~2lo@6cj91#Ju zoRf~9gKrQC*{OgQuVq^+CJf#M*=y0qLdzERuRbAuhG<5SQ+>SNC&OARA&k4(bSUWV zv+{-gBYcqZIovAn{2B5aM};D<4~E~){fk;G5z!9<0MD(Y?n_m!HTQFJFIP^HNxAdc zvRdR3vOV`t>Y_%J{Epo8+}2vGR92nH55aqTdhW$+TCZT{XzjS8egL* z%tdZhE-#p@UZSuNxplck9P2(J(o0|p=^M21n!sa##^D{^LR>*HE}z zSsX?AF1NgDu+x5mUNro0Xt?@6A+(tpY+;5D^XiXVWx?31&~rNFlb1u;;?!WA?BRxo zAmw0FGvB%I1YE5|;9ylChXng5kY$54H9GFdBnR>U zGTBE>&UDI8)cdRNgG~(vX)WrzST)~KU&Djh)Jb(vX{$ng;9_VE`O9F|;lV0JR`buW!G6qF$Pq3u6;)!626jB}BdB>^@O1stdr`S}m*d zg8f*{@0`ib<^@NS85D%B44bZ3iWSbW)8SZKL=q|B*MS-e=#zXMXz@s-dcFxr^}yes zyq@BH=jD$|&Sd@q!_O$HbzHhCV7c7=p?;TZ>w;QJV|fP&@Ca}3$&n~m` z!H2J80d^AcVIa!kVw>bN%Kl-Xlm%4JkCn)O9Ej3g%3Gl1K$_`JuYljbs~JN^n^br9 z|4RaEp9?2;vTp8kCFoUOHU;{rzI?tw4Z^0t7&YQM7AT9m$LkBekS8r}OF-JOH0+s9 z`^kDztaL6oSwE>qL9VXyD(<7-6}NWvp(Ul2pC5>HO#-cEFjic={z?>@1Ky9=J-JOwP1#0&(zC~H~{KW3K{u# zP9y)uNsRIsZEzJbwu{j~s=du?a8CwP_mY`_y3NRqPWh>r{%u&+tL5ErZJ_2e=!qD-eh{^RK59ygQN~;ANsc)q z=X;$JjO&4%n00|%MR1gw|MlIt9mMrDUyV%RPjW!CTk&xilcMu0NRgg0YZluinV}SY zxv=I38ayd@y@0&*{lHwS`5Pa|@AEy{%dJ7qp!~p*50yCfY5LI24Nytda#G=^?AG#1 z5wA1U2biX?jH*%k!RX0}$~*b0cR00QGD0K1Qw>iv)Tij&2m82c|B~U_5B4MZ{fn23 zv8?56NlkPKmrr#$T?IbL130N(HiGm!KzJ?nwb#sTwVAD?*}rK7>5za5wA7{FtLjZ| ztL;A4c49fbPuB}F0<0D3M;_@UE%p8nism?%wBB#^h1aTGs~h2}#cQPm{mK(`Iyd%r zAWg&UN_1e2VRLis_*!AEm%0g|qH}GX^W5pUWailnJL-a@+_-Nx5^Rsz(fEcZ6$y}GImdcoA>`S+cTo5y8CeAeEiPz}Zlu16zu{z(7 z$6+Y7aeO3z?=jaqC!GPy9);FPxt5({BzTOX+UrtZD5jUG4=s5<)FLi5-2DJ^Y$^*b zHxgZ&NZvzedp{7_1Q{MV<9MLi(`us-<>SOTcOLQ7A-1J^EPdlFVy;XmHU64LO z=10(@#BXRP`4}LQhI{6~0^Nt4`xvor3!Ra(^!&Z^upX)&)O7VAb^a%ckJke_6q4Jx zbPo4=vBd4gNcO^6K1(l3pIV6q`+E&8&m}@ z>lyiQrf&4PiG}2yQvHdT;o>1(^nOoqE0=Q&Wu0?i?TQukNS=gaKelb*V;*}Y36d{WQns>?x6-ol;Z107Gy z&cd_xg76{0O@?co6=&;79iNY(@TAu{HBZt->)T4|pM9w>!7wVRQN5?sDDb70u|6o^ zbxfDkINf;rJ0>@r9zC6r=jdgj5`ZR8b&fwrPliS@eWY{QIeNqRPNb!d7a<}3sTb4r zXmqU2sN=$=dXkUSTnIEdsU0+vgPp5|DJXv8#KMTz_H_O_M=v~P9}K0Ey~>jvE56h? z3Y6>{GSvgg3eSD%O(bvL^+~bX0VKuB z*TNH#u5Wa<&en^@|L)6^_jh?vu%|pIVDm0{5?%6abE@X(soZX?c{N$zqs}>M4!$#T zE{;*E+n)$`$h>Z&z-Kd+hK2%VXgDa#Zhxwr4%oeV_Ju8|-!c1AloFK2j(%Pl2D8&S z3pNY!@;$Dd`^!V7rH{uS^~z*C{wVPI&v6mhysMk{di*CQJ80k~AaC+4cIZVhNIHk`yRvee_62&xXmi&`NYDFkIZCXNqZHM`Ly)e2 z!@2!jy=cM)q?P)vSK{M@q>Ki6N)I(u%ZMrD*_gbg?r!j8ZwDVc>TMR+07a&F5FYGpOFvdQjl&ia`Pd zPz#P{y(7F4m?#I|?9ajP>kfX(iJYg~p*JbnsZPatcsM)K8F?PQJI8j?6!1f8(pm3 zw#j3Fdewh#Fj3$S<~SFDlS4jB%fXC!Jlc{Ou4=ZL9daYxw+aP0%Ef4OU?aVYoy^7j zat@iVm*|H!IcLn*`%ga<0!U>PXkiM|tB@1*Ptos2rHga?p?Vj!z2!mRPk*HPNVEIX zAE-Vu4)#yM>uTC`Un%EbH0i7bdPTc$61}dbIJ?A;s}!4|zD6b?hD)*8^*1)Vd^Wv# zI@=}G;mqUmJ-J-EKrip*bLkhX1ea|&+*pcSPTLhjY|*!aQ=d)Fn-DB_H^q4&q1L_W zxD)!w31#$}CVHOv`Ol1ITtsV{s9K`R3D2mH4a5a z++r+7I-YFxoXlcfY$rXQ7CDF8m?Au#1+zz(_Y$x6}P9=?uY!si`pXB-i?NkCKZgIZ5 zK(EiRh4|dK5%u}cU_6zhT?i4&4}jmSArRi)PND4Eph8_MU@H+6#Yuc|suDDh}3IRuZHQMHPjOb!%;}>B`e-9`%doorfVIK_k zVA(;I@VHM!eF38pg&U1nc$o9ng?jpc!v>(NL>M;`bYa&}mWkMIV)hwG%xh=^_SrxN zCR>T5Fl1C5Llje@8Vq61#oL?%{-LY?eIyWd%dsddZgkE?;kdK083e>sVb5nv#;J(o zL}WdhKr~j0BL* zP@}Xotzb2qBB-$;1coxGQ6N_MDdd!Z2x?UP7%MCg)A*po{FyoYniU%sYL@fcMS6S+ z$ps=DFGpbkBOC=H9NE6GH-@WFEY$6K9Gr@`QPJn?k+)H$6^Ch^7pR|#bl3PeQSPcrD8Xd#mURs{qRSL?=HWa3K$+7{yyeTEA7H3!At z!1I-s7`SErB7Fk?uhjGZ)cJpfnP88z=Emlr8J0SRO=g)zr=vw4 z)2Xca<_kXBg6?RU?r00U&@x)q`3f$)C>zc4WL#a=3Uj1Sv!Xg*(qtIV zm9?TjdsLXh$;(6t#Wk&O z)@Jh;UxdwW#~H_#wYiCXK*t%!mQ`MApn0DB`eN2L8IGfr^>j=rOZNNOc;;#nCHOVK ztmopCyKnh#cy|NYvMP&t#LJU`Y+3i2ry!$n?pHYF4=ASmFFRSug4t{=|Km>97IUTF zcuS4aHvi*J)|M995`vm1P*AmAXH~~$*v|MX^`|nV!oSHuT}WyhzjGwh9J`Pl^$I&{ zYlM6g{I@k(j};P6OYq;;WIZl3rdDZZJs9Nop^^+O%X&D$HdRYepn?3g2>YnWU++%- zMqx%8I_X~sR_1v0FG>0&L(8&WR#*hr@)*ignf1Fp6-^WT?W3&!mN1P;g!-&MN=`+_ zOz^igv;HbM3mH4X%g?OcB@2<^e4mcbkhBZ@3XeU2nYprv1C8HukZB&F3dk%=69(nV zlmBQY+p@PKli21=xkk^M%Cw!}zn0047gLNvDMof~0mY~U+K2cI$zhcLS|&Ts;1{^^ zq^` zhs8o~{+4DmyMz@y1)YdbgRP@cgXui^Tbj|h z{U<3YR5Vu!byR}Cr5VjF<8o>zc(WbN%cD@03I3L5G(W-Vm`d=sG^0gw73rJcZ)rwL zD~Q$#c19k>y%st7Ww~gXu^Q>>zRoL);T8TJ$EBEA7{;Df&D-Kwqz9SFpsu);&Al;C z#&gAU?2CbvpeHS!klUV?pw}$kBQ_Qlfdt~Yw0M4ut%91xvTN~IG73hb!nxuF#(^k_ zcZGAsGsUrIAg(RrxojEFWy^RjTgG$QWl7N5GM>wp@m#iy=dxuymwj6u)NjjpE?dTP z*)p8Vmf>8s4Ck^tdSU;wWjL2D!@2A{Y+p%RhI82&8P8?QcrJT*C3I=acrIJUbJ;SU z%a-w6wv6YpO`L;z+cKWZmhoJ+jOVgtJeMuQxojEEWnY13_!e7+bJ;SS%a-9>whZU8 zWjL38PzE|1V#|0gTgG$QGM>wp@m#iy=dxuymo4MDY#GmGe+EIv*fO5WmhoJ+jOViV zMR}V&74PG18O~+Pa4uVhbJ-tb2bf^Xa4uVhbJ?pI)-chQ@m#iy=dxuymo4MDY#GmG z%XltZ#&g*+p39c;T(*qovSmD%E#tZDGN}4!TZVJlGMvkn;aqlm6~eh}8O~+Pa4uVh zbJ+;z%4pMU8P8?QcrIJUbJ;SU%a-w6wv6YpWjvQHwp@m#iy=dxuymt7C4f7mjf%a-w6HsiT2v1K@yEyKBN8O~+Pa4uVhbJ;SS%a-9> zwhZUW*fO5WmhoJ+jOVgtJeU0}7%Z`6JeMuwxojEFWy^RjTgG$QGM>wp@m#iy=dxuu zmo3A&Y#GjF%Wy7RhI836oXeKsT(%77vNJNC%a-w6wv6YpuL9$Bwv6YpWjvQH%jtqrz}=dxuumo3A&Y#GjF%Wy7RhI836oXeKsT(%77vTq)c zhEu|p@m#iy=dxuymo4MD>~8T~@g2r$tQ{3*{Nv!y1q)~#&%!mX-x#B;{jGka9SNtcL@j|)cKN~X%Cqud7zuJt_N$?IQ{+qjI^6VA= zJwZN!1l<(z|CX^8w+0F0I6}E*p~#k@T(%75vSlcjtwOm9*fx$(uD#K!P=<2F5z2KN za>YE%#SzLitH?R81aG0~Kd*O#x8it|+`^_Zcq@+J zEyh;KC!jcjx47$Q#oXfJ2;SlzXBRVgD~{l;M{z(cEN1Xl9Kl=6wHANQQ9nZxOP+n890d1aI-qW_qy<-ijl5ive1v7c+P(j^HiA%qeE@Rvf`w3}aYU%;2p! zg0~n@u&S8nmpFpAcsaSQn890d1aI9WVDH6`aTF1}#oWeX25-d?yv5u-#SGqxBY2BB z25&u`K?1H?z+fYW6^G29F}V2R0@M*Qsj-mB5iX!=;t1Z#LN{vX;h9~JC8mNnVzlzf z60i8;7Vp_#FNw_nq`kE-%I!~^@Caoehi5rmGuTM4Fvg)eZ)OWt*_58N`A>!9@j|b1 z&pg>f(5yO7qSWOvQ>z|dL`9XRJB{McQW!qL{n;P|OIbb^9G~H0+De&44`<+=7}xI=#vG3K(Ud zpOOK4xM%AobQFW?B>13}mK;ndylUlyXq+V+?a& zmT29Jxe6NEy2Ke&?w|%{?n_LfmnXl^ z>vs%5&G6jIVX&sC|B8Aak*I;(h;0j*JCHEg0ez&=rxd$v>U8!jAcFHC|Eou+!7Kwq zzC`C)2mnjBk~3x~n;^VwUV0x@Q2dxIST(O|k`fvY=1V0Sc*J zeQ32eIA5*Qld+T7cqBP?2B+pYC9Cwx0eq}5I(DE(z5Yd`n%RR-1Bv|<>1Y>0bn>XE zWSKbtvYfF>?>+KJ9=-YF>5aXq=aZs8?W@|Ot$c~jvPzK2-k;P&3+LGM`i0sUU9zLZ z*|ADb3|qxE*Ysf75Lzl@-Fi!t8NIi%m?fFs(qcv*^cZlBj$aql%2_i8_Tuzkt*69) zog-K4MJIj_sPq#0Tuw2|n8DprpG9p-D(G9j8eT<5#Y{6u?~NP={E#Y={fp5HagZ5m z+glMd`Br>H(!)K-EdRdJ*$$q=X3+I`oLNe@6mOMMqxM3y7g59Cg^?Q#ZrsDm(%Aay)?elhp908fyEIw>GhRT6IG`4%b|5M zem=0;%e86!Tb(3ybm*ZZrIBE0oZ3i*w}~y)3^TJ573EKHB^%+{6s}mEPn$wnnc@AH@-SAspK7 zUXEn>jOP1PFNBlzHI99=Uf*v>KQvz(4xO==YIm~VoZnVaOxA|0$b?rj;4=MYJ(>GF z&Fi+XtJL;}k{0KNoAvUX`P?Bkgym@oLN&bSJa@BRQTs|0iti1}P1WdlBr{+qJGd<@ z4)v~ZQd*M}yG1X}|IBB5Ww>1Rtqoj9+=9D7$+g4dIvrervN$YVwNQ2QjA?>#OA@Ot8e($%Y%UG@$7D_VT~Y3V|{f#xJA!bU7zbQp%6}Z ztzMohnO)G0*?G>uwfJp^L+d@%Q3{pO3+T})YxQJ5*`u)@SbIYs4#(bMbwuqLuX@<# z^>E^VW1WZB>Xl8B*F=xkK1!WuhQ%VcPYngs?~&d(?5CwJcI0p1t#|fX zr>8>Ha%!D(G8)uX<7kwYp7*+NlBSJWuXIuuZY4EVoAd+Do$K_zdZ^j?V4Yq#;1DjdobhwnWO_~lY^_}=4ih~n_Q$6;c63$|C(4_6%bQ@Z>i6jQ9G zYpD+B{af`ieO=o5<5s;UBk?{74P<+xIn}-h z$y+4O^i+xk?}g+<-`1qe>rnKDFGN84op>))q|`J?@%Vr|OzH_zUEr*}4Rf3iyQ<4i zhf3Vmu$p&o(<>~gwC70V7`Nlva6hNAa$cw^GeV*DeU%uO`v712 z0B3}%JbHPFcSdO7*Jy?i^t6m=JtH*I>sNo1v*6fJDBTHZRn z9URMjkI|sbQ_ns@6Ym5qP~5p*A6)$*DgGUda2qr_-dLbno5A7$7^A$>#&gd1j9J4_$qzH31=tFAHCE(q`FmD?t)GMiv@D+L_4uR?VLC)J7 z^r4kgxKpfCO;4^^S#8+((?3?}79uHap+kqZbd_gYLL)bUnH4PFAAS zS1M87_Cb)jsc3H!CrijldIyb&Yh^#C$~5+Y}RYrrDy{b z3kD81pKzQeT7&t#jFxe$sS!NrRtIxgQeLijmZ%SOe=F=ko#3j2L%joeTB245CqRV< z-iu#zlVJu8L3y3c(~p+g>dd=WFB_NuxN2QYg;T~!4YGAfP+qiRIckvqnY7f)V`cxu zc^Sl+={|9Ouv8IGS2I69nBwNgwd^$7c7AXGZCmawV>z6;LAke#z68RI;Uy81)>I>SSr)KJEa zF5q>oT}$n7;`gCz>-@%l20Xo_Uu0MQ4AiOv@kB-ZSHRPgmYU3E^_PG=G5_U`(UE@F zzVb1D2~>HymIC10M+y@H+(wC<+waqh2GVh$dh=ZX^GE70eF68p?*gekg!sM-VDP`3 z|Dp#2Hi5W_fkIyd+@s4;iuQ{@ZlI>{bL#z2!alHe z#s8f^h2r0)Fy0BI6~+iP-tPp4a_^FRwH)ww0{e1oXu;{zX~6FUjwT$9uUY;E_qzdU zjkK=|p%}5<>%t`L!lX@!SDdT|^s?!1`eMBHH#NNGt3iqJT3~=Okv3&^uLZ^^3mK6% zxFf$7I7|s~pDV=co)FWumg&yb;1*9oC#usg1ZrSH4?UpQHOD#fcL(B(i|NDICA=P! z?wa9=Q1=NSc3zgl4)(A-eVveuMG@RjVCr-julzl8pvfJ4r8`jo_9U~ab}TEe0iXk zNBl9jk;?;P7$Ku~9MbR;_84)6C+6`D68y@5bggmOYI&AsHzg3HqjOAw(tx2ppn>ne zgRAzGKuL)_YEMe9;!-&!P&JafBw5JKXKEnMwh?2|Gm5z37~0_R0T~BFPS!G12t1t2 zy)>+~JnB635V~g97s4K*N^{?T{|5%j4+KfcwyNtkOj_FtbMCPz^_WORUNH;95kzWJ(5-N~VcQ8&#f6?R&^n+a;6aS?BRQ5nuLk4u1st9yJU$Cl99I8R8E)hLh5C z)e7VfmLqUTT6O?=HOt!4x5>rH%a2H}rkSChvr;Y&jCElFh34YWkg7nz_eKucVfY)g zDDpoTk&I&5&cy&*Xv?LXM_(E-ZgGi(8Y3uQzC`DF6jnlgY4lN0?OOk*sqT-A&=Yy8 z{egb_JN)(^8C5Q8t$&hs@QxAM8|@Ec+xb30Hg+h*;2n=(Qd$Q2y<@bhr^^xP&E)rv zF-~b?V#6)${kw*L%1)*GI?p_cFCP7iXi~T9Jl(b_-6F4aJ4Wdid7??(N#*(lSXiZY zQJ}O7pN7;f3Y2zNWg1?VYl0CcLmHga?(NQTTlJEPYdPibH75mc(e&sbrxvHGhAphgTVxvgGwl~QCA+yBGCDMk1z%) za9Hp3BBy_>7zZZ-rG)@#Q?%)gGi=CV$g=DuhW&$lvrZ?i!lBp|W!o zcab0e%DD62xYL|$%C8l9y7QY(dw#RXPc96|S1jYCPB7(Xi+t{Y{QjC5%D{x&0fjC$ zFgEHP63P?>ilXVX=dX|fhm-5T*kbiV=)uw@)QHB8W_cdcsodcI&F}Qq@bri=5mV!< zQY%vFbRwp62pzg?b9DNQ$7H1aUM(pNGHxOi#_oSJy0C zK(f|AKrA~151!Q1v_ka#QBTCrkLe*Ji)ccTjhXgYrkFffX~3gIEDm^-Iy5|bR8OR- zWSZ(>IyHWHD(gDL;DBfuUi^1jhwAi`!4GWOLciy<{;`&muII(WU~60pBwNb>-iNGy zi10$#MzC7rAj<{$=sK%Av`k!gRVgz&IoMjDZ~^4&L*nWA4GOFkkkbO$ry#Qx z^1M)50SOgQjNhEqhZGmF&=8WyZGo&V$n1pV7D#u4gZ&F$V{iK@NNI&(IN_XrzrBS0 zi%y#=c`cCgx)>Yq$HV7np4YUUOBV6cIsI!b8$bV2@6z({m*@4(Sa?C7VKwb`LN2ym z(1*sBxM3(oynua&cS0$4U(l1Zay)*4hKQW(TZq>$=#6>hFGA64U~7e((@VO;x-8Sri1#@U+jdiE=YI`zzZeikm-f+(-2QbX|Uns}<>Qu1dP!KWk^U^$4?qSUx}>AEkW*h^jYChLzFf=qf6}L4 zHwui~41AxC&2=~HOo?^E?YK<4lGfku=j;e9{oPuM3p zVYoFOvYTMgH2%yy1>l0rCV(c;s5q;!{|CK#h|3A#Bo^NURH?_hp`Z!Er}1arDagJ% zAUqZ4{X?I<-t{8Ir6Nn;PiscyojcY^jsFnc0*}EM6*5$`9)A3kkYIVLv$%%{Kf0#>4;9)= z*Y$_#9O0gN0UA52!F@OMiE%mel>Z$`;(sSzyFo3k zW@o+OSXkwx5{`$&E}*E4nh#;?A*0Ittc9?rAXYC-ftuzu#+yH~AKpeNp zr`;m|GNe=C&Vkf-{$VW9YjeMaJG_uM4PvNGm~AcMu|TVx!fk9CWVJ)27anlK5HIAD ziRcZ~reA<47mU*j5+Q0m*sJ(+2)=3|4nR8I8)D>_q@PiGl%dh9!P*3gZis4v!EUfy z6F8!Sr$OWfmD77dj8mhi{wJC>a=K*I97t^CtV>=1VLyfB+w(OAR4gar2lNAtPVxB* z7+Hnmoe)N0P!^0+IRou;FH`fA+KaI5Jr`4G&!d6<)AUgQym^7t0;EnUPc*ZT(QH50AG#M*mzl z|55vMLXDFeSs8>;g^jk(r7o;7)F}3^2sK_eLZ8p3#{kPw>>;n`uIn*=cZ9JIv{KY; zhMf-J_t}h0thN~=w4u1#W)x||{p9r}ZK?M^onSl}8E${wjAaWrFwSn|YvXXV-PmTc zoq-gyGAFdsjbkpP;BmV#X^>4XN}#`Ua|}1lr9GKrJd@@y-du0ZrafCdbY}QWYZo<; z^wW??@lMBrT%#)1{x}pi!Pp9joefEE(Ved`*Vv+kPzRZhM!qpRgj!85R?%Ov>{r40 z9aGEsS%91Jjd3RTAIUfRz`BioTp5;88rma_c>iZ5#)cHlj&mj&ZK3gW!-%jh^Ix23 ze3KZnq<+N;&#K0y_ct!7U$wLmPtG+m)0*m6-M^xKiDyNlW%|msYi2He^d3)R^Ng{$c#07pQ&a!rr4KD%X%QL!?s-PhpwQ(j>KBu?zuRM!Wc$xI(`F)? z?eYAJkxXNWee{*utJAMSdS>JI{jqyleObOn`)0z|1@}Ir{Ao(bbg@{s*(lR;u$iSQ z4HZc6dmd+F2TLu+UY4pCslAV?F#aTAJ%P5L5#BC1_>G-DtY-YS;DJ}aiuNIFVEmcj zxvP{vjXap{bM!GjFL-r>@~#&A9riG`hNuJ_ZdCr~1*f3)G~oilC!3W2R>32&obg1# z!LQqxg&xMs1pjTVQX8orA}o#A#`q_KgJ0va1-lvV5`1in(&onic6+dou=WOqZ86GH z4~o>ldt8)|<@Z>(g#zgn9Q^K^OV~`9)*o>?v_aUx!f`aB$yH*_P8CR^#J320S$G6q zA&WGLU|vnf>aC>X7M;{~rSliDzX}@|ZxkH7qk0$m81EIlZ;w(7?1w&xJ&gZLaPS!( zU!eAkkv#RX;QxF@X^)}AveRgt0jDGM*Xo*2>tz=s{=vsxLq7^C2gQj9YtZ}*^m8{tl|y+}5#2gVP2 zu#WLr!GUxAo>gI6s2CaR^hl=Bo*p`G#RN|Yj>8Vdxh9UW1dfZ5Y_gPN?=~vXTC_b& zQVT^YaG+m6>JhAFyp}L$YWKG)@IVwcU<2cwg2#WSunbIEeuX~9oq~gpA*1^N<1Yj! zURBy-sP|#_J!)-)qiD>RZQphV9br3`GcFSxe2(8Z^f3Mr;SfvT4Ku`BK4xJX(R&9OIWicSuBTc*KWZc#=8i|Q92eaP+00dmA>|K!XF5J6P3{{ zv3&x|8S@4%nVJss5omjkuuJfnO6A`swijVF=j;wvMoJI`^|1V+M zdTcS*v4|#r(H(_xM5Ibe@OWqjdKi}oUSU&#ZTTaxlt8MR=78t5xuS zOJ$|iE2i6lKGyaLo^My$#|6KEJ#6ZrGW8j1zo4rx)YWAyr>j(mR5Ee4;Ac3 z`@a(AS3z>={8k2(X9+%rb&O95{#NQvVD9TXY$mK3*uh`P=2vQIj0&q?I){L84fc|h zK0ih}hey!%Jca#)h#!en5#KAOH)A#9-Gps=vgPBTUU086wx2PziP*zRJJ7s8MjvY* zGckQEQaEsfJ%c@jr+!0(ll@QY$SCjGf8P+L#`7=iqQyUWnN${*|B|c?6C4w#~ zNIfdMv#7O`sjJGA4a?~&H9Jn_$sfhWqhe|(dKixr9K4EX3brwx zOW3^c1f}XB>}K37+BdRQs0&m?EYDyc<6VM-SDd|qb|2w)1lP;ffw`jHjdhIwAUJrz z)>qif_^RMd(gDhC*Aj^xjI(IipKH=ba_@Ib;HB8hxKeQN+*%FVULrh0aPUHv2WS@q z;hzc)p51A~2Etmq83lUdo{xn;5#iuPz<_E4*Lu5^N(34TN*d+vQg5W_c9()_Kazdt&W1>|?xN zaPXquPtm@I@Cm`eiwiDd9plhMm6SV2tH`X8$RuJjVJ*kMdyny{9)0_`hJWQgBQ(Lk zrqgI2WE}m@f@vQbBf|6!rRzoahsLO|)=$*s_qdxcf8wBLcXB_%6MXsU!|HMow!N)o rVf))!2v!_65_IPyIODKU85aAD5*UfQ4;!PxYhG5DbsGMn)5!ckDsqUw diff --git a/src/onyx.c b/src/onyx.c index d0a6da5f..127b8247 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -53,7 +53,7 @@ typedef enum CompilerProgress { typedef struct CompilerState { OnyxCompileOptions* options; - bh_arena ast_arena, msg_arena, sp_arena; + bh_arena ast_arena, msg_arena, sp_arena; bh_allocator token_alloc, ast_alloc, msg_alloc, sp_alloc; bh_table(bh_file_contents) loaded_files; @@ -215,7 +215,7 @@ static i32 onyx_compile(CompilerState* compiler_state) { if (compiler_state->options->verbose_output) bh_printf("[Checking semantics]\n"); - OnyxSemPassState sp_state = onyx_sempass_create(compiler_state->sp_alloc, compiler_state->ast_alloc, &compiler_state->msgs); + SemState sp_state = onyx_sempass_create(compiler_state->sp_alloc, compiler_state->ast_alloc, &compiler_state->msgs); onyx_sempass(&sp_state, &compiler_state->parse_output); if (onyx_message_has_errors(&compiler_state->msgs)) { @@ -266,17 +266,8 @@ int main(int argc, char *argv[]) { global_heap_allocator = bh_managed_heap_allocator(&global_heap); OnyxCompileOptions compile_opts = compile_opts_parse(global_heap_allocator, argc, argv); - CompilerState compile_state = { - .parse_output = { - .top_level_bindings = NULL, - .nodes_to_process = NULL, - - .functions = NULL, - .globals = NULL, - }, - .wasm_mod = { 0 } - }; + CompilerState compile_state = { 0 }; compiler_state_init(&compile_state, &compile_opts); CompilerProgress compiler_progress = ONYX_COMPILER_PROGRESS_FAILED_READ; diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 05f34e44..a41720b7 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -1,20 +1,20 @@ #define BH_DEBUG #include "onyxsempass.h" -static b32 check_function(OnyxSemPassState* state, AstFunction* func); -static b32 check_block(OnyxSemPassState* state, AstBlock* block); -static b32 check_statement_chain(OnyxSemPassState* state, AstNode* start); -static b32 check_statement(OnyxSemPassState* state, AstNode* stmt); -static b32 check_assignment(OnyxSemPassState* state, AstAssign* assign); -static b32 check_return(OnyxSemPassState* state, AstReturn* retnode); -static b32 check_if(OnyxSemPassState* state, AstIf* ifnode); -static b32 check_while(OnyxSemPassState* state, AstWhile* whilenode); -static b32 check_call(OnyxSemPassState* state, AstCall* call); -static b32 check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop); -static b32 check_expression(OnyxSemPassState* state, AstTyped* expr); -static b32 check_global(OnyxSemPassState* state, AstGlobal* global); - -static b32 check_assignment(OnyxSemPassState* state, AstAssign* assign) { +static b32 check_function(SemState* state, AstFunction* func); +static b32 check_block(SemState* state, AstBlock* block); +static b32 check_statement_chain(SemState* state, AstNode* start); +static b32 check_statement(SemState* state, AstNode* stmt); +static b32 check_assignment(SemState* state, AstAssign* assign); +static b32 check_return(SemState* state, AstReturn* retnode); +static b32 check_if(SemState* state, AstIf* ifnode); +static b32 check_while(SemState* state, AstWhile* whilenode); +static b32 check_call(SemState* state, AstCall* call); +static b32 check_binaryop(SemState* state, AstBinaryOp* binop); +static b32 check_expression(SemState* state, AstTyped* expr); +static b32 check_global(SemState* state, AstGlobal* global); + +static b32 check_assignment(SemState* state, AstAssign* assign) { if (assign->lval->kind == Ast_Kind_Symbol) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNRESOLVED_SYMBOL, @@ -26,7 +26,7 @@ static b32 check_assignment(OnyxSemPassState* state, AstAssign* assign) { if ((assign->lval->flags & Ast_Flag_Const) != 0 && assign->lval->type != NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_ASSIGN_CONST, - assign->base.token->pos, + assign->token->pos, assign->lval->token->text, assign->lval->token->length); return 1; } @@ -34,7 +34,7 @@ static b32 check_assignment(OnyxSemPassState* state, AstAssign* assign) { if ((assign->lval->flags & Ast_Flag_Lval) == 0) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_NOT_LVAL, - assign->base.token->pos, + assign->token->pos, assign->lval->token->text, assign->lval->token->length); return 1; } @@ -51,7 +51,7 @@ static b32 check_assignment(OnyxSemPassState* state, AstAssign* assign) { if (!types_are_compatible(assign->lval->type, assign->expr->type)) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_ASSIGNMENT_TYPE_MISMATCH, - assign->base.token->pos, + assign->token->pos, type_get_name(assign->lval->type), type_get_name(assign->expr->type)); return 1; @@ -61,7 +61,7 @@ static b32 check_assignment(OnyxSemPassState* state, AstAssign* assign) { return 0; } -static b32 check_return(OnyxSemPassState* state, AstReturn* retnode) { +static b32 check_return(SemState* state, AstReturn* retnode) { if (retnode->expr) { if (check_expression(state, retnode->expr)) return 1; @@ -77,7 +77,7 @@ static b32 check_return(OnyxSemPassState* state, AstReturn* retnode) { if (state->expected_return_type->Basic.size > 0) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - retnode->base.token->pos, + retnode->token->pos, "returning from non-void function without value"); return 1; } @@ -86,7 +86,7 @@ static b32 check_return(OnyxSemPassState* state, AstReturn* retnode) { return 0; } -static b32 check_if(OnyxSemPassState* state, AstIf* ifnode) { +static b32 check_if(SemState* state, AstIf* ifnode) { if (check_expression(state, ifnode->cond)) return 1; if (!type_is_bool(ifnode->cond->type)) { @@ -103,7 +103,7 @@ static b32 check_if(OnyxSemPassState* state, AstIf* ifnode) { return 0; } -static b32 check_while(OnyxSemPassState* state, AstWhile* whilenode) { +static b32 check_while(SemState* state, AstWhile* whilenode) { if (check_expression(state, whilenode->cond)) return 1; if (!type_is_bool(whilenode->cond->type)) { @@ -117,33 +117,33 @@ static b32 check_while(OnyxSemPassState* state, AstWhile* whilenode) { return check_block(state, whilenode->body); } -static b32 check_call(OnyxSemPassState* state, AstCall* call) { +static b32 check_call(SemState* state, AstCall* call) { AstFunction* callee = (AstFunction *) call->callee; - if (callee->base.kind == Ast_Kind_Symbol) { + if (callee->kind == Ast_Kind_Symbol) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNRESOLVED_SYMBOL, - callee->base.token->pos, - callee->base.token->text, callee->base.token->length); + callee->token->pos, + callee->token->text, callee->token->length); return 1; } - if (callee->base.type == NULL) { - callee->base.type = type_build_from_ast(state->node_allocator, callee->base.type_node); + if (callee->type == NULL) { + callee->type = type_build_from_ast(state->node_allocator, callee->type_node); } - if (callee->base.type->kind != Type_Kind_Function) { + if (callee->type->kind != Type_Kind_Function) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_CALL_NON_FUNCTION, - call->base.token->pos, - callee->base.token->text, callee->base.token->length); + call->token->pos, + callee->token->text, callee->token->length); return 1; } // NOTE: If we calling an intrinsic function, translate the // call into an intrinsic call node. - if (callee->base.flags & Ast_Flag_Intrinsic) { - call->base.kind = Ast_Kind_Intrinsic_Call; + if (callee->flags & Ast_Flag_Intrinsic) { + call->kind = Ast_Kind_Intrinsic_Call; call->callee = NULL; token_toggle_end(callee->intrinsic_name); @@ -203,7 +203,7 @@ static b32 check_call(OnyxSemPassState* state, AstCall* call) { token_toggle_end(callee->intrinsic_name); } - call->base.type = callee->base.type->Function.return_type; + call->type = callee->type->Function.return_type; AstLocal* formal_param = callee->params; AstArgument* actual_param = call->arguments; @@ -212,30 +212,30 @@ static b32 check_call(OnyxSemPassState* state, AstCall* call) { while (formal_param != NULL && actual_param != NULL) { if (check_expression(state, (AstTyped *) actual_param)) return 1; - if (formal_param->base.type == NULL) { - formal_param->base.type = type_build_from_ast(state->node_allocator, formal_param->base.type_node); + if (formal_param->type == NULL) { + formal_param->type = type_build_from_ast(state->node_allocator, formal_param->type_node); } - if (!types_are_compatible(formal_param->base.type, actual_param->base.type)) { + if (!types_are_compatible(formal_param->type, actual_param->type)) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_FUNCTION_PARAM_TYPE_MISMATCH, - actual_param->base.token->pos, - callee->base.token->text, callee->base.token->length, - type_get_name(formal_param->base.type), + actual_param->token->pos, + callee->token->text, callee->token->length, + type_get_name(formal_param->type), arg_pos, - type_get_name(actual_param->base.type)); + type_get_name(actual_param->type)); return 1; } arg_pos++; - formal_param = (AstLocal *) formal_param->base.next; - actual_param = (AstArgument *) actual_param->base.next; + formal_param = (AstLocal *) formal_param->next; + actual_param = (AstArgument *) actual_param->next; } if (formal_param != NULL && actual_param == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - call->base.token->pos, + call->token->pos, "too few arguments to function call"); return 1; } @@ -243,7 +243,7 @@ static b32 check_call(OnyxSemPassState* state, AstCall* call) { if (formal_param == NULL && actual_param != NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - call->base.token->pos, + call->token->pos, "too many arguments to function call"); return 1; } @@ -251,14 +251,14 @@ static b32 check_call(OnyxSemPassState* state, AstCall* call) { return 0; } -static b32 check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { +static b32 check_binaryop(SemState* state, AstBinaryOp* binop) { if (check_expression(state, binop->left)) return 1; if (check_expression(state, binop->right)) return 1; if (binop->left->type == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNRESOLVED_TYPE, - binop->base.token->pos, + binop->token->pos, NULL, 0); return 1; } @@ -266,7 +266,7 @@ static b32 check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { if (binop->right->type == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNRESOLVED_TYPE, - binop->base.token->pos, + binop->token->pos, NULL, 0); return 1; } @@ -275,7 +275,7 @@ static b32 check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { || type_is_pointer(binop->right->type)) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - binop->base.token->pos, + binop->token->pos, "binary operations are not supported for pointers (yet)."); return 1; } @@ -283,7 +283,7 @@ static b32 check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { if (!types_are_compatible(binop->left->type, binop->right->type)) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, - binop->base.token->pos, + binop->token->pos, type_get_name(binop->left->type), type_get_name(binop->right->type)); return 1; @@ -291,15 +291,15 @@ static b32 check_binaryop(OnyxSemPassState* state, AstBinaryOp* binop) { if (binop->operation >= Binary_Op_Equal && binop->operation <= Binary_Op_Greater_Equal) { - binop->base.type = &basic_types[Basic_Kind_Bool]; + binop->type = &basic_types[Basic_Kind_Bool]; } else { - binop->base.type = binop->left->type; + binop->type = binop->left->type; } return 0; } -static b32 check_expression(OnyxSemPassState* state, AstTyped* expr) { +static b32 check_expression(SemState* state, AstTyped* expr) { if (expr->kind > Ast_Kind_Type_Start && expr->kind < Ast_Kind_Type_End) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, @@ -378,14 +378,14 @@ static b32 check_expression(OnyxSemPassState* state, AstTyped* expr) { return retval; } -static b32 check_global(OnyxSemPassState* state, AstGlobal* global) { - if (global->base.type == NULL) - global->base.type = type_build_from_ast(state->allocator, global->base.type_node); +static b32 check_global(SemState* state, AstGlobal* global) { + if (global->type == NULL) + global->type = type_build_from_ast(state->allocator, global->type_node); - if (global->base.type == NULL) { + if (global->type == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNRESOLVED_TYPE, - global->base.token->pos, + global->token->pos, global->exported_name->text, global->exported_name->length); @@ -395,7 +395,7 @@ static b32 check_global(OnyxSemPassState* state, AstGlobal* global) { return 0; } -static b32 check_statement(OnyxSemPassState* state, AstNode* stmt) { +static b32 check_statement(SemState* state, AstNode* stmt) { switch (stmt->kind) { case Ast_Kind_Assignment: return check_assignment(state, (AstAssign *) stmt); case Ast_Kind_Return: return check_return(state, (AstReturn *) stmt); @@ -408,7 +408,7 @@ static b32 check_statement(OnyxSemPassState* state, AstNode* stmt) { } } -static b32 check_statement_chain(OnyxSemPassState* state, AstNode* start) { +static b32 check_statement_chain(SemState* state, AstNode* start) { while (start) { if (check_statement(state, start)) return 1; start = start->next; @@ -417,15 +417,15 @@ static b32 check_statement_chain(OnyxSemPassState* state, AstNode* start) { return 0; } -static b32 check_block(OnyxSemPassState* state, AstBlock* block) { +static b32 check_block(SemState* state, AstBlock* block) { if (check_statement_chain(state, block->body)) return 1; forll(AstLocal, local, block->locals->last_local, prev_local) { - if (local->base.type == NULL) { + if (local->type == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNRESOLVED_TYPE, - local->base.token->pos, - local->base.token->text, local->base.token->length); + local->token->pos, + local->token->text, local->token->length); return 1; } } @@ -433,54 +433,54 @@ static b32 check_block(OnyxSemPassState* state, AstBlock* block) { return 0; } -static b32 check_function(OnyxSemPassState* state, AstFunction* func) { - for (AstLocal *param = func->params; param != NULL; param = (AstLocal *) param->base.next) { - if (param->base.type == NULL) { - param->base.type = type_build_from_ast(state->node_allocator, param->base.type_node); +static b32 check_function(SemState* state, AstFunction* func) { + for (AstLocal *param = func->params; param != NULL; param = (AstLocal *) param->next) { + if (param->type == NULL) { + param->type = type_build_from_ast(state->node_allocator, param->type_node); } - if (param->base.type == NULL) { + if (param->type == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - param->base.token->pos, + param->token->pos, "function parameter types must be known"); return 1; } - if (param->base.type->Basic.size == 0) { + if (param->type->Basic.size == 0) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - param->base.token->pos, + param->token->pos, "function parameters must have non-void types"); return 1; } } - if (func->base.type == NULL) { - func->base.type = type_build_from_ast(state->node_allocator, func->base.type_node); + if (func->type == NULL) { + func->type = type_build_from_ast(state->node_allocator, func->type_node); } - if ((func->base.flags & Ast_Flag_Exported) != 0) { - if ((func->base.flags & Ast_Flag_Foreign) != 0) { + if ((func->flags & Ast_Flag_Exported) != 0) { + if ((func->flags & Ast_Flag_Foreign) != 0) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - func->base.token->pos, + func->token->pos, "exporting a foreign function"); return 1; } - if ((func->base.flags & Ast_Flag_Intrinsic) != 0) { + if ((func->flags & Ast_Flag_Intrinsic) != 0) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - func->base.token->pos, + func->token->pos, "exporting a intrinsic function"); return 1; } - if ((func->base.flags & Ast_Flag_Inline) != 0) { + if ((func->flags & Ast_Flag_Inline) != 0) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - func->base.token->pos, + func->token->pos, "exporting a inlined function"); return 1; } @@ -488,13 +488,13 @@ static b32 check_function(OnyxSemPassState* state, AstFunction* func) { if (func->exported_name == NULL) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_LITERAL, - func->base.token->pos, + func->token->pos, "exporting function without a name"); return 1; } } - state->expected_return_type = func->base.type->Function.return_type; + state->expected_return_type = func->type->Function.return_type; if (func->body) { return check_block(state, func->body); } @@ -502,7 +502,7 @@ static b32 check_function(OnyxSemPassState* state, AstFunction* func) { return 0; } -static b32 check_node(OnyxSemPassState* state, AstNode* node) { +static b32 check_node(SemState* state, AstNode* node) { switch (node->kind) { case Ast_Kind_Function: return check_function(state, (AstFunction *) node); case Ast_Kind_Block: return check_block(state, (AstBlock *) node); @@ -516,7 +516,7 @@ static b32 check_node(OnyxSemPassState* state, AstNode* node) { } } -void onyx_type_check(OnyxSemPassState* state, ParserOutput* program) { +void onyx_type_check(SemState* state, ParserOutput* program) { bh_arr_each(AstNode *, node, program->nodes_to_process) { check_node(state, *node); diff --git a/src/onyxparser.c b/src/onyxparser.c index a8ef82ec..6e860082 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -88,18 +88,18 @@ static OnyxToken* expect_token(OnyxParser* parser, TokenType token_type) { static AstNumLit* parse_numeric_literal(OnyxParser* parser) { AstNumLit* lit_node = make_node(AstNumLit, Ast_Kind_Literal); - lit_node->base.token = expect_token(parser, Token_Type_Literal_Numeric); - lit_node->base.flags |= Ast_Flag_Comptime; + lit_node->token = expect_token(parser, Token_Type_Literal_Numeric); + lit_node->flags |= Ast_Flag_Comptime; lit_node->value.l = 0ll; AstType* type; - token_toggle_end(lit_node->base.token); - char* tok = lit_node->base.token->text; + token_toggle_end(lit_node->token); + char* tok = lit_node->token->text; // NOTE: charset_contains() behaves more like string_contains() // so I'm using it in this case if (charset_contains(tok, '.')) { - if (tok[lit_node->base.token->length - 1] == 'f') { + if (tok[lit_node->token->length - 1] == 'f') { type = (AstType *) &basic_type_f32; lit_node->value.f = strtof(tok, NULL); } else { @@ -117,8 +117,8 @@ static AstNumLit* parse_numeric_literal(OnyxParser* parser) { lit_node->value.l = value; } - lit_node->base.type_node = type; - token_toggle_end(lit_node->base.token); + lit_node->type_node = type; + token_toggle_end(lit_node->token); return lit_node; } @@ -154,7 +154,7 @@ static AstTyped* parse_factor(OnyxParser* parser) { negate_node->expr = factor; if ((factor->flags & Ast_Flag_Comptime) != 0) { - negate_node->base.flags |= Ast_Flag_Comptime; + negate_node->flags |= Ast_Flag_Comptime; } retval = (AstTyped *) negate_node; @@ -165,11 +165,11 @@ static AstTyped* parse_factor(OnyxParser* parser) { { AstUnaryOp* not_node = make_node(AstUnaryOp, Ast_Kind_Unary_Op); not_node->operation = Unary_Op_Not; - not_node->base.token = expect_token(parser, '!'); + not_node->token = expect_token(parser, '!'); not_node->expr = parse_factor(parser); if ((not_node->expr->flags & Ast_Flag_Comptime) != 0) { - not_node->base.flags |= Ast_Flag_Comptime; + not_node->flags |= Ast_Flag_Comptime; } retval = (AstTyped *) not_node; @@ -189,19 +189,19 @@ static AstTyped* parse_factor(OnyxParser* parser) { // NOTE: Function call AstCall* call_node = make_node(AstCall, Ast_Kind_Call); - call_node->base.token = expect_token(parser, '('); + call_node->token = expect_token(parser, '('); call_node->callee = (AstNode *) sym_node; AstArgument** prev = &call_node->arguments; AstArgument* curr = NULL; while (parser->curr->type != ')') { curr = make_node(AstArgument, Ast_Kind_Argument); - curr->base.token = parser->curr; + curr->token = parser->curr; curr->value = parse_expression(parser); - if (curr != NULL && curr->base.kind != Ast_Kind_Error) { + if (curr != NULL && curr->kind != Ast_Kind_Error) { *prev = curr; - prev = (AstArgument **) &curr->base.next; + prev = (AstArgument **) &curr->next; } if (parser->curr->type == ')') @@ -231,8 +231,8 @@ static AstTyped* parse_factor(OnyxParser* parser) { case Token_Type_Literal_True: { AstNumLit* bool_node = make_node(AstNumLit, Ast_Kind_Literal); - bool_node->base.type_node = (AstType *) &basic_type_bool; - bool_node->base.token = expect_token(parser, Token_Type_Literal_True); + bool_node->type_node = (AstType *) &basic_type_bool; + bool_node->token = expect_token(parser, Token_Type_Literal_True); bool_node->value.i = 1; retval = (AstTyped *) bool_node; break; @@ -241,8 +241,8 @@ static AstTyped* parse_factor(OnyxParser* parser) { case Token_Type_Literal_False: { AstNumLit* bool_node = make_node(AstNumLit, Ast_Kind_Literal); - bool_node->base.type_node = (AstType *) &basic_type_bool; - bool_node->base.token = expect_token(parser, Token_Type_Literal_False); + bool_node->type_node = (AstType *) &basic_type_bool; + bool_node->token = expect_token(parser, Token_Type_Literal_False); bool_node->value.i = 0; retval = (AstTyped *) bool_node; break; @@ -260,7 +260,7 @@ static AstTyped* parse_factor(OnyxParser* parser) { consume_token(parser); AstUnaryOp* cast_node = make_node(AstUnaryOp, Ast_Kind_Unary_Op); - cast_node->base.type_node = parse_type(parser); + cast_node->type_node = parse_type(parser); cast_node->operation = Unary_Op_Cast; cast_node->expr = retval; retval = (AstTyped *) cast_node; @@ -338,7 +338,7 @@ static AstTyped* parse_expression(OnyxParser* parser) { AstBinaryOp* bin_op = make_node(AstBinaryOp, Ast_Kind_Binary_Op); bin_op->operation = bin_op_kind; - bin_op->base.token = bin_op_tok; + bin_op->token = bin_op_tok; while ( !bh_arr_is_empty(tree_stack) && get_precedence(bh_arr_last(tree_stack)->operation) >= get_precedence(bin_op_kind)) @@ -359,7 +359,7 @@ static AstTyped* parse_expression(OnyxParser* parser) { bin_op->right = right; if ((left->flags & Ast_Flag_Comptime) != 0 && (right->flags & Ast_Flag_Comptime) != 0) { - bin_op->base.flags |= Ast_Flag_Comptime; + bin_op->flags |= Ast_Flag_Comptime; } } } @@ -416,7 +416,7 @@ static AstWhile* parse_while_stmt(OnyxParser* parser) { AstBlock* body = parse_block(parser); AstWhile* while_node = make_node(AstWhile, Ast_Kind_While); - while_node->base.token = while_token; + while_node->token = while_token; while_node->cond = cond; while_node->body = body; @@ -453,19 +453,19 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { } AstLocal* local = make_node(AstLocal, Ast_Kind_Local); - local->base.token = symbol; - local->base.type_node = type_node; - local->base.flags |= Ast_Flag_Lval; // NOTE: DELETE + local->token = symbol; + local->type_node = type_node; + local->flags |= Ast_Flag_Lval; // NOTE: DELETE *ret = (AstNode *) local; if (parser->curr->type == '=' || parser->curr->type == ':') { if (parser->curr->type == ':') { - local->base.flags |= Ast_Flag_Const; + local->flags |= Ast_Flag_Const; } AstAssign* assignment = make_node(AstAssign, Ast_Kind_Assignment); - local->base.next = (AstNode *) assignment; - assignment->base.token = parser->curr; + local->next = (AstNode *) assignment; + assignment->token = parser->curr; consume_token(parser); AstTyped* expr = parse_expression(parser); @@ -473,7 +473,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { token_toggle_end(parser->curr); onyx_message_add(parser->msgs, ONYX_MESSAGE_TYPE_EXPECTED_EXPRESSION, - assignment->base.token->pos, + assignment->token->pos, parser->curr->text); token_toggle_end(parser->curr); return 1; @@ -491,7 +491,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { case '=': { AstAssign* assignment = make_node(AstAssign, Ast_Kind_Assignment); - assignment->base.token = parser->curr; + assignment->token = parser->curr; consume_token(parser); AstNode* lval = make_node(AstNode, Ast_Kind_Symbol); @@ -519,7 +519,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { AstBinaryOp* bin_op_node = make_node(AstBinaryOp, Ast_Kind_Binary_Op); bin_op_node->operation = bin_op; - bin_op_node->base.token = parser->curr; + bin_op_node->token = parser->curr; consume_token(parser); AstTyped* expr = parse_expression(parser); @@ -530,7 +530,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { bin_op_node->right = expr; AstAssign* assign_node = make_node(AstAssign, Ast_Kind_Assignment); - assign_node->base.token = bin_op_node->base.token; + assign_node->token = bin_op_node->token; // TODO: Maybe I don't need to make another lval node? AstNode* lval = make_node(AstNode, Ast_Kind_Symbol); @@ -553,7 +553,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { // 'return' ? static AstReturn* parse_return_statement(OnyxParser* parser) { AstReturn* return_node = make_node(AstReturn, Ast_Kind_Return); - return_node->base.token = expect_token(parser, Token_Type_Keyword_Return); + return_node->token = expect_token(parser, Token_Type_Keyword_Return); AstTyped* expr = NULL; @@ -688,7 +688,7 @@ static AstType* parse_type(OnyxParser* parser) { if (parser->curr->type == '^') { consume_token(parser); AstPointerType* new = make_node(AstPointerType, Ast_Kind_Pointer_Type); - new->base.flags |= Basic_Flag_Pointer; + new->flags |= Basic_Flag_Pointer; *next_insertion = (AstType *) new; next_insertion = &new->elem; } @@ -743,14 +743,14 @@ static AstLocal* parse_function_params(OnyxParser* parser) { expect_token(parser, ':'); curr_param = make_node(AstLocal, Ast_Kind_Param); - curr_param->base.token = symbol; - curr_param->base.flags |= Ast_Flag_Const; - curr_param->base.type_node = parse_type(parser); + curr_param->token = symbol; + curr_param->flags |= Ast_Flag_Const; + curr_param->type_node = parse_type(parser); if (first_param == NULL) first_param = curr_param; - curr_param->base.next = NULL; - if (trailer) trailer->base.next = (AstNode *) curr_param; + curr_param->next = NULL; + if (trailer) trailer->next = (AstNode *) curr_param; trailer = curr_param; } @@ -779,11 +779,11 @@ static b32 parse_possible_directive(OnyxParser* parser, const char* dir) { static AstFunction* parse_function_definition(OnyxParser* parser) { AstFunction* func_def = make_node(AstFunction, Ast_Kind_Function); - func_def->base.token = expect_token(parser, Token_Type_Keyword_Proc); + func_def->token = expect_token(parser, Token_Type_Keyword_Proc); while (parser->curr->type == '#') { if (parse_possible_directive(parser, "intrinsic")) { - func_def->base.flags |= Ast_Flag_Intrinsic; + func_def->flags |= Ast_Flag_Intrinsic; if (parser->curr->type == Token_Type_Literal_String) { OnyxToken* str_token = expect_token(parser, Token_Type_Literal_String); @@ -792,18 +792,18 @@ static AstFunction* parse_function_definition(OnyxParser* parser) { } else if (parse_possible_directive(parser, "inline")) { - func_def->base.flags |= Ast_Flag_Inline; + func_def->flags |= Ast_Flag_Inline; } else if (parse_possible_directive(parser, "foreign")) { func_def->foreign_module = expect_token(parser, Token_Type_Literal_String); func_def->foreign_name = expect_token(parser, Token_Type_Literal_String); - func_def->base.flags |= Ast_Flag_Foreign; + func_def->flags |= Ast_Flag_Foreign; } else if (parse_possible_directive(parser, "export")) { - func_def->base.flags |= Ast_Flag_Exported; + func_def->flags |= Ast_Flag_Exported; if (parser->curr->type == Token_Type_Literal_String) { OnyxToken* str_token = expect_token(parser, Token_Type_Literal_String); @@ -835,23 +835,23 @@ static AstFunction* parse_function_definition(OnyxParser* parser) { u64 param_count = 0; for (AstLocal* param = params; param != NULL; - param = (AstLocal *) param->base.next) + param = (AstLocal *) param->next) param_count++; AstFunctionType* type_node = bh_alloc(parser->allocator, sizeof(AstFunctionType) + param_count * sizeof(AstType *)); - type_node->base.kind = Ast_Kind_Function_Type; + type_node->kind = Ast_Kind_Function_Type; type_node->param_count = param_count; type_node->return_type = return_type; u32 i = 0; for (AstLocal* param = params; param != NULL; - param = (AstLocal *) param->base.next) { - type_node->params[i] = param->base.type_node; + param = (AstLocal *) param->next) { + type_node->params[i] = param->type_node; i++; } - func_def->base.type_node = (AstType *) type_node; + func_def->type_node = (AstType *) type_node; func_def->body = parse_block(parser); @@ -861,18 +861,18 @@ static AstFunction* parse_function_definition(OnyxParser* parser) { // 'global' static AstTyped* parse_global_declaration(OnyxParser* parser) { AstGlobal* global_node = make_node(AstGlobal, Ast_Kind_Global); - global_node->base.token = expect_token(parser, Token_Type_Keyword_Global); + global_node->token = expect_token(parser, Token_Type_Keyword_Global); while (parser->curr->type == '#') { if (parse_possible_directive(parser, "foreign")) { global_node->foreign_module = expect_token(parser, Token_Type_Literal_String); global_node->foreign_name = expect_token(parser, Token_Type_Literal_String); - global_node->base.flags |= Ast_Flag_Foreign; + global_node->flags |= Ast_Flag_Foreign; } else if (parse_possible_directive(parser, "export")) { - global_node->base.flags |= Ast_Flag_Exported; + global_node->flags |= Ast_Flag_Exported; if (parser->curr->type == Token_Type_Literal_String) { OnyxToken* str_token = expect_token(parser, Token_Type_Literal_String); @@ -891,8 +891,8 @@ static AstTyped* parse_global_declaration(OnyxParser* parser) { } } - global_node->base.type_node = parse_type(parser); - global_node->base.flags |= Ast_Flag_Lval; + global_node->type_node = parse_type(parser); + global_node->flags |= Ast_Flag_Lval; bh_arr_push(parser->results.nodes_to_process, (AstNode *) global_node); @@ -923,7 +923,7 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) { case Token_Type_Keyword_Use: { AstUse* use_node = make_node(AstUse, Ast_Kind_Use); - use_node->base.token = expect_token(parser, Token_Type_Keyword_Use); + use_node->token = expect_token(parser, Token_Type_Keyword_Use); use_node->filename = expect_token(parser, Token_Type_Literal_String); return (AstNode *) use_node; @@ -957,7 +957,7 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) { } AstBinding* binding = make_node(AstBinding, Ast_Kind_Binding); - binding->base.token = symbol; + binding->token = symbol; binding->node = (AstNode *) node; return (AstNode *) binding; diff --git a/src/onyxsempass.c b/src/onyxsempass.c index 68ea2e2d..bc1d8524 100644 --- a/src/onyxsempass.c +++ b/src/onyxsempass.c @@ -2,8 +2,8 @@ #include "onyxsempass.h" #include "onyxutils.h" -OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs) { - OnyxSemPassState state = { +SemState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc, OnyxMessages* msgs) { + SemState state = { .allocator = alloc, .node_allocator = node_alloc, @@ -23,13 +23,13 @@ OnyxSemPassState onyx_sempass_create(bh_allocator alloc, bh_allocator node_alloc // WASM, this function may not be needed. It brings all of the locals // defined in sub-scopes up to the function-block level. This is a // requirement of WASM, but not of other targets. -static void collapse_scopes(ParserOutput* program) { +static void hoist_locals(ParserOutput* program) { bh_arr(AstBlock*) traversal_queue = NULL; bh_arr_new(global_scratch_allocator, traversal_queue, 4); bh_arr_set_length(traversal_queue, 0); bh_arr_each(AstFunction *, func, program->functions) { - if ((*func)->base.flags & Ast_Flag_Intrinsic) continue; + if ((*func)->flags & Ast_Flag_Intrinsic) continue; AstLocalGroup* top_locals = (*func)->body->locals; @@ -37,7 +37,7 @@ static void collapse_scopes(ParserOutput* program) { while (!bh_arr_is_empty(traversal_queue)) { AstBlock* block = traversal_queue[0]; - if (block->base.kind == Ast_Kind_If) { + if (block->kind == Ast_Kind_If) { AstIf* if_node = (AstIf *) block; if (if_node->true_block.as_block != NULL) bh_arr_push(traversal_queue, if_node->true_block.as_block); @@ -81,12 +81,12 @@ static void collapse_scopes(ParserOutput* program) { } } -void onyx_sempass(OnyxSemPassState* state, ParserOutput* program) { +void onyx_sempass(SemState* state, ParserOutput* program) { onyx_resolve_symbols(state, program); if (onyx_message_has_errors(state->msgs)) return; onyx_type_check(state, program); if (onyx_message_has_errors(state->msgs)) return; - collapse_scopes(program); + hoist_locals(program); } diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 2aa84b35..0db1bb0b 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -1,40 +1,40 @@ #define BH_DEBUG #include "onyxsempass.h" -static void symbol_introduce(OnyxSemPassState* state, OnyxToken* tkn, AstNode* symbol); -static void symbol_basic_type_introduce(OnyxSemPassState* state, AstBasicType* basic_type); -static b32 symbol_unique_introduce(OnyxSemPassState* state, OnyxToken* tkn, AstNode* symbol); -static void symbol_remove(OnyxSemPassState* state, OnyxToken* tkn); -static AstNode* symbol_resolve(OnyxSemPassState* state, OnyxToken* tkn); -static void local_group_enter(OnyxSemPassState* state, AstLocalGroup* local_group); -static void local_group_leave(OnyxSemPassState* state); - -static AstType* symres_type(OnyxSemPassState* state, AstType* type); -static void symres_local(OnyxSemPassState* state, AstLocal** local); -static void symres_call(OnyxSemPassState* state, AstCall* call); -static void symres_expression(OnyxSemPassState* state, AstTyped** expr); -static void symres_assignment(OnyxSemPassState* state, AstAssign* assign); -static void symres_return(OnyxSemPassState* state, AstReturn* ret); -static void symres_if(OnyxSemPassState* state, AstIf* ifnode); -static void symres_while(OnyxSemPassState* state, AstWhile* whilenode); -static void symres_statement_chain(OnyxSemPassState* state, AstNode* walker, AstNode** trailer); -static b32 symres_statement(OnyxSemPassState* state, AstNode* stmt); -static void symres_block(OnyxSemPassState* state, AstBlock* block); -static void symres_function(OnyxSemPassState* state, AstFunction* func); -static void symres_global(OnyxSemPassState* state, AstGlobal* global); - -static void symbol_introduce(OnyxSemPassState* state, OnyxToken* tkn, AstNode* symbol) { +static void symbol_introduce(SemState* state, OnyxToken* tkn, AstNode* symbol); +static void symbol_basic_type_introduce(SemState* state, AstBasicType* basic_type); +static b32 symbol_unique_introduce(SemState* state, OnyxToken* tkn, AstNode* symbol); +static void symbol_remove(SemState* state, OnyxToken* tkn); +static AstNode* symbol_resolve(SemState* state, OnyxToken* tkn); +static void local_group_enter(SemState* state, AstLocalGroup* local_group); +static void local_group_leave(SemState* state); + +static AstType* symres_type(SemState* state, AstType* type); +static void symres_local(SemState* state, AstLocal** local); +static void symres_call(SemState* state, AstCall* call); +static void symres_expression(SemState* state, AstTyped** expr); +static void symres_assignment(SemState* state, AstAssign* assign); +static void symres_return(SemState* state, AstReturn* ret); +static void symres_if(SemState* state, AstIf* ifnode); +static void symres_while(SemState* state, AstWhile* whilenode); +static void symres_statement_chain(SemState* state, AstNode* walker, AstNode** trailer); +static b32 symres_statement(SemState* state, AstNode* stmt); +static void symres_block(SemState* state, AstBlock* block); +static void symres_function(SemState* state, AstFunction* func); +static void symres_global(SemState* state, AstGlobal* global); + +static void symbol_introduce(SemState* state, OnyxToken* tkn, AstNode* symbol) { token_toggle_end(tkn); - SemPassSymbol* sp_sym = (SemPassSymbol *) bh_alloc_item(state->allocator, SemPassSymbol); + SemSymbol* sp_sym = (SemSymbol *) bh_alloc_item(state->allocator, SemSymbol); sp_sym->node = symbol; sp_sym->shadowed = NULL; - if (bh_table_has(SemPassSymbol *, state->symbols, tkn->text)) { - sp_sym->shadowed = bh_table_get(SemPassSymbol *, state->symbols, tkn->text); + if (bh_table_has(SemSymbol *, state->symbols, tkn->text)) { + sp_sym->shadowed = bh_table_get(SemSymbol *, state->symbols, tkn->text); } - bh_table_put(SemPassSymbol *, state->symbols, tkn->text, sp_sym); + bh_table_put(SemSymbol *, state->symbols, tkn->text, sp_sym); if (symbol->kind == Ast_Kind_Local) { AstLocal* local = (AstLocal *) symbol; @@ -45,27 +45,27 @@ static void symbol_introduce(OnyxSemPassState* state, OnyxToken* tkn, AstNode* s token_toggle_end(tkn); } -static void symbol_remove(OnyxSemPassState* state, OnyxToken* tkn) { +static void symbol_remove(SemState* state, OnyxToken* tkn) { token_toggle_end(tkn); - SemPassSymbol* sp_sym = bh_table_get(SemPassSymbol *, state->symbols, tkn->text); + SemSymbol* sp_sym = bh_table_get(SemSymbol *, state->symbols, tkn->text); if (sp_sym->shadowed) { - bh_table_put(SemPassSymbol *, state->symbols, tkn->text, sp_sym->shadowed); + bh_table_put(SemSymbol *, state->symbols, tkn->text, sp_sym->shadowed); } else { - bh_table_delete(SemPassSymbol *, state->symbols, tkn->text); + bh_table_delete(SemSymbol *, state->symbols, tkn->text); } token_toggle_end(tkn); } -static AstNode* symbol_resolve(OnyxSemPassState* state, OnyxToken* tkn) { +static AstNode* symbol_resolve(SemState* state, OnyxToken* tkn) { AstNode* res = NULL; while (res == NULL || res->kind == Ast_Kind_Symbol) { token_toggle_end(tkn); - if (!bh_table_has(SemPassSymbol *, state->symbols, tkn->text)) { + if (!bh_table_has(SemSymbol *, state->symbols, tkn->text)) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_UNKNOWN_SYMBOL, tkn->pos, @@ -75,7 +75,7 @@ static AstNode* symbol_resolve(OnyxSemPassState* state, OnyxToken* tkn) { return NULL; } - res = bh_table_get(SemPassSymbol *, state->symbols, tkn->text)->node; + res = bh_table_get(SemSymbol *, state->symbols, tkn->text)->node; token_toggle_end(tkn); tkn = res->token; @@ -84,37 +84,37 @@ static AstNode* symbol_resolve(OnyxSemPassState* state, OnyxToken* tkn) { return res; } -static void local_group_enter(OnyxSemPassState* state, AstLocalGroup* local_group) { +static void local_group_enter(SemState* state, AstLocalGroup* local_group) { local_group->prev_group = state->curr_local_group; state->curr_local_group = local_group; } -static void local_group_leave(OnyxSemPassState* state) { +static void local_group_leave(SemState* state) { assert(state->curr_local_group != NULL); for (AstLocal *walker = state->curr_local_group->last_local; walker != NULL; walker = walker->prev_local) { - symbol_remove(state, walker->base.token); + symbol_remove(state, walker->token); } state->curr_local_group = state->curr_local_group->prev_group; } -static void symbol_basic_type_introduce(OnyxSemPassState* state, AstBasicType* basic_type) { - SemPassSymbol* sp_sym = bh_alloc_item(state->allocator, SemPassSymbol); +static void symbol_basic_type_introduce(SemState* state, AstBasicType* basic_type) { + SemSymbol* sp_sym = bh_alloc_item(state->allocator, SemSymbol); sp_sym->node = (AstNode *) basic_type; sp_sym->shadowed = NULL; - bh_table_put(SemPassSymbol *, state->symbols, basic_type->base.name, sp_sym); + bh_table_put(SemSymbol *, state->symbols, basic_type->name, sp_sym); } -static b32 symbol_unique_introduce(OnyxSemPassState* state, OnyxToken* tkn, AstNode* symbol) { +static b32 symbol_unique_introduce(SemState* state, OnyxToken* tkn, AstNode* symbol) { token_toggle_end(tkn); // NOTE: If the function hasn't already been defined - if (!bh_table_has(SemPassSymbol *, state->symbols, tkn->text)) { - SemPassSymbol* sp_sym = bh_alloc_item(state->allocator, SemPassSymbol); + if (!bh_table_has(SemSymbol *, state->symbols, tkn->text)) { + SemSymbol* sp_sym = bh_alloc_item(state->allocator, SemSymbol); sp_sym->node = symbol; sp_sym->shadowed = NULL; - bh_table_put(SemPassSymbol *, state->symbols, tkn->text, sp_sym); + bh_table_put(SemSymbol *, state->symbols, tkn->text, sp_sym); } else { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_CONFLICTING_GLOBALS, @@ -130,7 +130,7 @@ static b32 symbol_unique_introduce(OnyxSemPassState* state, OnyxToken* tkn, AstN return 1; } -static AstType* symres_type(OnyxSemPassState* state, AstType* type) { +static AstType* symres_type(SemState* state, AstType* type) { if (type == NULL) return NULL; if (type->kind == Ast_Kind_Symbol) { @@ -162,12 +162,12 @@ static AstType* symres_type(OnyxSemPassState* state, AstType* type) { return NULL; } -static void symres_local(OnyxSemPassState* state, AstLocal** local) { - (*local)->base.type_node = symres_type(state, (*local)->base.type_node); - symbol_introduce(state, (*local)->base.token, (AstNode *) *local); +static void symres_local(SemState* state, AstLocal** local) { + (*local)->type_node = symres_type(state, (*local)->type_node); + symbol_introduce(state, (*local)->token, (AstNode *) *local); } -static void symres_call(OnyxSemPassState* state, AstCall* call) { +static void symres_call(SemState* state, AstCall* call) { AstNode* callee = symbol_resolve(state, call->callee->token); if (callee) call->callee = callee; @@ -184,15 +184,15 @@ static void symres_call(OnyxSemPassState* state, AstCall* call) { symres_statement_chain(state, (AstNode *) call->arguments, (AstNode **) &call->arguments); } -static void symres_unaryop(OnyxSemPassState* state, AstUnaryOp** unaryop) { +static void symres_unaryop(SemState* state, AstUnaryOp** unaryop) { if ((*unaryop)->operation == Unary_Op_Cast) { - (*unaryop)->base.type_node = symres_type(state, (*unaryop)->base.type_node); + (*unaryop)->type_node = symres_type(state, (*unaryop)->type_node); } symres_expression(state, &(*unaryop)->expr); } -static void symres_expression(OnyxSemPassState* state, AstTyped** expr) { +static void symres_expression(SemState* state, AstTyped** expr) { switch ((*expr)->kind) { case Ast_Kind_Binary_Op: symres_expression(state, &((AstBinaryOp *)(*expr))->left); @@ -225,7 +225,7 @@ static void symres_expression(OnyxSemPassState* state, AstTyped** expr) { } } -static void symres_assignment(OnyxSemPassState* state, AstAssign* assign) { +static void symres_assignment(SemState* state, AstAssign* assign) { AstTyped* lval = (AstTyped *) symbol_resolve(state, assign->lval->token); if (lval == NULL) return; assign->lval = lval; @@ -233,41 +233,41 @@ static void symres_assignment(OnyxSemPassState* state, AstAssign* assign) { symres_expression(state, &assign->expr); } -static void symres_return(OnyxSemPassState* state, AstReturn* ret) { +static void symres_return(SemState* state, AstReturn* ret) { if (ret->expr) symres_expression(state, &ret->expr); } -static void symres_if(OnyxSemPassState* state, AstIf* ifnode) { +static void symres_if(SemState* state, AstIf* ifnode) { symres_expression(state, &ifnode->cond); if (ifnode->true_block.as_if != NULL) { - if (ifnode->true_block.as_if->base.kind == Ast_Kind_Block) + if (ifnode->true_block.as_if->kind == Ast_Kind_Block) symres_block(state, ifnode->true_block.as_block); - else if (ifnode->true_block.as_if->base.kind == Ast_Kind_If) + else if (ifnode->true_block.as_if->kind == Ast_Kind_If) symres_if(state, ifnode->true_block.as_if); else DEBUG_HERE; } if (ifnode->false_block.as_if != NULL) { - if (ifnode->false_block.as_if->base.kind == Ast_Kind_Block) + if (ifnode->false_block.as_if->kind == Ast_Kind_Block) symres_block(state, ifnode->false_block.as_block); - else if (ifnode->false_block.as_if->base.kind == Ast_Kind_If) + else if (ifnode->false_block.as_if->kind == Ast_Kind_If) symres_if(state, ifnode->false_block.as_if); else DEBUG_HERE; } } -static void symres_while(OnyxSemPassState* state, AstWhile* whilenode) { +static void symres_while(SemState* state, AstWhile* whilenode) { symres_expression(state, &whilenode->cond); symres_block(state, whilenode->body); } // NOTE: Returns 1 if the statment should be removed -static b32 symres_statement(OnyxSemPassState* state, AstNode* stmt) { +static b32 symres_statement(SemState* state, AstNode* stmt) { switch (stmt->kind) { case Ast_Kind_Local: symres_local(state, (AstLocal **) &stmt); return 1; case Ast_Kind_Assignment: symres_assignment(state, (AstAssign *) stmt); return 0; @@ -282,7 +282,7 @@ static b32 symres_statement(OnyxSemPassState* state, AstNode* stmt) { } } -static void symres_statement_chain(OnyxSemPassState* state, AstNode* walker, AstNode** trailer) { +static void symres_statement_chain(SemState* state, AstNode* walker, AstNode** trailer) { while (walker) { if (symres_statement(state, walker)) { *trailer = walker->next; @@ -297,36 +297,36 @@ static void symres_statement_chain(OnyxSemPassState* state, AstNode* walker, Ast } } -static void symres_block(OnyxSemPassState* state, AstBlock* block) { +static void symres_block(SemState* state, AstBlock* block) { local_group_enter(state, block->locals); if (block->body) symres_statement_chain(state, block->body, &block->body); local_group_leave(state); } -static void symres_function(OnyxSemPassState* state, AstFunction* func) { - for (AstLocal *param = func->params; param != NULL; param = (AstLocal *) param->base.next) { - param->base.type_node = symres_type(state, param->base.type_node); +static void symres_function(SemState* state, AstFunction* func) { + for (AstLocal *param = func->params; param != NULL; param = (AstLocal *) param->next) { + param->type_node = symres_type(state, param->type_node); - symbol_introduce(state, param->base.token, (AstNode *) param); + symbol_introduce(state, param->token, (AstNode *) param); } - if (func->base.type_node != NULL) { - func->base.type_node = symres_type(state, func->base.type_node); + if (func->type_node != NULL) { + func->type_node = symres_type(state, func->type_node); } symres_block(state, func->body); - for (AstLocal *param = func->params; param != NULL; param = (AstLocal *) param->base.next) { - symbol_remove(state, param->base.token); + for (AstLocal *param = func->params; param != NULL; param = (AstLocal *) param->next) { + symbol_remove(state, param->token); } } -static void symres_global(OnyxSemPassState* state, AstGlobal* global) { - global->base.type_node = symres_type(state, global->base.type_node); +static void symres_global(SemState* state, AstGlobal* global) { + global->type_node = symres_type(state, global->type_node); } -static void symres_top_node(OnyxSemPassState* state, AstNode** node) { +static void symres_top_node(SemState* state, AstNode** node) { switch ((*node)->kind) { case Ast_Kind_Call: case Ast_Kind_Unary_Op: @@ -350,7 +350,7 @@ static void symres_top_node(OnyxSemPassState* state, AstNode** node) { } } -void onyx_resolve_symbols(OnyxSemPassState* state, ParserOutput* program) { +void onyx_resolve_symbols(SemState* state, ParserOutput* program) { // NOTE: Add types to global scope symbol_basic_type_introduce(state, &basic_type_void); @@ -368,7 +368,7 @@ void onyx_resolve_symbols(OnyxSemPassState* state, ParserOutput* program) { symbol_basic_type_introduce(state, &basic_type_rawptr); bh_arr_each(AstBinding *, binding, program->top_level_bindings) - if (!symbol_unique_introduce(state, (*binding)->base.token, (*binding)->node)) return; + if (!symbol_unique_introduce(state, (*binding)->token, (*binding)->node)) return; bh_arr_each(AstNode *, node, program->nodes_to_process) symres_top_node(state, node); diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 56a9a025..752e4aaf 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -347,11 +347,11 @@ COMPILE_FUNC(if, AstIf* if_node) { if (if_node->true_block.as_if) { // NOTE: This is kind of gross, but making a function for this doesn't feel right - if (if_node->true_block.as_if->base.kind == Ast_Kind_If) { + if (if_node->true_block.as_if->kind == Ast_Kind_If) { forll (AstNode, stmt, (AstNode *) if_node->true_block.as_if, next) { compile_statement(mod, &code, stmt); } - } else if (if_node->true_block.as_if->base.kind == Ast_Kind_Block) { + } else if (if_node->true_block.as_if->kind == Ast_Kind_Block) { forll (AstNode, stmt, if_node->true_block.as_block->body, next) { compile_statement(mod, &code, stmt); } @@ -361,11 +361,11 @@ COMPILE_FUNC(if, AstIf* if_node) { if (if_node->false_block.as_if) { WI(WI_ELSE); - if (if_node->false_block.as_if->base.kind == Ast_Kind_If) { + if (if_node->false_block.as_if->kind == Ast_Kind_If) { forll (AstNode, stmt, (AstNode *) if_node->false_block.as_if, next) { compile_statement(mod, &code, stmt); } - } else if (if_node->false_block.as_if->base.kind == Ast_Kind_Block) { + } else if (if_node->false_block.as_if->kind == Ast_Kind_Block) { forll (AstNode, stmt, if_node->false_block.as_block->body, next) { compile_statement(mod, &code, stmt); } @@ -487,7 +487,7 @@ COMPILE_FUNC(unaryop, AstUnaryOp* unop) { switch (unop->operation) { case Unary_Op_Negate: { - TypeBasic* type = &unop->base.type->Basic; + TypeBasic* type = &unop->type->Basic; if (type->kind == Basic_Kind_I32 || type->kind == Basic_Kind_I16 @@ -533,7 +533,7 @@ COMPILE_FUNC(call, AstCall* call) { for (AstArgument *arg = call->arguments; arg != NULL; - arg = (AstArgument *) arg->base.next) { + arg = (AstArgument *) arg->next) { compile_expression(mod, &code, arg->value); } @@ -555,7 +555,7 @@ COMPILE_FUNC(intrinsic_call, AstIntrinsicCall* call) { if (place_arguments_normally) { for (AstArgument *arg = call->arguments; arg != NULL; - arg = (AstArgument *) arg->base.next) { + arg = (AstArgument *) arg->next) { compile_expression(mod, &code, arg->value); } } @@ -646,7 +646,7 @@ COMPILE_FUNC(expression, AstTyped* expr) { case Ast_Kind_Literal: { AstNumLit* lit = (AstNumLit *) expr; - WasmType lit_type = onyx_type_to_wasm_type(lit->base.type); + WasmType lit_type = onyx_type_to_wasm_type(lit->type); WasmInstruction instr = { WI_NOP, 0 }; if (lit_type == WASM_TYPE_INT32) { @@ -703,7 +703,7 @@ COMPILE_FUNC(cast, AstUnaryOp* cast) { compile_expression(mod, &code, cast->expr); Type* from = cast->expr->type; - Type* to = cast->base.type; + Type* to = cast->type; i32 fromidx = 0, toidx = 0; if (from->Basic.flags & Basic_Flag_Integer) { @@ -756,8 +756,8 @@ static i32 generate_type_idx(OnyxWasmModule* mod, AstFunction* fd) { static char type_repr_buf[128]; char* t = type_repr_buf; - Type** param_type = fd->base.type->Function.params; - i32 param_count = fd->base.type->Function.param_count; + Type** param_type = fd->type->Function.params; + i32 param_count = fd->type->Function.param_count; i32 params_left = param_count; while (params_left-- > 0) { // HACK: Using these directly as part of a string feels weird but they are @@ -767,7 +767,7 @@ static i32 generate_type_idx(OnyxWasmModule* mod, AstFunction* fd) { } *(t++) = ':'; - WasmType return_type = onyx_type_to_wasm_type(fd->base.type->Function.return_type); + WasmType return_type = onyx_type_to_wasm_type(fd->type->Function.return_type); *(t++) = (char) return_type; *t = '\0'; @@ -796,11 +796,11 @@ static i32 generate_type_idx(OnyxWasmModule* mod, AstFunction* fd) { static void compile_function(OnyxWasmModule* mod, AstFunction* fd) { // NOTE: Don't compile intrinsics - if (fd->base.flags & Ast_Flag_Intrinsic) return; + if (fd->flags & Ast_Flag_Intrinsic) return; i32 type_idx = generate_type_idx(mod, fd); - if (fd->base.flags & Ast_Flag_Foreign) { + if (fd->flags & Ast_Flag_Foreign) { WasmImport import = { .kind = WASM_FOREIGN_FUNCTION, .idx = type_idx, @@ -825,7 +825,7 @@ static void compile_function(OnyxWasmModule* mod, AstFunction* fd) { bh_arr_new(mod->allocator, wasm_func.code, 4); - if (fd->base.flags & Ast_Flag_Exported) { + if (fd->flags & Ast_Flag_Exported) { token_toggle_end(fd->exported_name); i32 func_idx = (i32) bh_imap_get(&mod->func_map, (u64) fd); @@ -844,7 +844,7 @@ static void compile_function(OnyxWasmModule* mod, AstFunction* fd) { if (fd->body != NULL) { // NOTE: Generate the local map i32 localidx = 0; - for (AstLocal *param = fd->params; param != NULL; param = (AstLocal *) param->base.next) { + for (AstLocal *param = fd->params; param != NULL; param = (AstLocal *) param->next) { bh_imap_put(&mod->local_map, (u64) param, localidx++); } @@ -855,7 +855,7 @@ static void compile_function(OnyxWasmModule* mod, AstFunction* fd) { u8* count = &wasm_func.locals.i32_count; fori (ti, 0, 3) { forll (AstLocal, local, fd->body->locals->last_local, prev_local) { - if (onyx_type_to_wasm_type(local->base.type) == local_types[ti]) { + if (onyx_type_to_wasm_type(local->type) == local_types[ti]) { bh_imap_put(&mod->local_map, (u64) local, localidx++); (*count)++; @@ -880,9 +880,9 @@ static void compile_function(OnyxWasmModule* mod, AstFunction* fd) { } static void compile_global_declaration(OnyxWasmModule* module, AstGlobal* global) { - WasmType global_type = onyx_type_to_wasm_type(global->base.type); + WasmType global_type = onyx_type_to_wasm_type(global->type); - if (global->base.flags & Ast_Flag_Foreign) { + if (global->flags & Ast_Flag_Foreign) { WasmImport import = { .kind = WASM_FOREIGN_GLOBAL, .idx = global_type, @@ -896,11 +896,11 @@ static void compile_global_declaration(OnyxWasmModule* module, AstGlobal* global WasmGlobal glob = { .type = global_type, - .mutable = (global->base.flags & Ast_Flag_Const) == 0, + .mutable = (global->flags & Ast_Flag_Const) == 0, .initial_value = NULL, }; - if ((global->base.flags & Ast_Flag_Exported) != 0) { + if ((global->flags & Ast_Flag_Exported) != 0) { token_toggle_end(global->exported_name); i32 global_idx = (i32) bh_imap_get(&module->func_map, (u64) global); @@ -973,26 +973,26 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc, OnyxMessages* msgs) { void onyx_wasm_module_compile(OnyxWasmModule* module, ParserOutput* program) { bh_arr_each(AstFunction *, function, program->functions) { - if ((*function)->base.flags & Ast_Flag_Foreign) { + if ((*function)->flags & Ast_Flag_Foreign) { bh_imap_put(&module->func_map, (u64) *function, module->next_func_idx++); } } bh_arr_each(AstGlobal *, global, program->globals) { - if ((*global)->base.flags & Ast_Flag_Foreign) { + if ((*global)->flags & Ast_Flag_Foreign) { bh_imap_put(&module->global_map, (u64) *global, module->next_global_idx++); } } bh_arr_each(AstFunction *, function, program->functions) { - if ((*function)->base.flags & Ast_Flag_Foreign) continue; + if ((*function)->flags & Ast_Flag_Foreign) continue; - if (((*function)->base.flags & Ast_Flag_Intrinsic) == 0) + if (((*function)->flags & Ast_Flag_Intrinsic) == 0) bh_imap_put(&module->func_map, (u64) *function, module->next_func_idx++); } bh_arr_each(AstGlobal *, global, program->globals) { - if ((*global)->base.flags & Ast_Flag_Foreign) continue; + if ((*global)->flags & Ast_Flag_Foreign) continue; bh_imap_put(&module->global_map, (u64) *global, module->next_global_idx++); } -- 2.25.1