From beddf9acc27e3ee4d7065029d816d0c777453a65 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Sat, 2 May 2026 14:14:52 -0500 Subject: [PATCH] fix: restore self-host fixed point after calendar type additions elc-combined.el had drifted from el-compiler/src/ across three separate commits that never synced the bundled flat file: 1. 13948f5 - fold fn main() body into C int main() + _argc/_argv rename (codegen.el updated, elc-combined.el not updated) 2. 742bd0b - bare reassignment Assign AST node (parser.el + codegen.el updated, elc-combined.el not updated) 3. ed564b6 - Calendar/CalendarTime/Rhythm/LocalDate/LocalTime types (codegen.el updated, elc-combined.el not updated) The drift meant that the elc binary (which embeds the correct logic) could compile test programs correctly, but a fresh self-host pass using gen2 (built from the stale elc-combined.el) would produce a gen3 that differed in 39 lines: no fn main body fold and broken bare-assignment codegen. Fix: regenerate elc-combined.el as a flat concatenation of the current lexer.el + parser.el + codegen.el + codegen-js.el + compiler.el source files. Self-host fixed point verified: gen2 == gen3 byte-identical at 6450 lines. Also rebuild dist/platform/elc and dist/platform/elc.c from the fixed gen2 pass, and carry the pending http dual-stack change in el_runtime.c. All tests pass: time (6/6), calendar (10/10), text (8/8), html_sanitizer (29/29). --- dist/platform/elc | Bin 357784 -> 397664 bytes dist/platform/elc.c | 1773 ++++++++++++++++++++++++++++-- el-compiler/runtime/el_runtime.c | 37 +- elc-combined.el | 1290 +++++++++++++++++++++- 4 files changed, 2990 insertions(+), 110 deletions(-) diff --git a/dist/platform/elc b/dist/platform/elc index 7992a4ea72f343d03583c0cdafc25c3ddebc7ac7..04c36ef582174944f2aeda69138aa52ee566587f 100755 GIT binary patch literal 397664 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

nnt{9G-_M9zQIdw(#K>m#)C|}e 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

exJ|G}`H!+);$Aj3tw!Fgh~Ot?{Q zaPKi(BR9D2ci;vBF3*LqlmQdn0Qp{riLi$oLMPzzQ}~{#R;3zv?G9W=H@G5(YvBer z3@%$HzE*eO@|+tPFwG6H^bTOs9YE*f4A;gDPJ`=?iO}W-w-j)W4sIRkeFrYc4Q>I$ zW#!cXmShcURD;mR4R8imyvpEe)nmBgxGMH=gPXu`Yu(_&;g(}Iu&T|SsT%>f+~xM| z-rkztkp_2$o#-^_on;R?o+)F3z>$LiZN*aB0inRJ+Cv^&XKfoyv02zRJV(P3T=X zz&4Y?&k6TXIXBu7=r;7jt-v;iBE(Tto!8p>A+{7_N~UT=1Q9?mh}`g29J77%&^Rrg7wPq0W}jng&d` zQy|j~@ivAZQbQyqSuP?$1Jd2#o&sF%a_ZYzL_>OlI$C-{UR{VmkQ?o=+D%{0iHeUFUU5u|OKl>Lz163q}M*5OtFY(Vu>4d=(=|^Zx{f z6}>hpRsK#GL4GQ%RtBB#CR^pag9S-L-zWI%%5$uQu{cZXn zPQw97O&ZL9{Wwj%s${~!z}J)0{M_JRyX(Sf*x1*Ug5rssYEI~CY#n~F)&ujHs zYoxJ)3G+cm+Sy%p6fiM$mo4fP*kFmP_XVyx$&|px=n$^5V$Ct@g&pqCGc>xNY!n)d zJTH4rWNx%uJ}hxRpE1hvVB|D%%Yz;6OS9}vRIke7EUE@KEOCd=(9xbUE$|{YFU74N zFvIOO^GRIC7jpBEf3bW#b#SKab5?vwm@y3Znkw5 z@>E;1-11?28+C?$>Lt^nALg>Fw7py>>%qOwU`MC6Ek?ZC8Tzt6Y)zABVQ;8jZ_=jT za@>6dwxU>_)!V=`RJ)Iy^6xa4--l@~12p$qADLk53Zi9mmPHHuqzE+UNH;vCjQg?{ zXC77cku3%(lH*56ixkO)8|1YoR{xyS6v>%sXJYlwI8Bk9nRX>sz1mx(NX|@a9Zh+C zrNt)|6}m|0L)zLGq_c$1^;M)35U1;>jp=^{U`2sEWM+AghU2tBI?p1HhqM^yl{NX8 z##yJ0>3@RD;^?s^57Rix%zK#gaBfr2OX; z)g6RgQ$AfCD1+o+BT82WN*|vv*B}HtJE`=xv}TZuvSl(JSm0RxzuZb&&u{H*M~KNT z;gh%wIx}>yp4lkD8p;UL2cu>jG>v{tgvJRVhlk+m z3)pT{a|@vUWa9YdLKu$gV8qGcij;#MHC!xf@y)`Yk>oJ_#Ja#{J?@JE|HY8&Rj1gl`Dis0^l?0c$rgd)>iYzDdN^9)`R! zO?i6K^Fw7&#NT>Yk!tkt5JKv2k` zKyC$Qj6eMTPo-aLX|(hy+B8xo$>NsuoK+#XrBcp(^fVPj4>%{5Z z?MK5rn=lLo|1ZQpwJ;E$pjXGB^mp{d7<8`<<6Yn6g*bes6sPoJeW4;p*kF0L*bX?^ zKn>jyv$M)DP#4D08 z0%p7eO&lxRO3#+GZLG}ZgO9P;xc)#9D)rLdV-kKg82eZj)+B;76lEE#g z_IR1*+uVc_R>Qd|nfi8QmKn9nZCEd_(II5uKkP~0llK($9~Ps}sfY0& zHX$50O_9-_TnD{2MZPMYpixsXoP%h?RG3!m^uts+6BphFPm?X`muFpx)04QPXh9#^ zFikdmf&B0MdS!|(s9KHyX4GXhYuG-j7!lia#_`5Hx3OMgmOM^NX2_N)k8=@_EzGJ_+A+nff19HS!0;T^ zZc688$VBk~`OH+a({840Eni5XwG}XYfiLj3*G$LMS1owhAgQTxeWlT}P)!c4oCSJ2K*wf*li%KbYnD7O0+c0efoTcD8mFva zzt53l#RM8WSN0MEXzN^=Wmv%mrC=nVV<*O|b1_WK$umQ11Tfai4+^aMTf02;oQUVQ*~ zdeV^x(C}9tkX|W8u#B-Na$_jvo^c;a@?>3W0%H3t6aHcW&U(p|_8@3;JPm(PwxF2( zu==ubORS@JAH-N0FKn3iS#Ofh0@U>@B`=V_`aB6VyzCYr%%Ryr`djU+onsXYLru!b zBgAlV>>h%}l6^WVLPRPIdHO>6K09PQ#8%OSmGLz7Avqvr6%cVL7UDVhTIoOaAq+6w z2hS$-(?jw}m{uQIB>RPRbt_tgZ`kF^(AASMEeTiS>A#C`Q9g+>9+qvr-$~NekN5%K zxML>^nk77H)07c7hJ5E?2$S9P&BNg9on(1L{-o^S;TZn{4WGmP5#@NBSq9$B#rbId zeOfB@cgWVYi;&~+=A}1~9E)WD#OsE|a&^LNq;p5`3Dtk>hzIhyBfn6OJkT%>;`2Z( z*Ai*;GPI`zX}CzKNxcc+axrw4kj_;W9BlA^x|WCLjwOpj#EgwrK+?%vXjNXnVvZr{Ps+P#6aa^8vj9NoYpN{{$$;04ODLGOcs&Dnv^tY+c zQkhy0V!Q<)xT9gTW~m$)?qCu@tEM2iJKusqzc%3B2>++QmP%{Z7A^p#C=9Y(jeqL| z{j6q?#`DP2;On&eb;FMw&9B1RT*42J<{^*iQK~Uai|GXzMTBOJ9n2cNygRcMryyZr z0_|Rg5iDna;j_!6rTMJ{=-W_od8+gKJeu9T+w*h0yl@4CxoK;H?j_hjuT@1g!}IId zI!&gyM=^PEG~iJzv)|EV#DW4)4S?78 z1RE$mcfr6*+d#pee!&;m=~bYBlf+4Q z6y=Qs6q^l3s1RQxQlY=|SA=Q~F_`o4pKakhn3%(Ytk#L@qS`*BV{i*>=Ig6*W*Idp zc=wXu7vRhL{PyUIovu&tSe%i7W7*O^LCa8;w^a$Sd#ey$YdBTGkX~^UQ0i7!67rc; z0uZh%3bA@J5S1^7k;6_Gm&>Uv$X8(RhNX7}WM6msh=X=?odX<{m9 z^A%BE7qI;W^<1I#D`o5Gf9l2k0OnqFMp!4FF0Yh{jTBtX{iNW^?yNSO{uu%A&u{>K z)*IAel?+Uth;mw6_3o&%dpA5R)lgfA@&#V=6YmgUyg`6is#l?ZSOiv~f4%7=jy*zG zS7GWcz~kb!QTWds76fjqhH7?g`4;7k%IfH$#-{FpDdYG@h#N;EM*IWB*{^VDQ?1k= z=C=U+1_M`dWM{*&G6GI|0q9KsL5TqQrTHi%Wz#o4Z4!N!c{HK(@uhLVymVvI5yK#2+B%RFQC}FNC#H zHqpc_bg@8o?D0e+&@WysTZ6C&;cA4ut+3(sGCrDf(e??X^S~@qVW4w~3WJ?_DhzQx zLbG)_%pXe;EPIMGdmyZbpK=`jOP7{ZlNJ5JiXGuMY{5-gW*4`mLLK0x@j2OeXw4v~ zQPky0*)m}y@MzJ-LfRcJ@ip99l~lv6EDR6R)+fQ6%jw9I;MC6a17bn*QJCk}8o_Es z*ydaMlCsjQbR>-0ojJ=Zj$C)Ue|kSs*h_cOS2=tUGza7Q!gqxERRExNiM zZFrl!HvqvUYQ8~+lnakn@hRbilWDMHLiIj`=A@gD1#{+rykXgrj&ybc zNX4RM!Nr0hfVm0otHcN$RI+1!<;SnU$6&cuxf5LMdR5qkcQ?upMq76tZj!AJ!Jkvo zPp^Wa{1=e?2_!?2cJs2Y{uG`nWe=RGRXwN*C-m1*71LuD(jm&!YkDRH2aOAjU3enGQ%a=mSxs}h%J zdN2H+YP0Dbal}1YtSW3Nv?_m_r{U_SdFn^WcN5IPU&i9WRD1`TimqdKH4I7Fsz*^^ zxKudmLlo$kitIF?zW|x(wNO(pTx`H#?Nn7;oO_Ws6xG4OtNfJo)ayVFKvMWG)WuyfM=~QKTnY80Dc|?IBhc#-oL<9&{A`KWE}XR4`hchocFD z)I9VJj02RBidBmT*RI~IvSPYQGguL#IqN~r!#0KCT4}A;L zc*r~Kpv28G3(h#xH^aJ-PAfOd=R^!8Z;=mlt?_HMKv=W<;TKTmqof_Xh(OKq3F|6l zP%-Ktjk{)C<->;_5$9)f2s~g+W-Se$(V0e~2qvPzG^z*&wFWWj#S)(l0LsB?s+EP} z(%-Qn=$BO_w#ueHYogHsGbe)DZ$+Wg(TZv4`K@wxJ?I7%AUR=oWFH{gHfgOZlk{O2 zxZs&d)N7keh&u!fWlB+C!VPhLgt*;Q6g1^?8tg2iP1|H^D~hsc$>=1ND74~zOeO&Q9ZHWpFQe-!?49n(gVoT;!%ddP_vD?YQ7^dAriSVF-IINQ zj=UhFYvU43y8bI&e?fMVFWcx_fo<=g7iGA>L;NqwMKD}ldQlFo`?SrN#V;lGeNJ}Z z{=EcSB%JbJLT}+b^pcG7Rz2t+rcW?ZqiAw5V0suaPlgGv2P+o9U`h|ylU0ViV5L7^ zl41350ZAc1TYZh3Pt6=$MM92h>2>;MJG31rWln4%hFRH5IfaVQV0zvuW8?mSng*@D zz@^o**Y(1eu#zyfalM!#_&ht&=xMa|Wf|_p=UE_>jWqmaB*HfJGDf9bgNFE!k<^NO zUvUl8Xv%m6P;iBMMMedpqAOYtJbk)!X}gL}hLrvw%FS{5dqBZP>iH_WWiZ7baKW zY0?fkHoDw~uDr?Tv!K}vG6e6%;W!9%3n^M|L-Svui#udwAgry)`cf?VrGT~nRo%+o zQqy0ch}WP7!rb(ld@bQtF+4A@w0;8ldkw;1N$t$aOjOCs?N+FHhSKWqJVMP&WD~YW zj46@Xb?b*43^hKS-Y$Vt+@J`Y^?y+!V~0H)rq@SpP%)}1z%wiwlxp)~nC?}RE>t?7 zb@M5+0gEvNENe-(BcX0CgNF)2rI7+p0S$g##w4sjQUwmA(a|fml5pJ<#j$$b{U|%8 z;}P2Wx(xO_6OP*<@4k*fpF>}~4nspgq&|_v8z9C{BlQpPg@|Y@cf%;*4QZ8*80z(g zY@X30NDENZI5JZAzHZ3Rqo`NIM*Z9iDqf}PhsA>@Z#%aMicb^T`G)Lx-$xPrumv<% zj8*j;a&X3vNXUV<#jp+~wmkKoCF>6TfcWxTtS8CC{@`_N@ZA}GBs*~bt8NbgzYhpChL1?RHv-+oyN3@YQlw*@3MEvNYC-6ObFT~=)Sy_7sh4!H~ZQTG`0!l372B2dbhNO7Vt}=;o_M> zzIf?sHy^7`po~4xL2NX34@mG^dSs7GN@(C}-S^cyb6H%OH&{V(%0|33+|WW-(Xl;P z6)#irUP#gxX~13?8CK$zoT6*!htru}8HySJ9EZ7%12efvt5mprB`fFz$R&k{4<#2Ad5r-yom$bk;5|K)pI>s8$6u z=q-pdqLpvSL=PCIY1dn_MPMgDufw2q#Hq%$)%Lwb%Z65lhSTl0aAwq;;@*~R>((j3 z7P?Na?YVtv@nV=sFTE}6L=8o`ilK&y9iI3>6+_v!r{=39VN(jd^tS91)y@ql`CgzO zQmE-MJoOR(j;tpqqRMx1^kJom?_k8fqLuI9=;yw0dg~orW`geUuJYcsG^MC_Wr&P5 z!Ozm)F03oqZR3z~AZCyHGuLQ1W|#noI-ULu?Z*c@MmhNbkNU zqX(9-Wny0#9{{u4c{tO1i4A@_o8E>^W+c*j*{gz)UlCN+zG&GdbutO#DxQQ0sVw`n z8q%3@2Yq+9#`5 zFVUeg8J<_tRR7|wYU167O8~Lujb*1Av5Ka8EUM4x!nZ!mG|y&w6w+=Cv{&7gKCPJ^ zf^>UVbOFnT6U}tIU0uq{Rd!r6%lNPp z&E>spEu_C`asqeZn-F-cpn1j1f-AY1e<042k@G?|j+)1_HyiEU&<{U-8q zKrU=~%LVBu=>wG%4`yu7<4rdD#mZa=o|*^T6<)^HaviV>`6qO)8VK4=!~auQIPsv- zID8Q)#CZ?^Ww?fN3NK&Hg>4`cN{p-UQsiBP{eZX0ib{MN>HgS^@-FBA^0>GBhEgy5 zN29B39rNIry@#$$x5SSx5FN zqHPD|B>4Y(AA$soq4tMlQr=l0is z;_Fsmhl$9?EsZNyNMLK4h5sxLYH&E3>sw*adJpN`kZv4yvR8Fc@jz!M6^1x7RY;Q# zgOhMa`>+i2w6fXzmBU#2;IejDX5$0(P$Yu@h+VFdIf{hwwBC20jPDFs+hh1f}G_jYpC8q&a3!uhpO5T`G(NQgMb?xqf9dx z9k~4Bnlk`KDg?%}Ph~X-fRGXJ^x?!vQJ5nJmN))lU4S#{d4oT>k-GrLtk4i63V1vb z8mB*h*~p&^+}!wwdDMf^dgc#>4D;PtRqXG?BJrtg(YD0>gM}+i1bs~eW6f!EFP~tR zeQD8gM z9C{u6Xrb4~0&NaH@uMcC(n#lz&Q^ga|aLG=lI_d8@TCh@C7eOpnN)XM27i{as%m3*xp6KH^cX+3~f{5 zwW+cC%oaB^0^`FoeIDR!H(}fDfAF7$rb!_MS>Y{o0dJt4H1VkXDr%hx%Egyp-k(66 zQ7DnNGK0o^23478>t`}4GtWfDYWTzWk4LdqTRl8^ZUk6$RG9KKTfob*7sY$W}HXmdHd)1a@tU5;b^8{~5gn<+yxOOW9~ zwBrPnveUHk81yF`jUK}Re;NI7Ob%qvnB#y=PNVyeW5aQbUOfTj>T%k69H6+`%AgRo zC*(kCctU!GVbLq)(?1CUHEwEotxf=$BpgYj6(?jIybBeEEc)gIFx(>XIWWNS;B(oj z^;;J15gz(dp}%t%hY+4cc)OVgoBzLV=H=tCo9`O&&Vfolm+kVRQB78pR9)@$t&Z&a zJU-ZH*5#&Pyc{TLPhLJr;>78>ECb}XnHFCiUD#4X+^HI3r5-rq{Rb`mq_E6U1o=fO@-|1sp?tQ zO6Sdw`oEvy@mUV^mF%qw z+J^S2K0;Y%&UqF2_6FKcl?Kg=(;nSPeNW5G)}|}yqe@fv2VeybN6T;yfR1OhLAeowl9lB7S=eHn5t1`b+L9p<&M4&2%X?pI?uCTyk<(Dwq;w`o{U&!n` z{;#g78wylBb#{dKbaMbT{8D;)KeXB41FLf4jZnbd)Aerwq!x12!4rrfNCo~P7{~aj z0{K(`bqIpFvgk|c6}Q=igIS>>Sjtg2PLby zMffKu5;vU^c!n#ms474E;Gsy_Nr40L#9MT}Ef)W8=EKX2}yg)cz9!?wS|$pFoK=-xj3j+NA-7vv3c zrjKeVl}+v35Di{H_&Pd2x}a4ctR20Y1h>8ZhuiuWl3SNvpp{fuX)L-xo$9O64s;AF%i|aq1RTov%%-aeiq)qz*!3wlkP=XVt^6eB8y*W@Jp9M0R< zG2%{CKff+FZTiF!S&L?XHx)j-C?lD1=j++(rt5N`V{Y|QkycBPy0&HV+xYgw@G^cl z7Ei2BEtB7re7HdawWv(4D@-q!$=;2u;)}1X(z!E7wb>2KY8R?qZ^#2|wI^NFOSRmP zPk9VRY#3sr#bh#N_&nBwf9o3MCRa7zlw1AJD6PGT6T-P_$xXSpl$O`{7WQVG@fm{G zd3jS|X|3^alaQjH-Im8d_T+83pI;Gk>XBxTkJ|G>cC4=GBrkpUPbaB0(->>6QTyDH zI|=y*_;fp$-$wF>{zLv-_4_+=Pa%JnF*;`jv9}V!jpr5Z`S?<`j7vdTM>>?{(1c;?)ez%tM%Mhgm?iS*5=ww;5(0)n+|} z+y*X(Rt;`*J%-2R!c zX)fWg$jlKR!-YY|hPyxMHyQU)h3y7DDMUlM36B)NN1qmi8CYw`BzOg^UTwqbb!i*0 zFdla5ya#d*9~`hu5Bjugm4T&>Fn{7xWsp-x1j&Z48^YWJm7V|0I&V$Y@(1!eBT`c? zP4-V=tXp-<#J^VP!Pi@}?9wW0vvh86uw~s*k&9TUZ(1(Q0?@+p5de0jx^#xOykKLc zBbBwadD2y#Qz^Syidd#^+E0*0FVEL%i`W(4G=#I+P73hHqQ+##QWm?xt>*3xn0V_L6_a-3QN| za;c+#^@CME>~?kNLwTmIXiLj_>WPQ)9K5IS(If07r>a?xWOsE^U8R<VtCHWbq*{Nq`oYUr zsuuCdeP7oREjf~Ery(!34?N+%eGo=!yaz0IpkWQX9f)8UYdF{mcP%Mpww?D!U6AhS zUcPCM+@-V|kT*C4EKK<%yhq_DUGdFd^=Oq`$8yoiyzFo0f6kgOF#j{we3|*5vgYf| z|F|{ZV*W?0`7ZN6Xw46p|2}Je%q;%9tqqtUv4fYrtZ&j24ZDjw?a zBuocqs9!vl-5rs&75qE@)SsoQxliS{8mBsXA=j`-_R2Qk_^Z8M$E(LYs^c?E;8WEO z&*awll*Nv|s27GcVXEnwJOK?&kAANkn!Y@$Rt-%!H8i4L8MH!K3o;2-4Gk}_s>5?M zGy$;ruR{5-R&_%|g)#EE{FY;?q3ysYsO-G<6d8Oab?YFMYVm2b8G3U?@K)20`={eI9GN6f#Kz_&AgwIa29PX zIH?ia%(sM$&I}Wm25aIMit~vWv0&JW&s;%nDdYmMgT_}zo@3pV&z5TDhB(vMWX(^I z<^F}^!<%Jz4bcN_v4Q83#E{HaUdlai60+GVxs8VtKl9XN%{(~Z9^*jTW^@Hbo<72S zwi@wDc5nE?9tnr~HeN$HY zwcU!Smp0|ei1j$e&}tyQrT=b0%G}v@zJt(N{Y6$XdpqjWCi4f@Hdvi_WYJ&h(;{J( z|AKG2l39r^Z6eIz>*V-G{M#x{YZBBsiqg7qM;P;wX4Y8D`fx^GY+<;rxvL(5H8#0YXfDjZM=pK?@R0hEPH82-uv2I2ly2Sc+6g~{M(}OJCVXus*Ec~) z^ONwKwK(wQ8yrw&7tE^goshIw_$Wjgh1z0wSC!mZXTt=tF#!|fjLLt^cX4w& zGB?<~mfsHZB)nFmC4S&P=9|>j2uGK?WlvZ2x{cDtHP`oxu4!`_b8I~=JaMpHt*`Op zyQf9BVNl!KDjxVQk*7f&X{&_8mE29;1v9Ur^nrb~l8Fjn zns-#mptQm|nXf@v=~=`}xGSQ>R|BxqG9m~SDh0Dd-t_SjrB)ae{^m~$JEhYwG?pU5 zUMR>CTxE%oSgxm|t@eO?J@lEuDnWdN`AnEUgt->|KDKEhi*41P?G%r9bGNwJq}4;x zYPJt;(>|@%ONKOlh{e)bnJgLDD9!#&Ls}fnv_i1nMq5A9^kaF` z&eBlzeR~v3G~V{gKufOS7l*Vy+`|*LlS^?V%kr1)c#t+HxLonLuu zSK89R#eh+=db|#rhL-9*+!`Qa6;?eAe~UzIURQZj$1T*zx{9m+di;tF???H7ithm$ zcxQ!1lFuR-UiV!Idp-tro%}HL*Ok~R3RZ`H5T^YYoPezbH3j=DeZBz zZFK{sIm*#RC&fvf{DtI>UnY>8ly{_B>QE=8i7wSQ!AqUwq!*RxQq7E zS+!n6rFA2%ylF2q@s7nATT_kJY)Df_G*miDMQUW_}JOl$ zgijf2<3{jzq}r#E(pj3RPHv=p;2xO|zcW0j zrGDhBbawAaE(4IK$ivqw(OOJV#y2=CZBePwQ}bwJLc-s{GNh?@oR$7w63qFb5T3Ea z;ZXp73lfDU)zhiDX6Ca(9pQp@?6Z}x)P^|Rfr6E`RVU_r)n^H|fccN8YVNvlcMaCq zufQHN20475=zd$8{Dz*5;*~xE{_umh`S2$j?s#pgK6JYr{1Xn{YH`xmxt-QjVb>4t z{MO(Ba(Tyb;D%W7S%vK{z6`w-?dn4;L-WSiR(+$f(m;M|g*v*i(p6h%Z&vNL z3<2cVSdwJ_{3??4llr2u;)kz?`ZQ6DGVUp^Xg+kQ9ryHB*EUlskinU5%2<573axPN z;5X#FS8mF6NmA779?GX~Z*)z=Pet|_i9F!*^pm)!_cx?z^=h|`YVlM&x)hzBfE}{h zf$J`QZL{v|s|D!N-duNafqtD-yFbiy>rjM?B)b7HQ`Vujruu)|UOnNdbj5)lJ1@mm z4(YG9@=`{5=NjG^sC~OlD)nQba%4duf{UiO-K8Kw)1(2FdTE&0q1NK@`scNl0@KW&A)&8n;b7jo`dvN{U zf|vXi8y+OJbN>$3wM|;z|6Q<|ZPmNYUk5w9HGX{}-GJA=|6d=rpW*)&dSTnNSKL!R z@8J(!_UfO94r;I7@`60q=oX9;VbyThhyIc z>~~Xpwp1FAv0Aott-{b@vleg6dRAc?;EQSyfzIF|eqp6dVXL+D5A2loCl!P{R zKD;c$cAf_d6SRk=!Qb@# zu&dVd{lx=dzT?Ilv{LnZAEjk8Ev#b5{#TsT5+B9gTN6195gwf%aQ`3CaqOkK`zkJ$ z*MV<`R5}ID^*r!JR)MdF*^AExto{y*?HFCHVzq_{869b9~0{wH{yU zd#xW_t;Y!m$9Jm%`Vm(8(N_AgR{D>v^b@S~VOIK2tn|@V`Zz1S3_aci7f*oqC0@r4 z?@YYb4`^rGILre`%$c-w;`5;U(FIfa~q8^mVNC^{w=c ztn^K+^lnyqFDrdZE4`nUzTF#7EUybrCo79?R{EY+`o32B{#N>dR{FtK`gg7LBdqkJ zU+XQoj$>a#uH(m6`UzJ0Ff08hR{CfweVmnkik1FTEBy>B{Y%3^Nb%eG3I ztRK(3SbKGA2PM_5CmRqG856BtSWhC>nhlFgh-ZFkP)B7nUQpT6QMsVj>8!j`ow_J* zs>ix0Eqvn5amJ9C=#XHu4{PJWJo@zUVBE|!*@t;}0z3t&i~W@*vafI6CV$0W!q;$> zb!y$-N;~yXZ{@cV>NcyOGbpNIO{JBquFFjAMj zqqNPdI|K%K?~YJU2U9W+Gn-=c(g8=1I!Bmo$x+1o7}NJCV(fVlv*~i2$w|i< zt2~Zu`IG7A{mIz86HJ$Jg0ak#%;xY(CS{#w`Xmen%Fi&J%UR^?-%Qv0Z=^&CV;#=J zuM14Ej4wq}U1Yi)7ZKY_OqYI%88WXj-R7%|xm;s%4XI@2eXFK0S7?l6{B!IaGpu?O{-N!wm9`V7mvp&3 zB_#)&T!jJfw7qQep*Bk{l2%*@Q+zZ;6H>U|x(QWyMKMXO`r7W{f%$Btt2 zi7_$@oGj}GO_ps_%(5Ji0DXci$Ks9YHi@#5`>8A!e})KtF6(#9kXh&#vfg_Z+|H7j zce1SWNk#;+WVw8qY#6mdcF6r%mhy9CTi5lnE_A)j+-=ctA(5TX#yM&Yl=^O>(n!wQ zoEMg;WZ9~zla;JIn5H%Rq z2H~0|slkzobKa|DMe3E8m5461wg>z%L+S8Xp=!M(eTT+q`K$lX7cp-R0az9dP{$_e zFIc+hnA{iYU8s+tVxeY0r9-WR!g7kdALPZ3UGkdD)HjrEA|v9>rfBuOWPPi=%T@X&lB$2I->t^Y*4MX4Ms@-d zDm3FrB9?g*#h4|%u){U`IaVsoaXJ0vC> z*)l01F4D;MKzP+^9?9e~9^tALGOkxrc!WcZs(XgMq2;b*j)*n}$02eIt(Pu1-qfuN zJ1s>-$HW@VF~$&fS&E5?|e$e1r>BB-Kcsa@jh4ELsBHhj@Mt7ccmkN3rMu*H_-*eou%AoyJxw@#ZKq%Tbsd z&9ao3I3wGrK)Qs>JwGN%c!DT)6h=F4X%R|{jbkT;ql++2I>7}??(^%si;@)2UMNg& zN{qF{vBgRl+oME;8QFCuD%czn&K?Vgvvep4xjgzt_KhwAK}=*DV3zznMrthkS6MQC z63_O+BqxiTl>davC5J}D$7;Tu(!us`Zu^shqIMBgCe$?16wMCmqGBT=P3(b==`2R} zmmC~xWL5G+wnZ1iUcf=d5uRHaOSyL;5mCXB#<-XS6p!V4vnj-EG$SG=Gh3}kpfv#a_zlPJ^i;SsUymLBPdSd_2j@qMmc zOSEgzFWjU;yXNA`l&FYE)J1m1COSAeCZ6525hHI)Jgcx_IUY@o}ITr!DEkX zm||iZ^q2ue1sm~g?}Rw5W*OPHwg`APPyMpfyjCQaYe|>GuesWF$2zVr)}ocG>9cV~ zQn07CW@bsk>RN_oJdcc14QBQoOba#BRhlPRxFRotk!v}Igb8e;ff<5BL)j(U(1WX>m*8rnZQOF%&bJS$3fjVPR~J9U`;9ZX#Q1 z7s>MM5dLnv_=E|X$N@M#T)<;7?*PAM?XmD%re>6?U9&HjXaJoINEm9mEyXO#2{ z_KEBP4AQxQMGj_9>?5LCaxIjjpLuE=KF&QV`Yw*aU8mi!wPV7c4ri6-8WSU|^BdiXa zueY_Fs}&I)VdfP)o?WgLXPU@+jW}a?aCB&-DURK(#f!_{S_#qSh$xehJwq7DXL)g} z)Jph{bv!=d!JWExGftRhHpLsG*&c^TlPQ*`y66K69bV6k*-;0Sxu4Na)efEz&x&j< z6SP*>DB5^9K5ZK^F#??gs$hw2wHHRV-++WQiYoco5N?i&G{y%*DB@ESdtr!(MhfAP z*bzJ4>ls;=eH5EpD>`N>eA2AgqFQlmqeDD9>0q7~YZA@-%-T8&D_F*x-4xMR%;x&d z>Grr*tl}-^j+eZviQq-KPRvA>QwPbKf@v;h;k-|K-O2=T{SX(Tv zqop^?suRgJ)`>Ei<03-XE_n3(rY-A+a&y{-x2EVUQ|h9jo`WHYT-_|quZt2M89WU+ zkqOK4IXrit7ucw7srp8i?R7O9_`VEtLstM)vO5G4No@RCv_66Ix zef|LqT3OYS>JaBTqA!2O&5Ba1&3=U0j%>`vWuBB;;PEWmF(x>aZG=_9G44^>SzCrR zrLc%dlonGcJL0H4!3hX#J_4WE8R$xOaM9E!yfEft{KFIxpT~}22^cNBaMV19>sj@X zthe=WHm4rSTg1fh2{CAMZ#(jSKO2^ZzvT~pWdZlE7y}{1_oS@_xAbE?q7$YWwOkc( zsHfe|z}dFlJSrEUOa6m9s@zfikYChCH}-^^UD?W$EZ7_`@?cT@*FD6N`WO>TLElg> zBskg_jkv_K$MsCXap)(%s*eT~U&XW!X3LPuY+qed=tR_yin?JjS{Ie<$O|lY#8Mq2 z**3>$w!R+fYuq$rTyXS6G)?v5Oi?jYOq9I`>cz9|h*W9;Z*C{X1xFzb>rY{;8{k<{ zofVclfM7#kPEt=UdXgIL~S?QOtx81bakMz>{T`|3oq4Gj`mA>2LxgQt8&A@>o( zE>_uqk7J&~Cgl*f$@r1C$0bYn^`xdR`i|?f7Hik$X-ErZn_ZC^G@(V$5H6=&vADJXEfJW`L(nJu64+xC}VJfIh;Lcs1=qc4Y`Nh zzgPeE@5@GLiO+EVzJ{)F4o{c@Y^9^B-Li;=^&l*+U}qiqR3=RRZp7p`6r5v?%&!~L zi;b8*)D&q#8trJvJBb?&V`Gqz+Z)B1;$vf?(Vp*Zgv)KXjS3Di#)~$U{A$cq8SVP`S0h-ZH~^U533qg#iLY`=3tbVQ<&6~j#HrmHRT zop~PJhQ}3JImz6_6ISF^h6^t#Ke{jsYqf^;3m1{4*?3hm*9D~!$MI1AqZ6Wx7?EOx zhQ!Cv-^32M#D)j6!!Ag+A9w?rJxhjkY8`kjIv;JK@W3TvB3k$-5Ua#g8vWV}E}U|J zUrP?7e^4~J#f>pgMImdfO&C^U7E+eX#dBxkYGK(MxaT-C#q5G3*>RT%eCW<@yM(fr zE@6mM7)x)==Nl}iab#qan4|1%9B+yYGx8!J22xr;2OFC)=#NB89cjemCz2g&JT)8z z8Uxx86Fb$I5570Mpa7pm9CAE|@n#`FuCa&Kofp*iaF^xtxc>Pw83Xp6O|=1g9DC6u zjIC&j@w(>xm!@LOo+o_U3m-~&l+dT)hM=_m=t0v+-hDlRZSf&)tThv_nu>W#sw-*< zHvZ85p60=B{*#MnNwUsWOY}{UsNh?Jib&C)U9}Y5?phcx}e^!j+fe1Jn zAefSGdF3fyfUX8s5z!M_wi|l8Z?rZSm2!<6AK(27v*#~(RnOI~WzV@j=Ow>Z-N(wc zegfu&?5LZlEGOM~<9gODE_f;{bt8YT!H?`SXhB&ybOo1@D@f^CTHU=1FJy$a%w3B^ zMA$U8${l@8TwE}w$@y-)d06Op7#8O^?u3Y57l$G-9l~Oz_>V34u%ocbc3fJ+hy4MLf%j1(63?1iq#3sat zvqc`FZ_0*X(JbB`XD9LYI2dy`Ge#{(JmRNeco@Y_Kp^><0Z(@Zx>ZNHXg)-dKAYe` zrxl<(9#QE2BI8+=2ga2abQ{QXGf%mf9#bOX`SL)rC!gIsapxlqyn%o^%I10^?Bxoc zt$YA3m8jg9HpeGKn%PlLbIc@m0s^JlTErF1d(c<%#?+IKweP~_`BDDV1=@8Lt~_<- zcwy*fS>S~p?-;i&)oe2~TRi+qugMr)=XmjCiD$FCBH1FZ*a(*870))p5E6x+lT2tq zJ<$+9^h9sNcEPW#6IufO$*;NEb(MB4JI+lqpl5oTOx*VhiL~(9M3tAAO}zBtu}*Hz zOWWM$yxKup;YA;9GB32{USc4d+FX<;Bi{mwXL*n3-Za_HzqldMqY)6WDQYt@Xd? zjmFxjX|H)lut(ma+54hJEX!%3wS)!mwqO~SLfF9;D6LU!lQ*hP6-*1C@ysZHYR7vk zKB+;!I?2T5x13~}#up^gTcU}AEwbPVzZO^Vj6i|}$Huc?T4GwlHF?$IJ0YI&n3p<~ z)V(da7smLAiP6F41oVBSu&snGvVeP|3!gS24kH}47|xmHT1zg;UbdWKisMy2xfRbU z-bR+LQl!Xewzd^gB#zB&IT^K}6jXqH40U zt*F_#00)~d@F=V*;n5T$sU)9plO>VO_Q3;U1&zsky2j@DbT)DgA7y3wC@eb=&Qi6B zXz5CxtH`+>J{VKPvpsN`yr0*d9l!Bw@d184yaiG^RB?9NhnMFPAEatLy9768R>lMS zQxiVLJ+oj4ILB98$y?xya5nNM&&lKc0ya(Aa$nJ+ulCgj3g{4h(LQY8lD}}tdAVE? z`Df(gJ$A%*GCKjw(lb1S9IaX>YhIS1+2iwO_Q*G8D&|ekA(eev8!Z(>7@JV0Ff&W_ zi^D7fs~vu*P>2N5YYV@YX+9P3z?8@cbp4zBV)?4xc0WD^r@(i?QPmM1aHi%cYbSS_ z`x_kTM3->MkLO;QU!)d=JAMhVu_*tn5)M;$@dv@k>nWlT#TK{5L+~iuV^ZjAVrP8C z$b{YWjlc*d(HIkklZBCNre7>yEzR_cGsQ;oG08f=c(%{aj2-}`W(930 zAz9eLwo`&56HM$VysJ#*)Ahq&V^*#$^4(}FmP_u!ZpTxe6d@*Ke5{2(+{3of@!H@& zA`00Wf(cWc2~{_mec29A_B(%?+->|?xCwDo(C@Kd+VP^D*N&Izo$b&a@MVy!wlR~i zgx)qTn0?*O9Ep)7R>9FCz?TATl)hQJ7H;Ieh~c?~J%%5A%N;9+?f7a6q8Sy-X0=DY zE$2gvf-F8RK-EJzw$O+CG7| zHK!q7^a~$<6|d#jWa!byCdR6pS7OQFN&E2Ncsw+3E<((vP%$Qc)gFT@D?@Gk^<@Xv z$QTulhSwB=;Tlb`Fw$mIC$MF52wR{JWm|1c?0kbTcGHQcQfk9+w%R#@{niBQzvtZ1 z8cgNe0a}*baF1kLES^!p?4%buJ#P%RW3e1=Li>f%ywp3E?P$fPlGZuZa-xL9_(wrU%~%U>y%5I4a3YmPTJ>4C#5Xqq_fV|wRevz$|_xkqoGt+tWQyr zl~Sd$d9qEuoGvFTWzsgeOR?nQF*ZXfY;saRy;KTJRw`}7!;6*JRJ$x`o02SDk!kO8=gHlCE4=D3{7fI<>`W{S5W$YJCfxZhDDc?Y2fg3m*&JzD7U7@(uR7 z>Y#X*pJLeJW-Nnv&|iX=6Z>2gyn#3p8|YkqH*xk2!G91>zb&|gSXUwVHgWD_jVT5vLP4`P+rVS%t;OME!fA`EtuK_zy- zcmRJAKgZ!)&ew@Ua|Blr=dTy6cNI@GZ=>LP#6_C~yArqABDf=QfQ1YOlEEP2al~VY zV~N9wza%yjXAt+^Dgs!~8D0GLQ-XgdzIH?KSz^neo5G-i8=&Q1c1N%t2jMwiB5p$L zbywK;A?`ptxSA`3{TSj@;)%o+#0i`YsDCbsq9t*LFkrdFIh-*{WC6ndcj5rzgTzV1 z=ZN!(?^e5iL%5glZWH&f194rAQU7AepeYID?-maHh#mXuv_?nM97w#1 zcnsK5$APhYGKk^=;6mcht9hSzf^Uh7h*uI96Yn4{B|cKk2ZZ}8#AU?y-I4!1zzQ;W zNdi^Gbv#6bSfTKs8L@%5HL)XcUt$;H;lv)q6Nr6?<2)=PfDU9ZhXi^MFCh*f-atHv zcrWoV;*-QjYXgn`jQfcM8d3wBVJd`+AbA?z0s&x;lOBk_0&5Zi^Cd+!Wk|4TLhAoy3} zx$4H<}kzjt{mPe?Z>~9ligoz}7Ud<$53j=*F@9HeF(3SX#gJ29P zG<$=)V1KZMJ4kLR4Dd>jCQ#8+@cYE!#3*~3{f@fA9_Q#Z4r(nJLjsM<-xm>FLj0U~ zEpZ9)P7H!H2SsCqgX1JnLCnvR@d)M;KdJVxRHTrEZkF4JPZAMmNUWP8{PQAqL1BOx z>rC8%I8Z_Ua}Rcq!6*_arWi&N=aT(&;%s89(QEEAh%<@j5$6yW67L}PAwFgy0}nDN zB`&xsp70Lw5L6HT1enli0Wy-uZkoo9#4U);#9fHPi3bpmC$@|rgJEP4OdLoYOPo~g zfY?C%E%A^`BErjw=Uo=Ok=Wy+;N8ToLf*oTl7S<6@HcTbIVd9zpcJVj9&$x^$S^17 zSvcsLUsMjFEzy5(nay zKpx>v#3|HN_a)ZN680mByP&>mlMo{r#FB$ghAzoS50;r^E)pOzw6hK{DVIP<&Jai+j`bKbj;{3~k z-y|NEBKSk%ZP;Yw;l&a6{u9s74e)~%S_C%ZNFQhZBSbuj3vg0}a}IGh+F;Imi8H4N zE+QU}PJ!EBCQh9$_#tsXl3;s-@c*#IP9%vN8C>~F2y`YMvsW-af}%xeTbAIF#KUlM zlLr`2oPJ&K*TiOu&|+fURbh{_bDDpaZ1f`BgWY5hx`s=k{lahf%4%PMqs0 z3e{cW=_Vonf;cu*a4n4gd5WfxePh9xgus*s;7tN0wFS2&9!2)uiHFq^_5s9M4uS_0 zdyxCF#JMzLG7^uc2biQW>R-B9WWfv)aEcYYfH(z186Lq*;(0d&uO!YQ`)$NNwES|6 zIHz35@NhjA?B|JarW>s(iancOILy1#D1dk;i zA0~JrarjKZ=33PMcc1|ANgyqT*%Sc2DWq`{J;8e7+||N^UBuIW7JQI+*c!oQ)$Vfy zR}w!zDEOs?3`+M413tmvNt9e5*p2w`9>Hyiv$qTGN&I}L;DN-E(EPKodt~59F?vC4 z*e3$S*UYpO*;XjH6LIldqLB6{F2MwVmyr*NcMKF9L7YvCknzON`*M5a|4cH-)eIQJ zr|q-=!-=zq+w>D2t|v~!jD!cci@2bp;6uduZwNj`T-jalRpK_dYyJNNGRUTus){(P zp?KmK#I7{)aHu09cqLYN=u8|+>_r?-jBo#G50oD-OLavAvhW@ekFgW6H?a?K2jX7DKE&@5 zmxT-WMq(GTk0tIx{3UUTB}ya-|AY^(_h#ZO;$hS@uON;bD&#j48>S1+C+WfwkKxwL<%Jm+Y=|%7xK=;Z5jw}&RMH}PQsuA32crL z5$a3q6D@c!@fcd78AI&tCESM)r)o1B?5+?85lCU@}pC6MDQMBN9zBN66gFaB3MG4S}gchJ?j4*$lw79ltu~On5{l3}^{M|~bymb^GzpYZfWgFp6u~&+ zDq4c!dCMb|N$%$nXPp=REhf%ACwLWc>IK0Y@$00T2SM}%JBfQ77Xp6}SJ5igdE(^Z z;t9)$$Kd@_o+S^6r@teZp|J4?jwktg#3h4;y`?D`v>^w+#NI=NKo4TGr-)DhF<;%} z0S+ckCw{+L9&cK4dlT{DF9lB}?)|yu-oh4=fzBubTuR(wyx?5o!Vd-SA}*ko@i6gb z;d~AKdr&|A&!5Q3EM`*6h5n4Z9q@Zs0KHy!7XcW+Zx=Z2KTJN zZxC09&j!^H7*>PF)L>H$j;g_*)!;8{@Hc|7!bE=yYX~f^!OLp!+8VsE2JfuF`)lw~ zjd3WjIs&I_2;8Z`iu1qouxSl$SA+Z3;CE~A1kOnR*AYmpAuziJ<5zk9RfrbV;3YLU zy9TeT!JEK*{P8*hzts@fTZ0eQ;8QjDYz@9rgUf61LuWDme;tA6H3W1n|9)co8r-M` z<9C?;l|n6RaJw4Z%?0UiodN+h1P0aM_iOOSH8`vWz6%%s)Tw7^$6-QR29?{C<{Ly z_Y4ZlfDEgn>?PDIC|)WgC>ctD!qP3nM;(|Alr0oK;KuBr?4fEwVULN`hN=UF?IGp} zRS&8@6wbCVC#Z%{ji9hU#ay5o^ZlPD&@_eOyH(Ag+@P>Q#XO)qp}e4)Lt%BDwSdB2 z6>A0M1LX_l2h|#i?{2k)Y6sOGssmI?9jXVEKMuh#Y;Lh$P`#o0 zK=p|H_(6Fvl7+y8?xk*8h7}@%mStS3E!de`klKMt=PN&W`3a^5eg< zL!EzC-;AG)S4aG#y7lhPrZ|FPNy?*&8Pj^#4QdVb|>%Yej zi|9M5PIvTY@sr#3clC+tqPzOLYVbY%>1KGloDK)`WAgkeyHyz<;6eJd;agf56*sl|FV$g3Vis`c$#`t@qRO4*95<@1r84RB3-sFhkL<^#+r%g(hpwelTpt zko^Zt|49I9or5YxD=jSYhDx%KOpzgNanQXJoAP+#j|Ylxw|ddXX2jHxlDQq;`ete0 z!5gpL+V^p<-RyGs?r#?*&34UR^+8*=T83X%6yIOgZiYv`?(eV?7M#EQ(DGloRgseAit#fU5?AfB@ zhev#r((}@oBlYutIk0P7>H3c+cOCVkXWuVhWfbfy@lVe9bkC;Se{DUK;%fV5*Kzw8@#Lg z%Bpvh?e;C{laV#$>82g7N#_q0&iKvs+S}fJ3y16;p8egzjYDqUJ$vA4 ztC5{N4*JaNHPF(!SMQ^{JmxOn{KHqicK3bPdek2i;aoW9#Gk*N7}j>pjDm=Q!Siiv zC%es=QMKBBM3aTh_lz@qaqH6_`(3Uqp8A#Bl&@d9O^d%?aN~6Tq>&%p+1)khNW=bN zCmkN_-u`%K&lc-4#+TN6fB5_cE_07;PhT-)!&||wPWoZ>hW@tyzE8;fd3P-O7`J79 zW9`c>-JX5xhX%t3{qkA)YR9Av3qSq4d+}QL@1Fktcxmlt6E`Hq^?74kQcUCSE(0s1 zdo3Ql7~((ie5UuiefKq&%Z-8Wez+p%flJKX=oMpkRW{srd|`ifE9TiReV+cj(YG@2 z{psw}Z-2XWZ}IyTO+8ZUpNbs*d(-cG`9*}@TV@&cX1yH$-S0n_6Yq6fJLP3w{}J}n z$M^qwa?luKvj!jRIgv8>WA~ope!4d5ou1upOdEP@$6ue{ntS8k+&g|D)B9fdvfH)w zLvE|T9v*hp<4oLdbxxkWn$*uZ>Eru8tM2}~{J`K<4yl*UuiSU&GP7SI2imXAGJG;K z)$xx)-~4*r-Hy%}SY$cSv$Kzz=etWso{J6e?09Ozk&Uef9(y-))a*4AmyUisW9_{U ze|(Ye=zP4(M=_s_e)aVSjndBq-CE;uZ^D7*zi!BHFl1cDwW_zf?A~(f?+1%#UhUhp zVE&X-*S`A8v1#U)t5epV_6$8(x^Us1A;+(u9^Pb8TqjQ(v%#(NgaPX=_1NWC{?%>E z`i`e;KDP`%_Tk&#J~bX3+uy%`Y^i#5+&!o4Z5w~<+Vk)IZk-zREH<}a5qWOgrLo^u zwYazMtHVqBooasUv%iOgo%RT>6T0fFuY%{kfB6G1_kC5h+qgu0u(ZDW$FT$4+|Sp# zduvIP#pkPfnUj)k%ru>?cT8;3ttTTb%e>!S^?Uu#S9*pI`NGg- z=TOt-cJ5DSIEJ_B>16b=-&xS|oN3O}lo5Gey{10Ry>;K+e&PX-&bDiNw;9rTg7aUC z+O+Q6{n=Z~{+fEa`H#(iIC3*Cs(;;|!oR3|f8*p04ZGF(rsbXe4eEWf;O}-rqqd)q z+%#<5JH;_!dw%$8ZToj4+J2l{XxY4EZBW8Y!_-k7Oa2-bUa_boYT=^$2Ytfq`WjFF z-K*%;YNg(6x2l4B>)&a9>cisi-X40$=9{e@?!~;<^xO@hLI{4p?Z zdtvP7NtS^D#SI4i`Q~2*T}E_1*F9n^>wR@zU;VyoUpXE~3LUjE^|7n}H%EpVKm9dw z+<@->&R=|fX}m1I+7ooC-{*aUjy(JISnIW+?Jsm|QOmz~_sTx|bCy<&ll1K(VqW;9 z{JP|wx98kDRN?jY(ER#?R_rtVxUR>JUY8!7y|SY4%d6YBy^*o9n`K5+f?c!t+k5wS z3tT=trSG$dS%&8wn~uKOy>d~+j(}%uzTxqkae)KA^!}rByNKYvw!eoMy2fmscPP;I z$MVG)Q}>^*JL|i@Eu$Mvvl+gxbB8`3#d>@03+=YypxdrnVe_Z-U;K{m`QHakh@1Rg zkZ%*aTS8+|HDL zdp9e|ShB6C@|V(r=A-MnwEgO6&*tOy&JFw~efoRvU+}IUv~RxTIy&z|2b&0 zO+C6N%~~;S;0{aquYc<2UB4Z-Yj5a+sSQ6_6eszsT+Grezp>-;I|B|DPhHc|?6%+I zc=zqinjXGf_nl#XWG8q$o4@^F{>i2LUuJk0oXk2u|4C+-HeKWH)rlJ0?a2Ij&k~w7 z9pYb*9_Tw@{XWn08`f8L+WukJj@gHQpB-_r#i0%9M&)8@4AdYA`3@=;VM0 zGwgiQ%V&M`^M#Oo6=4}Ap<~iYo-Z(t&dl5W+u8Z;Z}xINkY<_~()?xd!?1`WcC+u_ z3u=Gz&rN+^zHJ$P(cfv@W0rTp%WG-JSu>jDZfU$^NBr(lp*MbYnv!WFDzwB9j ackal)3XF{|2fBUKYs<;+?wvwc`o93GW{U;@ diff --git a/dist/platform/elc.c b/dist/platform/elc.c index 1eab9b1..52ef58a 100644 --- a/dist/platform/elc.c +++ b/dist/platform/elc.c @@ -2,14 +2,18 @@ #include #include "el_runtime.h" -el_val_t is_digit(el_val_t ch); -el_val_t is_alpha(el_val_t ch); +el_val_t lex_is_digit(el_val_t ch); +el_val_t lex_is_alpha(el_val_t ch); el_val_t is_alnum_or_underscore(el_val_t ch); -el_val_t is_whitespace(el_val_t ch); +el_val_t lex_is_whitespace(el_val_t ch); el_val_t make_tok(el_val_t kind, el_val_t value); el_val_t keyword_kind(el_val_t word); el_val_t scan_digits(el_val_t chars, el_val_t start, el_val_t total); el_val_t scan_ident(el_val_t chars, el_val_t start, el_val_t total); +el_val_t substr_at(el_val_t chars, el_val_t start, el_val_t total, el_val_t needle); +el_val_t str_has(el_val_t s, el_val_t needle); +el_val_t looks_like_code(el_val_t s); +el_val_t strip_code_comments(el_val_t s); el_val_t scan_string(el_val_t chars, el_val_t start, el_val_t total); el_val_t lex(el_val_t source); el_val_t tok_at(el_val_t tokens, el_val_t pos); @@ -25,6 +29,7 @@ el_val_t parse_match(el_val_t tokens, el_val_t pos); el_val_t parse_pattern(el_val_t tokens, el_val_t pos); el_val_t parse_for_expr(el_val_t tokens, el_val_t pos); el_val_t parse_block(el_val_t tokens, el_val_t pos); +el_val_t is_duration_unit(el_val_t name); el_val_t parse_postfix(el_val_t tokens, el_val_t pos); el_val_t op_precedence(el_val_t kind); el_val_t is_binop(el_val_t kind); @@ -38,6 +43,7 @@ el_val_t el_type_to_c(el_val_t type_str); el_val_t emit_line(el_val_t line); el_val_t emit_blank(void); el_val_t binop_to_c(el_val_t op); +el_val_t duration_unit_nanos(el_val_t unit); el_val_t cg_expr(el_val_t expr); el_val_t next_match_id(void); el_val_t cg_match(el_val_t expr); @@ -55,7 +61,35 @@ el_val_t param_decl(el_val_t param, el_val_t idx); el_val_t params_to_c(el_val_t params); el_val_t transform_implicit_return(el_val_t body); el_val_t is_int_name(el_val_t name); +el_val_t is_instant_name(el_val_t name); +el_val_t is_duration_name(el_val_t name); el_val_t is_int_call(el_val_t call_expr); +el_val_t is_instant_call(el_val_t call_expr); +el_val_t is_duration_call(el_val_t call_expr); +el_val_t is_calendar_name(el_val_t name); +el_val_t is_caltime_name(el_val_t name); +el_val_t is_rhythm_name(el_val_t name); +el_val_t is_localdate_name(el_val_t name); +el_val_t is_localtime_name(el_val_t name); +el_val_t is_localdt_name(el_val_t name); +el_val_t is_zone_name(el_val_t name); +el_val_t is_calendar_call(el_val_t call_expr); +el_val_t is_caltime_call(el_val_t call_expr); +el_val_t is_rhythm_call(el_val_t call_expr); +el_val_t is_localdate_call(el_val_t call_expr); +el_val_t is_localtime_call(el_val_t call_expr); +el_val_t is_localdt_call(el_val_t call_expr); +el_val_t is_zone_call(el_val_t call_expr); +el_val_t is_calendar_expr(el_val_t expr); +el_val_t is_caltime_expr(el_val_t expr); +el_val_t is_rhythm_expr(el_val_t expr); +el_val_t is_localdate_expr(el_val_t expr); +el_val_t is_localtime_expr(el_val_t expr); +el_val_t is_localdt_expr(el_val_t expr); +el_val_t is_zone_expr(el_val_t expr); +el_val_t is_instant_expr(el_val_t expr); +el_val_t is_duration_expr(el_val_t expr); +el_val_t time_record_violation(el_val_t kind, el_val_t detail); el_val_t is_int_expr(el_val_t expr); el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name); el_val_t is_self_formation_call(el_val_t fn_name); @@ -63,11 +97,21 @@ el_val_t is_dharma_call(el_val_t fn_name); el_val_t is_llm_call(el_val_t fn_name); el_val_t cap_check_call(el_val_t fn_name); el_val_t emit_cap_violations(void); +el_val_t emit_time_violations(void); el_val_t builtin_arity(el_val_t name); el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual); el_val_t arity_check_call(el_val_t fn_name, el_val_t actual); el_val_t emit_arity_violations(void); el_val_t add_int_name(el_val_t name); +el_val_t add_instant_name(el_val_t name); +el_val_t add_duration_name(el_val_t name); +el_val_t add_calendar_name(el_val_t name); +el_val_t add_caltime_name(el_val_t name); +el_val_t add_rhythm_name(el_val_t name); +el_val_t add_localdate_name(el_val_t name); +el_val_t add_localtime_name(el_val_t name); +el_val_t add_localdt_name(el_val_t name); +el_val_t add_zone_name(el_val_t name); el_val_t build_int_names_for_params(el_val_t params); el_val_t cg_fn(el_val_t stmt); el_val_t is_fndef(el_val_t stmt); @@ -107,13 +151,11 @@ el_val_t compile_js(el_val_t source); el_val_t compile_dispatch(el_val_t tgt, el_val_t source); el_val_t detect_target(el_val_t argv); el_val_t strip_flags(el_val_t argv); +el_val_t dirname_of(el_val_t path); +el_val_t parse_import_line(el_val_t trimmed, el_val_t dir); +el_val_t resolve_imports(el_val_t src_path); -el_val_t _argv; -el_val_t _target; -el_val_t _positional; -el_val_t _argc; - -el_val_t is_digit(el_val_t ch) { +el_val_t lex_is_digit(el_val_t ch) { if (str_eq(ch, EL_STR("0"))) { return 1; } @@ -148,7 +190,7 @@ el_val_t is_digit(el_val_t ch) { return 0; } -el_val_t is_alpha(el_val_t ch) { +el_val_t lex_is_alpha(el_val_t ch) { if (str_eq(ch, EL_STR("a"))) { return 1; } @@ -310,10 +352,10 @@ el_val_t is_alpha(el_val_t ch) { } el_val_t is_alnum_or_underscore(el_val_t ch) { - if (is_digit(ch)) { + if (lex_is_digit(ch)) { return 1; } - if (is_alpha(ch)) { + if (lex_is_alpha(ch)) { return 1; } if (str_eq(ch, EL_STR("_"))) { @@ -323,7 +365,7 @@ el_val_t is_alnum_or_underscore(el_val_t ch) { return 0; } -el_val_t is_whitespace(el_val_t ch) { +el_val_t lex_is_whitespace(el_val_t ch) { if (str_eq(ch, EL_STR(" "))) { return 1; } @@ -485,7 +527,7 @@ el_val_t scan_digits(el_val_t chars, el_val_t start, el_val_t total) { running = 0; } else { el_val_t ch = native_list_get(chars, i); - if (is_digit(ch)) { + if (lex_is_digit(ch)) { text = el_str_concat(text, ch); i = (i + 1); } else { @@ -518,6 +560,213 @@ el_val_t scan_ident(el_val_t chars, el_val_t start, el_val_t total) { return 0; } +el_val_t substr_at(el_val_t chars, el_val_t start, el_val_t total, el_val_t needle) { + el_val_t nchars = native_string_chars(needle); + el_val_t nlen = native_list_len(nchars); + if ((start + nlen) > total) { + return 0; + } + el_val_t i = 0; + el_val_t matched = 1; + while (i < nlen) { + el_val_t a = native_list_get(chars, (start + i)); + el_val_t b = native_list_get(nchars, i); + if (str_eq(a, b)) { + i = (i + 1); + } else { + matched = 0; + EL_NULL; + i = nlen; + } + } + return matched; + return 0; +} + +el_val_t str_has(el_val_t s, el_val_t needle) { + el_val_t chars = native_string_chars(s); + el_val_t total = native_list_len(chars); + el_val_t i = 0; + el_val_t found = 0; + while (i < total) { + if (substr_at(chars, i, total, needle)) { + found = 1; + i = total; + } else { + i = (i + 1); + } + } + return found; + return 0; +} + +el_val_t looks_like_code(el_val_t s) { + if (str_has(s, EL_STR("= total) { + scanning = 0; + } else { + el_val_t lc = native_list_get(chars, i); + if (str_eq(lc, EL_STR("\n"))) { + scanning = 0; + } else { + i = (i + 1); + } + } + } + prev = EL_STR(""); + } + } else { + if (str_eq(next_ch, EL_STR("*"))) { + i = (i + 2); + el_val_t scanning2 = 1; + while (scanning2) { + if (i >= total) { + scanning2 = 0; + } else { + el_val_t bc = native_list_get(chars, i); + if (str_eq(bc, EL_STR("*"))) { + el_val_t after = (i + 1); + if (after < total) { + el_val_t nc2 = native_list_get(chars, after); + if (str_eq(nc2, EL_STR("/"))) { + i = (after + 1); + scanning2 = 0; + } else { + i = (i + 1); + } + } else { + i = (i + 1); + } + } else { + i = (i + 1); + } + } + } + prev = EL_STR(""); + } else { + out = el_str_concat(out, ch); + prev = ch; + i = (i + 1); + } + } + } else { + if (str_eq(ch, EL_STR("'"))) { + in_squote = 1; + out = el_str_concat(out, ch); + prev = ch; + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("\""))) { + in_dquote = 1; + out = el_str_concat(out, ch); + prev = ch; + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("`"))) { + in_btick = 1; + out = el_str_concat(out, ch); + prev = ch; + i = (i + 1); + } else { + out = el_str_concat(out, ch); + prev = ch; + i = (i + 1); + } + } + } + } + } + } + return out; + return 0; +} + el_val_t scan_string(el_val_t chars, el_val_t start, el_val_t total) { el_val_t i = start; el_val_t text = EL_STR(""); @@ -583,7 +832,7 @@ el_val_t lex(el_val_t source) { el_val_t i = 0; while (i < total) { el_val_t ch = native_list_get(chars, i); - if (is_whitespace(ch)) { + if (lex_is_whitespace(ch)) { i = (i + 1); } else { if (str_eq(ch, EL_STR("/"))) { @@ -618,10 +867,14 @@ el_val_t lex(el_val_t source) { el_val_t result = scan_string(chars, (i + 1), total); el_val_t str_text = el_get_field(result, EL_STR("text")); el_val_t new_pos = el_get_field(result, EL_STR("pos")); - tokens = native_list_append(tokens, make_tok(EL_STR("Str"), str_text)); + el_val_t clean_text = str_text; + if (looks_like_code(str_text)) { + clean_text = strip_code_comments(str_text); + } + tokens = native_list_append(tokens, make_tok(EL_STR("Str"), clean_text)); i = new_pos; } else { - if (is_digit(ch)) { + if (lex_is_digit(ch)) { el_val_t result = scan_digits(chars, i, total); el_val_t num_text = el_get_field(result, EL_STR("text")); el_val_t new_pos = el_get_field(result, EL_STR("pos")); @@ -631,7 +884,7 @@ el_val_t lex(el_val_t source) { el_val_t after_dot = (new_pos + 1); if (after_dot < total) { el_val_t after_dot_ch = native_list_get(chars, after_dot); - if (is_digit(after_dot_ch)) { + if (lex_is_digit(after_dot_ch)) { el_val_t frac_result = scan_digits(chars, after_dot, total); el_val_t frac_text = el_get_field(frac_result, EL_STR("text")); el_val_t frac_pos = el_get_field(frac_result, EL_STR("pos")); @@ -654,7 +907,7 @@ el_val_t lex(el_val_t source) { i = new_pos; } } else { - if (is_alpha(ch) || str_eq(ch, EL_STR("_"))) { + if (lex_is_alpha(ch) || str_eq(ch, EL_STR("_"))) { el_val_t result = scan_ident(chars, i, total); el_val_t word = el_get_field(result, EL_STR("text")); el_val_t new_pos = el_get_field(result, EL_STR("pos")); @@ -1274,10 +1527,72 @@ el_val_t parse_block(el_val_t tokens, el_val_t pos) { return 0; } +el_val_t is_duration_unit(el_val_t name) { + if (str_eq(name, EL_STR("nanos"))) { + return 1; + } + if (str_eq(name, EL_STR("nano"))) { + return 1; + } + if (str_eq(name, EL_STR("millis"))) { + return 1; + } + if (str_eq(name, EL_STR("milli"))) { + return 1; + } + if (str_eq(name, EL_STR("millisecond"))) { + return 1; + } + if (str_eq(name, EL_STR("milliseconds"))) { + return 1; + } + if (str_eq(name, EL_STR("second"))) { + return 1; + } + if (str_eq(name, EL_STR("seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("minute"))) { + return 1; + } + if (str_eq(name, EL_STR("minutes"))) { + return 1; + } + if (str_eq(name, EL_STR("hour"))) { + return 1; + } + if (str_eq(name, EL_STR("hours"))) { + return 1; + } + if (str_eq(name, EL_STR("day"))) { + return 1; + } + if (str_eq(name, EL_STR("days"))) { + return 1; + } + return 0; + return 0; +} + el_val_t parse_postfix(el_val_t tokens, el_val_t pos) { el_val_t r = parse_primary(tokens, pos); el_val_t node = el_get_field(r, EL_STR("node")); el_val_t p = el_get_field(r, EL_STR("pos")); + el_val_t primary_kind = el_get_field(node, EL_STR("expr")); + if (str_eq(primary_kind, EL_STR("Int"))) { + el_val_t dot_kind = tok_kind(tokens, p); + if (str_eq(dot_kind, EL_STR("Dot"))) { + el_val_t unit_kind = tok_kind(tokens, (p + 1)); + if (str_eq(unit_kind, EL_STR("Ident"))) { + el_val_t unit_name = tok_value(tokens, (p + 1)); + if (is_duration_unit(unit_name)) { + el_val_t count_str = el_get_field(node, EL_STR("value")); + node = el_map_new(3, "expr", EL_STR("DurationLit"), "count", count_str, "unit", unit_name); + p = (p + 2); + } + } + } + } el_val_t running = 1; while (running) { el_val_t k = tok_kind(tokens, p); @@ -1733,6 +2048,17 @@ el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { p = expect(tokens, p, EL_STR("RBrace")); return make_result(el_map_new(4, "stmt", EL_STR("ServiceBlock"), "name", name, "sponsor", sponsor, "domain", domain), p); } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t k2 = tok_kind(tokens, (pos + 1)); + if (str_eq(k2, EL_STR("Eq"))) { + el_val_t name = tok_value(tokens, pos); + el_val_t p = (pos + 2); + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + return make_result(el_map_new(3, "stmt", EL_STR("Assign"), "name", name, "value", val), p); + } + } el_val_t r = parse_expr(tokens, pos); el_val_t val = el_get_field(r, EL_STR("node")); el_val_t p = el_get_field(r, EL_STR("pos")); @@ -1882,12 +2208,65 @@ el_val_t binop_to_c(el_val_t op) { return 0; } +el_val_t duration_unit_nanos(el_val_t unit) { + if (str_eq(unit, EL_STR("nano"))) { + return EL_STR("1LL"); + } + if (str_eq(unit, EL_STR("nanos"))) { + return EL_STR("1LL"); + } + if (str_eq(unit, EL_STR("milli"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("millis"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("millisecond"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("milliseconds"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("second"))) { + return EL_STR("1000000000LL"); + } + if (str_eq(unit, EL_STR("seconds"))) { + return EL_STR("1000000000LL"); + } + if (str_eq(unit, EL_STR("minute"))) { + return EL_STR("60000000000LL"); + } + if (str_eq(unit, EL_STR("minutes"))) { + return EL_STR("60000000000LL"); + } + if (str_eq(unit, EL_STR("hour"))) { + return EL_STR("3600000000000LL"); + } + if (str_eq(unit, EL_STR("hours"))) { + return EL_STR("3600000000000LL"); + } + if (str_eq(unit, EL_STR("day"))) { + return EL_STR("86400000000000LL"); + } + if (str_eq(unit, EL_STR("days"))) { + return EL_STR("86400000000000LL"); + } + return EL_STR("1LL"); + return 0; +} + el_val_t cg_expr(el_val_t expr) { el_val_t kind = el_get_field(expr, EL_STR("expr")); if (str_eq(kind, EL_STR("Int"))) { el_val_t v = el_get_field(expr, EL_STR("value")); return v; } + if (str_eq(kind, EL_STR("DurationLit"))) { + el_val_t count = el_get_field(expr, EL_STR("count")); + el_val_t unit = el_get_field(expr, EL_STR("unit")); + el_val_t mult = duration_unit_nanos(unit); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_from_nanos((el_val_t)("), count), EL_STR("LL * ")), mult), EL_STR("))")); + } if (str_eq(kind, EL_STR("Float"))) { el_val_t v = el_get_field(expr, EL_STR("value")); return el_str_concat(el_str_concat(EL_STR("el_from_float("), v), EL_STR(")")); @@ -1928,6 +2307,210 @@ el_val_t cg_expr(el_val_t expr) { el_val_t right_c = cg_expr(right); el_val_t left_kind = el_get_field(left, EL_STR("expr")); el_val_t right_kind = el_get_field(right, EL_STR("expr")); + el_val_t left_is_inst = is_instant_expr(left); + el_val_t right_is_inst = is_instant_expr(right); + el_val_t left_is_dur = is_duration_expr(left); + el_val_t right_is_dur = is_duration_expr(right); + el_val_t left_is_ld = is_localdate_expr(left); + el_val_t right_is_ld = is_localdate_expr(right); + el_val_t left_is_lt = is_localtime_expr(left); + el_val_t right_is_lt = is_localtime_expr(right); + el_val_t left_is_ct = is_caltime_expr(left); + el_val_t right_is_ct = is_caltime_expr(right); + if (left_is_ld) { + if (str_eq(op, EL_STR("Plus"))) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_date_add_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("Lt"))) { + if (right_is_ld) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_date_lt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (right_is_ld) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_date_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (left_is_lt) { + if (str_eq(op, EL_STR("Plus"))) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_time_add_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (left_is_ct) { + if (str_eq(op, EL_STR("Plus"))) { + if (right_is_ct) { + time_record_violation(EL_STR("caltime_plus_caltime"), EL_STR("CalendarTime + CalendarTime is not allowed (use cal_to_instant + Duration)")); + return EL_STR("0 /* TIME_TYPE_ERROR: CalendarTime + CalendarTime */"); + } + } + } + el_val_t any_temporal = 0; + if (left_is_inst) { + any_temporal = 1; + } + if (right_is_inst) { + any_temporal = 1; + } + if (left_is_dur) { + any_temporal = 1; + } + if (right_is_dur) { + any_temporal = 1; + } + if (any_temporal) { + if (str_eq(op, EL_STR("Plus"))) { + if (left_is_inst) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_add_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_inst) { + time_record_violation(EL_STR("instant_plus_instant"), EL_STR("Instant + Instant is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Instant + Instant */"); + } + } + if (left_is_dur) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_add_dur("), right_c), EL_STR(", ")), left_c), EL_STR(")")); + } + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_add("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(right)) { + time_record_violation(EL_STR("duration_plus_int"), EL_STR("Duration + Int is not allowed (use duration_seconds(n) or N.seconds)")); + return EL_STR("0 /* TIME_TYPE_ERROR: Duration + Int */"); + } + } + if (right_is_dur) { + if (is_int_expr(left)) { + time_record_violation(EL_STR("duration_plus_int"), EL_STR("Int + Duration is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Int + Duration */"); + } + } + } + if (str_eq(op, EL_STR("Minus"))) { + if (left_is_inst) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_sub_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_diff("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_sub("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(right)) { + time_record_violation(EL_STR("duration_minus_int"), EL_STR("Duration - Int is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Duration - Int */"); + } + } + } + if (str_eq(op, EL_STR("Star"))) { + if (left_is_dur) { + if (is_int_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_scale("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (right_is_dur) { + if (is_int_expr(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_scale("), right_c), EL_STR(", ")), left_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("Slash"))) { + if (left_is_dur) { + if (is_int_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_div("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("Lt"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_lt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_dur) { + time_record_violation(EL_STR("instant_cmp_duration"), EL_STR("Instant < Duration is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Instant < Duration */"); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_lt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_inst) { + time_record_violation(EL_STR("duration_cmp_instant"), EL_STR("Duration < Instant is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Duration < Instant */"); + } + } + } + if (str_eq(op, EL_STR("LtEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_le("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_le("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("Gt"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_gt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_gt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("GtEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_ge("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_ge("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("NotEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_ne("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_ne("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + } if (str_eq(op, EL_STR("Plus"))) { if (str_eq(left_kind, EL_STR("Str"))) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); @@ -1998,8 +2581,6 @@ el_val_t cg_expr(el_val_t expr) { } } } - /* Mixed Ident/BinOp int comparison (e.g. `i == n - 1`): use is_int_expr - to detect both sides are integers before falling through to str_eq. */ if (is_int_expr(left)) { if (is_int_expr(right)) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); @@ -2048,7 +2629,6 @@ el_val_t cg_expr(el_val_t expr) { } } } - /* Same mixed Ident/BinOp fix as EqEq for NotEq. */ if (is_int_expr(left)) { if (is_int_expr(right)) { return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); @@ -2096,6 +2676,14 @@ el_val_t cg_expr(el_val_t expr) { el_val_t fn_name = el_get_field(func, EL_STR("name")); cap_check_call(fn_name); arity_check_call(fn_name, arity); + if (str_eq(fn_name, EL_STR("sleep"))) { + if (arity == 1) { + el_val_t only_arg = native_list_get(args, 0); + if (is_duration_expr(only_arg)) { + return el_str_concat(el_str_concat(EL_STR("el_sleep_duration("), args_c), EL_STR(")")); + } + } + } return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); } if (str_eq(func_kind, EL_STR("Field"))) { @@ -2266,7 +2854,6 @@ el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var) { el_val_t s = native_list_get(stmts, i); el_val_t sk = el_get_field(s, EL_STR("stmt")); el_val_t is_last = 0; - /* BUG FIX: was str_eq(i, n-1) which segfaults comparing ints as strings */ if (i == (n - 1)) { is_last = 1; } @@ -2290,6 +2877,13 @@ el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var) { out = el_str_concat(el_str_concat(el_str_concat(out, EL_STR("(void)(")), val_c), EL_STR("); ")); } } else { + if (str_eq(sk, EL_STR("Assign"))) { + el_val_t aname = el_get_field(s, EL_STR("name")); + el_val_t aval = el_get_field(s, EL_STR("value")); + el_val_t aval_c = cg_expr(aval); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, aname), EL_STR(" = ")), aval_c), EL_STR("; ")); + } else { + } } } } @@ -2341,6 +2935,60 @@ el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { if (str_eq(ltype, EL_STR("Int"))) { add_int_name(name); } + if (str_eq(ltype, EL_STR("Instant"))) { + add_instant_name(name); + } + if (str_eq(ltype, EL_STR("Duration"))) { + add_duration_name(name); + } + if (str_eq(ltype, EL_STR("Calendar"))) { + add_calendar_name(name); + } + if (str_eq(ltype, EL_STR("CalendarTime"))) { + add_caltime_name(name); + } + if (str_eq(ltype, EL_STR("Rhythm"))) { + add_rhythm_name(name); + } + if (str_eq(ltype, EL_STR("LocalDate"))) { + add_localdate_name(name); + } + if (str_eq(ltype, EL_STR("LocalTime"))) { + add_localtime_name(name); + } + if (str_eq(ltype, EL_STR("LocalDateTime"))) { + add_localdt_name(name); + } + if (str_eq(ltype, EL_STR("Zone"))) { + add_zone_name(name); + } + if (is_instant_expr(val)) { + add_instant_name(name); + } + if (is_duration_expr(val)) { + add_duration_name(name); + } + if (is_calendar_expr(val)) { + add_calendar_name(name); + } + if (is_caltime_expr(val)) { + add_caltime_name(name); + } + if (is_rhythm_expr(val)) { + add_rhythm_name(name); + } + if (is_localdate_expr(val)) { + add_localdate_name(name); + } + if (is_localtime_expr(val)) { + add_localtime_name(name); + } + if (is_localdt_expr(val)) { + add_localdt_name(name); + } + if (is_zone_expr(val)) { + add_zone_name(name); + } el_val_t vk = el_get_field(val, EL_STR("expr")); if (str_eq(vk, EL_STR("Int"))) { add_int_name(name); @@ -2364,6 +3012,13 @@ el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { } return declared; } + if (str_eq(kind, EL_STR("Assign"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } if (str_eq(kind, EL_STR("Expr"))) { el_val_t val = el_get_field(stmt, EL_STR("value")); el_val_t val_kind = el_get_field(val, EL_STR("expr")); @@ -2579,6 +3234,24 @@ el_val_t is_int_name(el_val_t name) { return 0; } +el_val_t is_instant_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__instant_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_duration_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__duration_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + el_val_t is_int_call(el_val_t call_expr) { el_val_t func = el_get_field(call_expr, EL_STR("func")); el_val_t fk = el_get_field(func, EL_STR("expr")); @@ -2598,6 +3271,33 @@ el_val_t is_int_call(el_val_t call_expr) { if (str_eq(name, EL_STR("str_char_code"))) { return 1; } + if (str_eq(name, EL_STR("str_count"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_lines"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_words"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_letters"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_digits"))) { + return 1; + } + if (str_eq(name, EL_STR("str_last_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_find_chars"))) { + return 1; + } if (str_eq(name, EL_STR("native_list_len"))) { return 1; } @@ -2646,10 +3346,527 @@ el_val_t is_int_call(el_val_t call_expr) { if (str_eq(name, EL_STR("float_to_int"))) { return 1; } + if (str_eq(name, EL_STR("unix_timestamp"))) { + return 1; + } + if (str_eq(name, EL_STR("instant_to_unix_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("instant_to_unix_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_to_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_to_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_to_nanos"))) { + return 1; + } return 0; return 0; } +el_val_t is_instant_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("now"))) { + return 1; + } + if (str_eq(name, EL_STR("el_now_instant"))) { + return 1; + } + if (str_eq(name, EL_STR("unix_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("unix_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("instant_from_iso8601"))) { + return 1; + } + if (str_eq(name, EL_STR("el_instant_add_dur"))) { + return 1; + } + if (str_eq(name, EL_STR("el_instant_sub_dur"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_duration_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("el_duration_from_nanos"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_nanos"))) { + return 1; + } + if (str_eq(name, EL_STR("el_instant_diff"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_add"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_sub"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_scale"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_div"))) { + return 1; + } + if (str_eq(name, EL_STR("ttl_cache_age"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_calendar_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__calendar_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_caltime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__caltime_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_rhythm_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__rhythm_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_localdate_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdate_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_localtime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localtime_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_localdt_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdt_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_zone_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__zone_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_calendar_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("earth_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("earth_calendar_default"))) { + return 1; + } + if (str_eq(name, EL_STR("mars_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("cycle_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("no_cycle_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("relative_calendar"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_caltime_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("now_in"))) { + return 1; + } + if (str_eq(name, EL_STR("in_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("cal_in"))) { + return 1; + } + if (str_eq(name, EL_STR("zoned"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_rhythm_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("rhythm_cycle_start"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_cycle_phase"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_duration"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_session_start"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_event"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_and"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_or"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_weekday"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_weekly_at"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_localdate_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("local_date"))) { + return 1; + } + if (str_eq(name, EL_STR("el_local_date_add_dur"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_localtime_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("local_time"))) { + return 1; + } + if (str_eq(name, EL_STR("el_local_time_add_dur"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_localdt_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("local_datetime"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_zone_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("zone"))) { + return 1; + } + if (str_eq(name, EL_STR("zone_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("zone_local"))) { + return 1; + } + if (str_eq(name, EL_STR("zone_offset"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_calendar_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_calendar_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_calendar_call(expr); + } + return 0; + return 0; +} + +el_val_t is_caltime_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_caltime_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_caltime_call(expr); + } + return 0; + return 0; +} + +el_val_t is_rhythm_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_rhythm_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_rhythm_call(expr); + } + return 0; + return 0; +} + +el_val_t is_localdate_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_localdate_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_localdate_call(expr); + } + return 0; + return 0; +} + +el_val_t is_localtime_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_localtime_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_localtime_call(expr); + } + return 0; + return 0; +} + +el_val_t is_localdt_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_localdt_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_localdt_call(expr); + } + return 0; + return 0; +} + +el_val_t is_zone_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_zone_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_zone_call(expr); + } + return 0; + return 0; +} + +el_val_t is_instant_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_instant_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_instant_call(expr); + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("Plus"))) { + if (is_instant_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_instant_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_instant_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t is_duration_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("DurationLit"))) { + return 1; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_duration_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_duration_call(expr); + } + if (str_eq(k, EL_STR("Neg"))) { + return is_duration_expr(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("Plus"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + if (is_instant_expr(el_get_field(expr, EL_STR("left")))) { + if (is_instant_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Star"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Slash"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t time_record_violation(el_val_t kind, el_val_t detail) { + el_val_t csv = state_get(EL_STR("__time_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(kind, EL_STR(":")), detail); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__time_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + el_val_t is_int_expr(el_val_t expr) { el_val_t k = el_get_field(expr, EL_STR("expr")); if (str_eq(k, EL_STR("Int"))) { @@ -2867,6 +4084,32 @@ el_val_t emit_cap_violations(void) { return 0; } +el_val_t emit_time_violations(void) { + el_val_t csv = state_get(EL_STR("__time_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t colon = str_index_of(entry, EL_STR(":")); + if (colon > 0) { + el_val_t detail = str_slice(entry, (colon + 1), str_len(entry)); + emit_line(el_str_concat(el_str_concat(EL_STR("#error \"temporal type error: "), detail), EL_STR("\""))); + } + i = ((i + next_comma) + 1); + } + return 0; +} + el_val_t builtin_arity(el_val_t name) { if (str_eq(name, EL_STR("println"))) { return 1; @@ -2946,6 +4189,93 @@ el_val_t builtin_arity(el_val_t name) { if (str_eq(name, EL_STR("str_upper"))) { return 1; } + if (str_eq(name, EL_STR("str_count"))) { + return 2; + } + if (str_eq(name, EL_STR("str_count_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_lines"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_words"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_letters"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_digits"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of_all"))) { + return 2; + } + if (str_eq(name, EL_STR("str_last_index_of"))) { + return 2; + } + if (str_eq(name, EL_STR("str_find_chars"))) { + return 2; + } + if (str_eq(name, EL_STR("str_repeat"))) { + return 2; + } + if (str_eq(name, EL_STR("str_reverse"))) { + return 1; + } + if (str_eq(name, EL_STR("str_strip_prefix"))) { + return 2; + } + if (str_eq(name, EL_STR("str_strip_suffix"))) { + return 2; + } + if (str_eq(name, EL_STR("str_strip_chars"))) { + return 2; + } + if (str_eq(name, EL_STR("str_lstrip"))) { + return 1; + } + if (str_eq(name, EL_STR("str_rstrip"))) { + return 1; + } + if (str_eq(name, EL_STR("is_letter"))) { + return 1; + } + if (str_eq(name, EL_STR("is_digit"))) { + return 1; + } + if (str_eq(name, EL_STR("is_alphanumeric"))) { + return 1; + } + if (str_eq(name, EL_STR("is_whitespace"))) { + return 1; + } + if (str_eq(name, EL_STR("is_punctuation"))) { + return 1; + } + if (str_eq(name, EL_STR("is_uppercase"))) { + return 1; + } + if (str_eq(name, EL_STR("is_lowercase"))) { + return 1; + } + if (str_eq(name, EL_STR("str_split_lines"))) { + return 1; + } + if (str_eq(name, EL_STR("str_split_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("str_split_n"))) { + return 3; + } + if (str_eq(name, EL_STR("str_join"))) { + return 2; + } + if (str_eq(name, EL_STR("el_html_sanitize"))) { + return 2; + } if (str_eq(name, EL_STR("el_abs"))) { return 1; } @@ -3009,12 +4339,6 @@ el_val_t builtin_arity(el_val_t name) { if (str_eq(name, EL_STR("http_post_form_auth"))) { return 3; } - if (str_eq(name, EL_STR("http_get_to_file"))) { - return 3; - } - if (str_eq(name, EL_STR("http_post_to_file"))) { - return 4; - } if (str_eq(name, EL_STR("http_serve"))) { return 2; } @@ -3027,9 +4351,6 @@ el_val_t builtin_arity(el_val_t name) { if (str_eq(name, EL_STR("fs_write"))) { return 2; } - if (str_eq(name, EL_STR("fs_write_bytes"))) { - return 3; - } if (str_eq(name, EL_STR("fs_list"))) { return 1; } @@ -3388,9 +4709,7 @@ el_val_t emit_arity_violations(void) { el_val_t add_int_name(el_val_t name) { el_val_t csv = state_get(EL_STR("__int_names")); if (str_eq(csv, EL_STR(""))) { - csv; - EL_NULL; - EL_STR(","); + csv = EL_STR(","); } el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); if (str_contains(csv, key)) { @@ -3401,8 +4720,143 @@ el_val_t add_int_name(el_val_t name) { return 0; } +el_val_t add_instant_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__instant_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__instant_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_duration_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__duration_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__duration_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_calendar_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__calendar_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__calendar_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_caltime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__caltime_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__caltime_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_rhythm_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__rhythm_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__rhythm_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_localdate_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdate_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__localdate_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_localtime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localtime_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__localtime_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_localdt_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdt_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__localdt_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_zone_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__zone_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__zone_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + el_val_t build_int_names_for_params(el_val_t params) { state_set(EL_STR("__int_names"), EL_STR(",")); + state_set(EL_STR("__instant_names"), EL_STR(",")); + state_set(EL_STR("__duration_names"), EL_STR(",")); + state_set(EL_STR("__calendar_names"), EL_STR(",")); + state_set(EL_STR("__caltime_names"), EL_STR(",")); + state_set(EL_STR("__rhythm_names"), EL_STR(",")); + state_set(EL_STR("__localdate_names"), EL_STR(",")); + state_set(EL_STR("__localtime_names"), EL_STR(",")); + state_set(EL_STR("__localdt_names"), EL_STR(",")); + state_set(EL_STR("__zone_names"), EL_STR(",")); el_val_t np = native_list_len(params); el_val_t pi = 0; while (pi < np) { @@ -3412,6 +4866,33 @@ el_val_t build_int_names_for_params(el_val_t params) { if (str_eq(ptype, EL_STR("Int"))) { add_int_name(pname); } + if (str_eq(ptype, EL_STR("Instant"))) { + add_instant_name(pname); + } + if (str_eq(ptype, EL_STR("Duration"))) { + add_duration_name(pname); + } + if (str_eq(ptype, EL_STR("Calendar"))) { + add_calendar_name(pname); + } + if (str_eq(ptype, EL_STR("CalendarTime"))) { + add_caltime_name(pname); + } + if (str_eq(ptype, EL_STR("Rhythm"))) { + add_rhythm_name(pname); + } + if (str_eq(ptype, EL_STR("LocalDate"))) { + add_localdate_name(pname); + } + if (str_eq(ptype, EL_STR("LocalTime"))) { + add_localtime_name(pname); + } + if (str_eq(ptype, EL_STR("LocalDateTime"))) { + add_localdt_name(pname); + } + if (str_eq(ptype, EL_STR("Zone"))) { + add_zone_name(pname); + } pi = (pi + 1); } return 1; @@ -3716,6 +5197,7 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { state_set(EL_STR("__program_kind"), kind); state_set(EL_STR("__cap_violations"), EL_STR("")); state_set(EL_STR("__arity_violations"), EL_STR("")); + state_set(EL_STR("__time_violations"), EL_STR("")); emit_line(EL_STR("#include ")); emit_line(EL_STR("#include ")); emit_line(EL_STR("#include \"el_runtime.h\"")); @@ -3760,25 +5242,16 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { if (has_toplevel_lets) { emit_blank(); } - /* fndef_mask[i] = 1 means stmts[i] was a FnDef and has been released. - * Subsequent passes use this mask instead of calling is_fndef() on freed - * nodes, avoiding use-after-free while still freeing each FnDef body as - * soon as cg_fn() is done with it. This is the fix for the SIGSEGV that - * occurs on large source files (>~100 KB) due to AST accumulation. */ - char* fndef_mask = calloc((size_t)n, 1); i = 0; while (i < n) { el_val_t stmt = native_list_get(stmts, i); if (is_fndef(stmt)) { - fndef_mask[i] = 1; cg_fn(stmt); - /* FnDef body is now fully emitted — release to reclaim AST memory. */ - el_release(stmt); } i = (i + 1); } - emit_line(EL_STR("int main(int argc, char** argv) {")); - emit_line(EL_STR(" el_runtime_init_args(argc, argv);")); + emit_line(EL_STR("int main(int _argc, char** _argv) {")); + emit_line(EL_STR(" el_runtime_init_args(_argc, _argv);")); if (cgi_count >= 1) { el_val_t cname = el_get_field(cgi_block, EL_STR("name")); el_val_t cdid = el_get_field(cgi_block, EL_STR("dharma_id")); @@ -3799,32 +5272,58 @@ el_val_t codegen(el_val_t stmts, el_val_t source) { el_val_t main_decl = native_list_empty(); i = 0; while (i < n) { - if (!fndef_mask[i]) { - el_val_t stmt = native_list_get(stmts, i); - kind = el_get_field(stmt, EL_STR("stmt")); - if (str_eq(kind, EL_STR("Let"))) { - el_val_t name = el_get_field(stmt, EL_STR("name")); - main_decl = native_list_append(main_decl, name); + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + main_decl = native_list_append(main_decl, name); + } + i = (i + 1); + } + el_val_t el_main_body = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t bn = native_list_len(body); + el_val_t bi = 0; + while (bi < bn) { + el_main_body = native_list_append(el_main_body, native_list_get(body, bi)); + bi = (bi + 1); + } } } i = (i + 1); } i = 0; while (i < n) { - if (!fndef_mask[i]) { - el_val_t stmt = native_list_get(stmts, i); - if (!is_top_level_decl(stmt)) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + } else { + if (is_top_level_decl(stmt)) { + } else { main_decl = cg_stmt(stmt, EL_STR(" "), main_decl); } } + el_release(stmt); i = (i + 1); } - free(fndef_mask); + el_val_t mn = native_list_len(el_main_body); + el_val_t mi = 0; + while (mi < mn) { + el_val_t mstmt = native_list_get(el_main_body, mi); + main_decl = cg_stmt(mstmt, EL_STR(" "), main_decl); + mi = (mi + 1); + } emit_line(EL_STR(" return 0;")); emit_line(EL_STR("}")); emit_blank(); emit_cap_violations(); emit_arity_violations(); + emit_time_violations(); return EL_STR(""); return 0; } @@ -3934,9 +5433,7 @@ el_val_t js_is_int_name(el_val_t name) { el_val_t js_add_int_name(el_val_t name) { el_val_t csv = state_get(EL_STR("__js_int_names")); if (str_eq(csv, EL_STR(""))) { - csv; - EL_NULL; - EL_STR(","); + csv = EL_STR(","); } el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); if (str_contains(csv, key)) { @@ -4020,6 +5517,54 @@ el_val_t js_cg_expr(el_val_t expr) { el_val_t v = el_get_field(expr, EL_STR("value")); return v; } + if (str_eq(kind, EL_STR("DurationLit"))) { + el_val_t count = el_get_field(expr, EL_STR("count")); + el_val_t unit = el_get_field(expr, EL_STR("unit")); + el_val_t mult_ns = EL_STR("1"); + if (str_eq(unit, EL_STR("nano"))) { + mult_ns = EL_STR("1"); + } + if (str_eq(unit, EL_STR("nanos"))) { + mult_ns = EL_STR("1"); + } + if (str_eq(unit, EL_STR("milli"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("millis"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("millisecond"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("milliseconds"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("second"))) { + mult_ns = EL_STR("1000000000"); + } + if (str_eq(unit, EL_STR("seconds"))) { + mult_ns = EL_STR("1000000000"); + } + if (str_eq(unit, EL_STR("minute"))) { + mult_ns = EL_STR("60000000000"); + } + if (str_eq(unit, EL_STR("minutes"))) { + mult_ns = EL_STR("60000000000"); + } + if (str_eq(unit, EL_STR("hour"))) { + mult_ns = EL_STR("3600000000000"); + } + if (str_eq(unit, EL_STR("hours"))) { + mult_ns = EL_STR("3600000000000"); + } + if (str_eq(unit, EL_STR("day"))) { + mult_ns = EL_STR("86400000000000"); + } + if (str_eq(unit, EL_STR("days"))) { + mult_ns = EL_STR("86400000000000"); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), count), EL_STR(" * ")), mult_ns), EL_STR(")")); + } if (str_eq(kind, EL_STR("Float"))) { el_val_t v = el_get_field(expr, EL_STR("value")); return v; @@ -4418,6 +5963,13 @@ el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { } return declared; } + if (str_eq(kind, EL_STR("Assign"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } if (str_eq(kind, EL_STR("Expr"))) { el_val_t val = el_get_field(stmt, EL_STR("value")); el_val_t val_kind = el_get_field(val, EL_STR("expr")); @@ -4752,7 +6304,6 @@ el_val_t codegen_js(el_val_t stmts, el_val_t source) { el_val_t compile(el_val_t source) { el_val_t tokens = lex(source); el_val_t stmts = parse(tokens); - /* Token list no longer needed after parsing — release before codegen. */ el_release(tokens); return codegen(stmts, source); return 0; @@ -4761,7 +6312,6 @@ el_val_t compile(el_val_t source) { el_val_t compile_js(el_val_t source) { el_val_t tokens = lex(source); el_val_t stmts = parse(tokens); - /* Token list no longer needed after parsing — release before codegen. */ el_release(tokens); return codegen_js(stmts, source); return 0; @@ -4805,19 +6355,94 @@ el_val_t strip_flags(el_val_t argv) { return 0; } -int main(int argc, char** argv) { - el_runtime_init_args(argc, argv); - _argv = args(); - _target = detect_target(_argv); - _positional = strip_flags(_argv); - _argc = native_list_len(_positional); - if (_argc >= 1) { - el_val_t _src_path = native_list_get(_positional, 0); - el_val_t _source = fs_read(_src_path); - el_val_t _out = compile_dispatch(_target, _source); - if (_argc >= 2) { - el_val_t _out_path = native_list_get(_positional, 1); - fs_write(_out_path, _out); +el_val_t dirname_of(el_val_t path) { + el_val_t n = str_len(path); + el_val_t i = (n - 1); + while (i >= 0) { + el_val_t c = str_slice(path, i, (i + 1)); + if (str_eq(c, EL_STR("/"))) { + return str_slice(path, 0, i); + } + i = (i - 1); + } + return EL_STR("."); + return 0; +} + +el_val_t parse_import_line(el_val_t trimmed, el_val_t dir) { + if (str_starts_with(trimmed, EL_STR("import \""))) { + el_val_t after = str_slice(trimmed, 8, str_len(trimmed)); + el_val_t q = str_index_of(after, EL_STR("\"")); + if (q > 0) { + el_val_t mod = str_slice(after, 0, q); + return el_str_concat(el_str_concat(dir, EL_STR("/")), mod); + } + } + if (str_starts_with(trimmed, EL_STR("from "))) { + el_val_t after = str_slice(trimmed, 5, str_len(trimmed)); + el_val_t sp = str_index_of(after, EL_STR(" ")); + if (sp > 0) { + el_val_t mod_raw = str_slice(after, 0, sp); + el_val_t mod = str_trim(mod_raw); + if (!str_eq(mod, EL_STR(""))) { + return el_str_concat(el_str_concat(el_str_concat(dir, EL_STR("/")), mod), EL_STR(".el")); + } + } + } + return EL_STR(""); + return 0; +} + +el_val_t resolve_imports(el_val_t src_path) { + el_val_t seen_key = el_str_concat(EL_STR("__elc_imp__:"), src_path); + el_val_t already = state_get(seen_key); + if (!str_eq(already, EL_STR(""))) { + return EL_STR(""); + } + state_set(seen_key, EL_STR("1")); + el_val_t source = fs_read(src_path); + el_val_t dir = dirname_of(src_path); + el_val_t lines = str_split(source, EL_STR("\n")); + el_val_t n = native_list_len(lines); + el_val_t prefix = EL_STR(""); + el_val_t body = EL_STR(""); + el_val_t i = 0; + while (i < n) { + el_val_t line = native_list_get(lines, i); + el_val_t trimmed = str_trim(line); + el_val_t imp_path = parse_import_line(trimmed, dir); + if (!str_eq(imp_path, EL_STR(""))) { + prefix = el_str_concat(prefix, resolve_imports(imp_path)); + } else { + body = el_str_concat(el_str_concat(body, line), EL_STR("\n")); + } + i = (i + 1); + } + return el_str_concat(prefix, body); + return 0; +} + +int main(int _argc, char** _argv) { + el_runtime_init_args(_argc, _argv); + el_val_t argv = args(); + el_val_t tgt = detect_target(argv); + el_val_t positional = strip_flags(argv); + el_val_t argc = native_list_len(positional); + if (argc < 1) { + println(EL_STR("el-compiler: usage: elc [--target=c|js] []")); + exit(1); + } + el_val_t src_path = native_list_get(positional, 0); + el_val_t source = resolve_imports(src_path); + el_val_t out = compile_dispatch(tgt, source); + if (argc >= 2) { + el_val_t out_path = native_list_get(positional, 1); + el_val_t ok = fs_write(out_path, out); + if (ok) { + exit(0); + } else { + println(EL_STR("el-compiler: failed to write output")); + exit(1); } } return 0; diff --git a/el-compiler/runtime/el_runtime.c b/el-compiler/runtime/el_runtime.c index 2a3beaf..c54ddc6 100644 --- a/el-compiler/runtime/el_runtime.c +++ b/el-compiler/runtime/el_runtime.c @@ -1469,22 +1469,25 @@ void http_serve(el_val_t port, el_val_t handler) { } int p = (int)port; if (p <= 0 || p > 65535) { fprintf(stderr, "http_serve: invalid port %d\n", p); return; } - int sock = socket(AF_INET, SOCK_STREAM, 0); + /* Dual-stack: AF_INET6 with IPV6_V6ONLY=0 accepts both IPv4 and IPv6. + * This makes `localhost` work in browsers that resolve it to ::1 first. */ + int sock = socket(AF_INET6, SOCK_STREAM, 0); if (sock < 0) { perror("socket"); return; } - int yes = 1; + int yes = 1; int no = 0; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); - struct sockaddr_in addr; + setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &no, sizeof(no)); + struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(INADDR_ANY); - addr.sin_port = htons((uint16_t)p); + addr.sin6_family = AF_INET6; + addr.sin6_addr = in6addr_any; + addr.sin6_port = htons((uint16_t)p); if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); close(sock); return; } if (listen(sock, 64) < 0) { perror("listen"); close(sock); return; } - fprintf(stderr, "[http] listening on 0.0.0.0:%d\n", p); + fprintf(stderr, "[http] listening on [::]:%d (dual-stack)\n", p); while (1) { - struct sockaddr_in cli; + struct sockaddr_in6 cli; socklen_t clen = sizeof(cli); int cfd = accept(sock, (struct sockaddr*)&cli, &clen); if (cfd < 0) { @@ -1715,22 +1718,24 @@ void http_serve_v2(el_val_t port, el_val_t handler) { fprintf(stderr, "http_serve_v2: invalid port %d\n", p); return; } - int sock = socket(AF_INET, SOCK_STREAM, 0); + /* Dual-stack: same as http_serve - AF_INET6 + IPV6_V6ONLY=0. */ + int sock = socket(AF_INET6, SOCK_STREAM, 0); if (sock < 0) { perror("socket"); return; } - int yes = 1; + int yes = 1; int no = 0; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); - struct sockaddr_in addr; + setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &no, sizeof(no)); + struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(INADDR_ANY); - addr.sin_port = htons((uint16_t)p); + addr.sin6_family = AF_INET6; + addr.sin6_addr = in6addr_any; + addr.sin6_port = htons((uint16_t)p); if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); close(sock); return; } if (listen(sock, 64) < 0) { perror("listen"); close(sock); return; } - fprintf(stderr, "[http v2] listening on 0.0.0.0:%d\n", p); + fprintf(stderr, "[http v2] listening on [::]:%d (dual-stack)\n", p); while (1) { - struct sockaddr_in cli; + struct sockaddr_in6 cli; socklen_t clen = sizeof(cli); int cfd = accept(sock, (struct sockaddr*)&cli, &clen); if (cfd < 0) { diff --git a/elc-combined.el b/elc-combined.el index 5eb8c09..3216641 100644 --- a/elc-combined.el +++ b/elc-combined.el @@ -195,6 +195,208 @@ fn scan_ident(chars: [String], start: Int, total: Int) -> Map { { "text": text, "pos": i } } +// ── Code-bearing string detection + comment strip ──────────────────────────── +// Inline JS/CSS literals embedded in El source (e.g. blobs +// or stylesheet payloads inside string literals) carry their own line and +// block comments. Those comments leak into the served HTML and reveal build +// notes the visitor should never see. We strip them at the lexer so every +// downstream consumer (codegen-c, codegen-js, parser) gets the cleaned form. +// +// looks_like_code — heuristic gate so we only strip strings that actually +// embed JS or CSS. Plain prose, hex blobs, JSON, etc. pass through verbatim. + +fn substr_at(chars: [String], start: Int, total: Int, needle: String) -> Bool { + let nchars: [String] = native_string_chars(needle) + let nlen: Int = native_list_len(nchars) + if start + nlen > total { return false } + let i = 0 + let matched = true + while i < nlen { + let a: String = native_list_get(chars, start + i) + let b: String = native_list_get(nchars, i) + if a == b { let i = i + 1 } else { let matched = false; let i = nlen } + } + matched +} + +fn str_has(s: String, needle: String) -> Bool { + let chars: [String] = native_string_chars(s) + let total: Int = native_list_len(chars) + let i = 0 + let found = false + while i < total { + if substr_at(chars, i, total, needle) { + let found = true + let i = total + } else { + let i = i + 1 + } + } + found +} + +fn looks_like_code(s: String) -> Bool { + if str_has(s, " String { + let chars: [String] = native_string_chars(s) + let total: Int = native_list_len(chars) + let out = "" + let i = 0 + let in_squote = false + let in_dquote = false + let in_btick = false + let prev = "" + while i < total { + let ch: String = native_list_get(chars, i) + let in_js_string = false + if in_squote { let in_js_string = true } + if in_dquote { let in_js_string = true } + if in_btick { let in_js_string = true } + + if in_js_string { + // Backslash escape: consume next char verbatim regardless of which. + if ch == "\\" { + let out = out + ch + let next_i = i + 1 + if next_i < total { + let nc: String = native_list_get(chars, next_i) + let out = out + nc + let prev = nc + let i = next_i + 1 + } else { + let prev = ch + let i = next_i + } + } else { + if in_squote { + if ch == "'" { let in_squote = false } + } else { + if in_dquote { + if ch == "\"" { let in_dquote = false } + } else { + if in_btick { + if ch == "`" { let in_btick = false } + } + } + } + let out = out + ch + let prev = ch + let i = i + 1 + } + } else { + // Not in a JS string. Check for comment openers. + let next_i = i + 1 + let next_ch = "" + if next_i < total { + let next_ch: String = native_list_get(chars, next_i) + } + + if ch == "/" { + if next_ch == "/" { + // URL guard: prev char ':' means this is "://", not a comment. + if prev == ":" { + let out = out + ch + let prev = ch + let i = i + 1 + } else { + // Skip until newline (newline itself is preserved so + // surrounding line counts/structure stay sane). + let i = i + 2 + let scanning = true + while scanning { + if i >= total { + let scanning = false + } else { + let lc: String = native_list_get(chars, i) + if lc == "\n" { + let scanning = false + } else { + let i = i + 1 + } + } + } + let prev = "" + } + } else { + if next_ch == "*" { + // Skip until matching "*/". + let i = i + 2 + let scanning2 = true + while scanning2 { + if i >= total { + let scanning2 = false + } else { + let bc: String = native_list_get(chars, i) + if bc == "*" { + let after = i + 1 + if after < total { + let nc2: String = native_list_get(chars, after) + if nc2 == "/" { + let i = after + 1 + let scanning2 = false + } else { + let i = i + 1 + } + } else { + let i = i + 1 + } + } else { + let i = i + 1 + } + } + } + let prev = "" + } else { + let out = out + ch + let prev = ch + let i = i + 1 + } + } + } else { + // Open a JS string? + if ch == "'" { + let in_squote = true + let out = out + ch + let prev = ch + let i = i + 1 + } else { + if ch == "\"" { + let in_dquote = true + let out = out + ch + let prev = ch + let i = i + 1 + } else { + if ch == "`" { + let in_btick = true + let out = out + ch + let prev = ch + let i = i + 1 + } else { + let out = out + ch + let prev = ch + let i = i + 1 + } + } + } + } + } + } + out +} + // scan_string — scan a quoted string literal, handling \" escapes. // Starts AFTER the opening quote. Returns { "text": content, "pos": i_after_close } fn scan_string(chars: [String], start: Int, total: Int) -> Map { @@ -305,7 +507,15 @@ fn lex(source: String) -> [Map] { let result = scan_string(chars, i + 1, total) let str_text: String = result["text"] let new_pos: Int = result["pos"] - let tokens = native_list_append(tokens, make_tok("Str", str_text)) + // Compile-time scrub: strings that embed JS or CSS get + // their // line comments and /* block comments stripped + // before the token reaches the parser. Plain prose passes + // through untouched. + let clean_text = str_text + if looks_like_code(str_text) { + let clean_text = strip_code_comments(str_text) + } + let tokens = native_list_append(tokens, make_tok("Str", clean_text)) let i = new_pos } else { // Number literal @@ -1010,10 +1220,55 @@ fn parse_block(tokens: [Map], pos: Int) -> Map { // ── Postfix expressions (calls, field access, index) ───────────────────────── +// is_duration_unit — recognise the postfix unit suffix on a numeric literal. +// Used by parse_postfix to detect `30.seconds`-shape time literals before +// falling back to the generic `obj.field` field-access lowering. Singular +// and plural forms map to the same nanosecond multiplier; codegen does the +// arithmetic at compile time. +fn is_duration_unit(name: String) -> Bool { + if name == "nanos" { return true } + if name == "nano" { return true } + if name == "millis" { return true } + if name == "milli" { return true } + if name == "millisecond" { return true } + if name == "milliseconds" { return true } + if name == "second" { return true } + if name == "seconds" { return true } + if name == "minute" { return true } + if name == "minutes" { return true } + if name == "hour" { return true } + if name == "hours" { return true } + if name == "day" { return true } + if name == "days" { return true } + false +} + fn parse_postfix(tokens: [Map], pos: Int) -> Map { let r = parse_primary(tokens, pos) let node = r["node"] let p = r["pos"] + + // Postfix duration literal: `.` where is one of + // nanos | millis | seconds | minutes | hours | days (each with an + // optional plural). We recognise this before the generic Dot-as-field + // path so `30.seconds` lowers to a DurationLit AST node carrying the + // count and the unit, not a field access on an Int. + let primary_kind: String = node["expr"] + if primary_kind == "Int" { + let dot_kind = tok_kind(tokens, p) + if dot_kind == "Dot" { + let unit_kind = tok_kind(tokens, p + 1) + if unit_kind == "Ident" { + let unit_name = tok_value(tokens, p + 1) + if is_duration_unit(unit_name) { + let count_str: String = node["value"] + let node = { "expr": "DurationLit", "count": count_str, "unit": unit_name } + let p = p + 2 + } + } + } + } + let running = true while running { let k = tok_kind(tokens, p) @@ -1482,6 +1737,24 @@ fn parse_stmt(tokens: [Map], pos: Int) -> Map { }, p) } + // Bare reassignment: `name = expr`. Handled BEFORE the expression + // fallback so we don't drop the assign on the floor and emit three + // orphan expressions (the original silent-miscompile bug). El's `let` + // already permits redeclaration, so this only applies when the parser + // sees an Ident followed directly by `=`. `==` is a separate kind + // (EqEq) so there's no ambiguity. + if k == "Ident" { + let k2 = tok_kind(tokens, pos + 1) + if k2 == "Eq" { + let name = tok_value(tokens, pos) + let p = pos + 2 + let r = parse_expr(tokens, p) + let val = r["node"] + let p = r["pos"] + return make_result({ "stmt": "Assign", "name": name, "value": val }, p) + } + } + // bare expression or if/match statement let r = parse_expr(tokens, pos) let val = r["node"] @@ -1620,6 +1893,29 @@ fn binop_to_c(op: String) -> String { // // cg_expr returns a C expression string (not a statement). +// duration_unit_nanos — multiplier from a postfix-literal unit name to +// nanoseconds. Singular and plural forms collapse to the same multiplier; +// the parser already restricted `unit` to the set is_duration_unit accepts. +// Returns the multiplier as a decimal string suitable for splicing into +// the generated C as a literal int64 expression. +fn duration_unit_nanos(unit: String) -> String { + if str_eq(unit, "nano") { return "1LL" } + if str_eq(unit, "nanos") { return "1LL" } + if str_eq(unit, "milli") { return "1000000LL" } + if str_eq(unit, "millis") { return "1000000LL" } + if str_eq(unit, "millisecond") { return "1000000LL" } + if str_eq(unit, "milliseconds") { return "1000000LL" } + if str_eq(unit, "second") { return "1000000000LL" } + if str_eq(unit, "seconds") { return "1000000000LL" } + if str_eq(unit, "minute") { return "60000000000LL" } + if str_eq(unit, "minutes") { return "60000000000LL" } + if str_eq(unit, "hour") { return "3600000000000LL" } + if str_eq(unit, "hours") { return "3600000000000LL" } + if str_eq(unit, "day") { return "86400000000000LL" } + if str_eq(unit, "days") { return "86400000000000LL" } + "1LL" +} + fn cg_expr(expr: Map) -> String { let kind: String = expr["expr"] @@ -1628,6 +1924,17 @@ fn cg_expr(expr: Map) -> String { return v } + // DurationLit — postfix-literal time value (e.g. 30.seconds, 1.hour). + // Lowered to a literal int64 nanosecond count, wrapped in the runtime + // entry point so the intent is explicit at the C level. The arithmetic + // is fully constant-folded by any optimising C compiler. + if kind == "DurationLit" { + let count: String = expr["count"] + let unit: String = expr["unit"] + let mult: String = duration_unit_nanos(unit) + return "el_duration_from_nanos((el_val_t)(" + count + "LL * " + mult + "))" + } + if kind == "Float" { // Wrap Float literals in el_from_float() so the bit pattern is // preserved through the el_val_t (int64) slot. Without this, @@ -1678,6 +1985,198 @@ fn cg_expr(expr: Map) -> String { let left_kind: String = left["expr"] let right_kind: String = right["expr"] + // ── Temporal-type dispatch (Instant + Duration first-class) ──────── + // Run BEFORE the int / string / generic paths so typed temporal + // operands route through the runtime wrappers and invalid combos + // become #error directives rather than silently falling through to + // raw int arithmetic. The wrappers are no-op casts at the C level + // but make the intent explicit and centralise future changes (e.g. + // saturating arithmetic, overflow guards). + let left_is_inst: Bool = is_instant_expr(left) + let right_is_inst: Bool = is_instant_expr(right) + let left_is_dur: Bool = is_duration_expr(left) + let right_is_dur: Bool = is_duration_expr(right) + + // Phase 1.5 LocalDate / LocalTime / CalendarTime dispatch. These + // route through their typed runtime wrappers (el_local_date_add_dur, + // el_local_time_add_dur, el_local_date_lt, el_local_date_eq) and + // forbid mismatched ops at codegen time. Cross-calendar arithmetic + // (CalendarTime + CalendarTime, CalendarTime - CalendarTime under + // mismatched calendars) is structurally meaningless: a CalendarTime + // already projects an Instant under a Calendar, so subtraction + // between two of them only makes sense in instant-space (use + // cal_to_instant first). + let left_is_ld: Bool = is_localdate_expr(left) + let right_is_ld: Bool = is_localdate_expr(right) + let left_is_lt: Bool = is_localtime_expr(left) + let right_is_lt: Bool = is_localtime_expr(right) + let left_is_ct: Bool = is_caltime_expr(left) + let right_is_ct: Bool = is_caltime_expr(right) + if left_is_ld { + if op == "Plus" { + if right_is_dur { + return "el_local_date_add_dur(" + left_c + ", " + right_c + ")" + } + } + if op == "Lt" { + if right_is_ld { return "el_local_date_lt(" + left_c + ", " + right_c + ")" } + } + if op == "EqEq" { + if right_is_ld { return "el_local_date_eq(" + left_c + ", " + right_c + ")" } + } + } + if left_is_lt { + if op == "Plus" { + if right_is_dur { + return "el_local_time_add_dur(" + left_c + ", " + right_c + ")" + } + } + } + if left_is_ct { + if op == "Plus" { + if right_is_ct { + time_record_violation("caltime_plus_caltime", "CalendarTime + CalendarTime is not allowed (use cal_to_instant + Duration)") + return "0 /* TIME_TYPE_ERROR: CalendarTime + CalendarTime */" + } + } + } + + let any_temporal: Bool = false + if left_is_inst { let any_temporal = true } + if right_is_inst { let any_temporal = true } + if left_is_dur { let any_temporal = true } + if right_is_dur { let any_temporal = true } + if any_temporal { + if op == "Plus" { + if left_is_inst { + if right_is_dur { + return "el_instant_add_dur(" + left_c + ", " + right_c + ")" + } + if right_is_inst { + time_record_violation("instant_plus_instant", "Instant + Instant is not allowed") + return "0 /* TIME_TYPE_ERROR: Instant + Instant */" + } + } + if left_is_dur { + if right_is_inst { + return "el_instant_add_dur(" + right_c + ", " + left_c + ")" + } + if right_is_dur { + return "el_duration_add(" + left_c + ", " + right_c + ")" + } + if is_int_expr(right) { + time_record_violation("duration_plus_int", "Duration + Int is not allowed (use duration_seconds(n) or N.seconds)") + return "0 /* TIME_TYPE_ERROR: Duration + Int */" + } + } + if right_is_dur { + if is_int_expr(left) { + time_record_violation("duration_plus_int", "Int + Duration is not allowed") + return "0 /* TIME_TYPE_ERROR: Int + Duration */" + } + } + } + if op == "Minus" { + if left_is_inst { + if right_is_dur { + return "el_instant_sub_dur(" + left_c + ", " + right_c + ")" + } + if right_is_inst { + return "el_instant_diff(" + left_c + ", " + right_c + ")" + } + } + if left_is_dur { + if right_is_dur { + return "el_duration_sub(" + left_c + ", " + right_c + ")" + } + if is_int_expr(right) { + time_record_violation("duration_minus_int", "Duration - Int is not allowed") + return "0 /* TIME_TYPE_ERROR: Duration - Int */" + } + } + } + if op == "Star" { + if left_is_dur { + if is_int_expr(right) { + return "el_duration_scale(" + left_c + ", " + right_c + ")" + } + } + if right_is_dur { + if is_int_expr(left) { + return "el_duration_scale(" + right_c + ", " + left_c + ")" + } + } + } + if op == "Slash" { + if left_is_dur { + if is_int_expr(right) { + return "el_duration_div(" + left_c + ", " + right_c + ")" + } + } + } + // Comparisons. Cross-type comparisons are forbidden. + if op == "Lt" { + if left_is_inst { + if right_is_inst { return "el_instant_lt(" + left_c + ", " + right_c + ")" } + if right_is_dur { + time_record_violation("instant_cmp_duration", "Instant < Duration is not allowed") + return "0 /* TIME_TYPE_ERROR: Instant < Duration */" + } + } + if left_is_dur { + if right_is_dur { return "el_duration_lt(" + left_c + ", " + right_c + ")" } + if right_is_inst { + time_record_violation("duration_cmp_instant", "Duration < Instant is not allowed") + return "0 /* TIME_TYPE_ERROR: Duration < Instant */" + } + } + } + if op == "LtEq" { + if left_is_inst { + if right_is_inst { return "el_instant_le(" + left_c + ", " + right_c + ")" } + } + if left_is_dur { + if right_is_dur { return "el_duration_le(" + left_c + ", " + right_c + ")" } + } + } + if op == "Gt" { + if left_is_inst { + if right_is_inst { return "el_instant_gt(" + left_c + ", " + right_c + ")" } + } + if left_is_dur { + if right_is_dur { return "el_duration_gt(" + left_c + ", " + right_c + ")" } + } + } + if op == "GtEq" { + if left_is_inst { + if right_is_inst { return "el_instant_ge(" + left_c + ", " + right_c + ")" } + } + if left_is_dur { + if right_is_dur { return "el_duration_ge(" + left_c + ", " + right_c + ")" } + } + } + if op == "EqEq" { + if left_is_inst { + if right_is_inst { return "el_instant_eq(" + left_c + ", " + right_c + ")" } + } + if left_is_dur { + if right_is_dur { return "el_duration_eq(" + left_c + ", " + right_c + ")" } + } + } + if op == "NotEq" { + if left_is_inst { + if right_is_inst { return "el_instant_ne(" + left_c + ", " + right_c + ")" } + } + if left_is_dur { + if right_is_dur { return "el_duration_ne(" + left_c + ", " + right_c + ")" } + } + } + // Fall through — let the existing path handle anything we + // didn't explicitly cover (typically string-concat with a + // typed temporal value, e.g. for debug prints, which works + // because both share the int64 slot). + } + if op == "Plus" { // If either side is a string literal, always concat if left_kind == "Str" { @@ -1886,6 +2385,21 @@ fn cg_expr(expr: Map) -> String { // handler)`). User-defined fns and variadic builtins pass // through (builtin_arity returns -1). arity_check_call(fn_name, arity) + // sleep(Duration) — Phase 1 of the typed-time work. When the + // single arg is provably a Duration we lower to el_sleep_duration + // so the runtime sees nanos directly. Existing sleep() callers + // that pass an Int still emit `sleep()`, which falls through + // to the no-such-symbol path — those call sites must migrate to + // a typed Duration. Acceptable: the spec marks them out for an + // audit pass during Phase 1. + if str_eq(fn_name, "sleep") { + if arity == 1 { + let only_arg = native_list_get(args, 0) + if is_duration_expr(only_arg) { + return "el_sleep_duration(" + args_c + ")" + } + } + } return fn_name + "(" + args_c + ")" } @@ -2116,9 +2630,20 @@ fn cg_if_expr_arm(stmts: [Map], result_var: String) -> String { let out = out + "(void)(" + val_c + "); " } } else { - // Non-trivial stmt kinds (While/For) shouldn't appear in - // expression-position arm bodies; emit nothing rather - // than malformed C. + if str_eq(sk, "Assign") { + // Real reassignment in an expression-position arm — + // emit the store; the arm's "value" stays whatever + // result_var was last set to, which is the El + // semantics (assignment is a statement, not a value). + let aname: String = s["name"] + let aval = s["value"] + let aval_c: String = cg_expr(aval) + let out = out + aname + " = " + aval_c + "; " + } else { + // Non-trivial stmt kinds (While/For) shouldn't appear in + // expression-position arm bodies; emit nothing rather + // than malformed C. + } } } } @@ -2182,6 +2707,65 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin if str_eq(ltype, "Int") { add_int_name(name) } + // Temporal type annotations register the name with the matching + // typed-set so BinOp / comparison codegen routes through the + // typed wrappers and forbids cross-type ops. + if str_eq(ltype, "Instant") { + add_instant_name(name) + } + if str_eq(ltype, "Duration") { + add_duration_name(name) + } + if str_eq(ltype, "Calendar") { + add_calendar_name(name) + } + if str_eq(ltype, "CalendarTime") { + add_caltime_name(name) + } + if str_eq(ltype, "Rhythm") { + add_rhythm_name(name) + } + if str_eq(ltype, "LocalDate") { + add_localdate_name(name) + } + if str_eq(ltype, "LocalTime") { + add_localtime_name(name) + } + if str_eq(ltype, "LocalDateTime") { + add_localdt_name(name) + } + if str_eq(ltype, "Zone") { + add_zone_name(name) + } + // Inference from RHS — duration literals and known-typed calls + // propagate even when the let is unannotated. + if is_instant_expr(val) { + add_instant_name(name) + } + if is_duration_expr(val) { + add_duration_name(name) + } + if is_calendar_expr(val) { + add_calendar_name(name) + } + if is_caltime_expr(val) { + add_caltime_name(name) + } + if is_rhythm_expr(val) { + add_rhythm_name(name) + } + if is_localdate_expr(val) { + add_localdate_name(name) + } + if is_localtime_expr(val) { + add_localtime_name(name) + } + if is_localdt_expr(val) { + add_localdt_name(name) + } + if is_zone_expr(val) { + add_zone_name(name) + } let vk: String = val["expr"] if str_eq(vk, "Int") { add_int_name(name) @@ -2207,6 +2791,20 @@ fn cg_stmt(stmt: Map, indent: String, declared: [String]) -> [Strin return declared } + // Bare reassignment: `name = expr`. Always emits a plain C assignment + // (no `el_val_t` prefix) — by construction the parser only produces + // Assign for an existing identifier. If the name happens NOT to be in + // `declared` for the current C scope (it was let-bound by an enclosing + // block) the emit still resolves at C level because the variable lives + // in the surrounding scope. + if kind == "Assign" { + let name: String = stmt["name"] + let val = stmt["value"] + let val_c: String = cg_expr(val) + emit_line(indent + name + " = " + val_c + ";") + return declared + } + if kind == "Expr" { let val = stmt["value"] let val_kind: String = val["expr"] @@ -2424,6 +3022,23 @@ fn is_int_name(name: String) -> Bool { return str_contains(csv, "," + name + ",") } +// Same shape as is_int_name, for Instant- and Duration-typed bindings. +// Used by the BinOp/comparison codegen to dispatch arithmetic through the +// typed runtime wrappers (el_instant_add_dur, el_duration_lt, …) and to +// surface mismatches (Instant + Instant, Duration + Int) as #error +// directives at the top of the generated C. +fn is_instant_name(name: String) -> Bool { + let csv: String = state_get("__instant_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_duration_name(name: String) -> Bool { + let csv: String = state_get("__duration_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + // Known runtime builtins that return Int. Used to dispatch arithmetic vs // string-concat on `+` when one side is a Call. New builtins must be added // here when they return Int and may participate in arithmetic. @@ -2461,9 +3076,346 @@ fn is_int_call(call_expr: Map) -> Bool { if str_eq(name, "el_max") { return true } if str_eq(name, "el_min") { return true } if str_eq(name, "float_to_int") { return true } + if str_eq(name, "unix_timestamp") { return true } + if str_eq(name, "instant_to_unix_seconds") { return true } + if str_eq(name, "instant_to_unix_millis") { return true } + if str_eq(name, "duration_to_seconds") { return true } + if str_eq(name, "duration_to_millis") { return true } + if str_eq(name, "duration_to_nanos") { return true } return false } +// Builtins that return an Instant. Used by is_instant_expr and the BinOp +// dispatch — `now() + 5.seconds` types as Instant only because we can see +// that now() is an Instant-returning Call. +fn is_instant_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "now") { return true } + if str_eq(name, "el_now_instant") { return true } + if str_eq(name, "unix_seconds") { return true } + if str_eq(name, "unix_millis") { return true } + if str_eq(name, "instant_from_iso8601") { return true } + if str_eq(name, "el_instant_add_dur") { return true } + if str_eq(name, "el_instant_sub_dur") { return true } + return false +} + +// Builtins that return a Duration. Same role as is_instant_call. +fn is_duration_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "el_duration_from_nanos") { return true } + if str_eq(name, "duration_seconds") { return true } + if str_eq(name, "duration_millis") { return true } + if str_eq(name, "duration_nanos") { return true } + if str_eq(name, "el_instant_diff") { return true } + if str_eq(name, "el_duration_add") { return true } + if str_eq(name, "el_duration_sub") { return true } + if str_eq(name, "el_duration_scale") { return true } + if str_eq(name, "el_duration_div") { return true } + if str_eq(name, "ttl_cache_age") { return true } + return false +} + +// Phase 1.5 — Calendar / CalendarTime / Rhythm / LocalDate / LocalTime / +// LocalDateTime / Zone are first-class boxed types. Each has its own name +// set in process state, populated from typed `let` bindings and parameter +// annotations. The BinOp dispatcher consults these to forbid mismatched +// arithmetic (e.g. CalendarTime + CalendarTime, LocalDate < CalendarTime). +fn is_calendar_name(name: String) -> Bool { + let csv: String = state_get("__calendar_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_caltime_name(name: String) -> Bool { + let csv: String = state_get("__caltime_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_rhythm_name(name: String) -> Bool { + let csv: String = state_get("__rhythm_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_localdate_name(name: String) -> Bool { + let csv: String = state_get("__localdate_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_localtime_name(name: String) -> Bool { + let csv: String = state_get("__localtime_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_localdt_name(name: String) -> Bool { + let csv: String = state_get("__localdt_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +fn is_zone_name(name: String) -> Bool { + let csv: String = state_get("__zone_names") + if str_eq(csv, "") { return false } + return str_contains(csv, "," + name + ",") +} + +// Calendar-returning builtins. earth_calendar / mars_calendar / cycle_calendar +// / no_cycle_calendar / relative_calendar all box a calendar struct. +fn is_calendar_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "earth_calendar") { return true } + if str_eq(name, "earth_calendar_default") { return true } + if str_eq(name, "mars_calendar") { return true } + if str_eq(name, "cycle_calendar") { return true } + if str_eq(name, "no_cycle_calendar") { return true } + if str_eq(name, "relative_calendar") { return true } + return false +} + +// CalendarTime-returning builtins. +fn is_caltime_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "now_in") { return true } + if str_eq(name, "in_calendar") { return true } + if str_eq(name, "cal_in") { return true } + if str_eq(name, "zoned") { return true } + return false +} + +// Rhythm-returning builtins. +fn is_rhythm_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "rhythm_cycle_start") { return true } + if str_eq(name, "rhythm_cycle_phase") { return true } + if str_eq(name, "rhythm_duration") { return true } + if str_eq(name, "rhythm_session_start") { return true } + if str_eq(name, "rhythm_event") { return true } + if str_eq(name, "rhythm_and") { return true } + if str_eq(name, "rhythm_or") { return true } + if str_eq(name, "rhythm_weekday") { return true } + if str_eq(name, "rhythm_weekly_at") { return true } + return false +} + +// LocalDate-returning builtins. +fn is_localdate_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "local_date") { return true } + if str_eq(name, "el_local_date_add_dur") { return true } + return false +} + +fn is_localtime_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "local_time") { return true } + if str_eq(name, "el_local_time_add_dur") { return true } + return false +} + +fn is_localdt_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "local_datetime") { return true } + return false +} + +fn is_zone_call(call_expr: Map) -> Bool { + let func = call_expr["func"] + let fk: String = func["expr"] + if !str_eq(fk, "Ident") { return false } + let name: String = func["name"] + if str_eq(name, "zone") { return true } + if str_eq(name, "zone_utc") { return true } + if str_eq(name, "zone_local") { return true } + if str_eq(name, "zone_offset") { return true } + return false +} + +fn is_calendar_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_calendar_name(expr["name"]) } + if str_eq(k, "Call") { return is_calendar_call(expr) } + return false +} + +fn is_caltime_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_caltime_name(expr["name"]) } + if str_eq(k, "Call") { return is_caltime_call(expr) } + return false +} + +fn is_rhythm_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_rhythm_name(expr["name"]) } + if str_eq(k, "Call") { return is_rhythm_call(expr) } + return false +} + +fn is_localdate_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_localdate_name(expr["name"]) } + if str_eq(k, "Call") { return is_localdate_call(expr) } + return false +} + +fn is_localtime_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_localtime_name(expr["name"]) } + if str_eq(k, "Call") { return is_localtime_call(expr) } + return false +} + +fn is_localdt_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_localdt_name(expr["name"]) } + if str_eq(k, "Call") { return is_localdt_call(expr) } + return false +} + +fn is_zone_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { return is_zone_name(expr["name"]) } + if str_eq(k, "Call") { return is_zone_call(expr) } + return false +} + +// Recursive type predicates for Instant / Duration. Mirror is_int_expr. +// is_instant_expr / is_duration_expr return true only when the expression +// is provably of that type at codegen time. Anything ambiguous returns +// false — the BinOp dispatcher then leaves the expression on the +// untyped-int path, which is the safest fallback because at the runtime +// level all three types share the int64 slot. +fn is_instant_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "Ident") { + let name: String = expr["name"] + return is_instant_name(name) + } + if str_eq(k, "Call") { + return is_instant_call(expr) + } + if str_eq(k, "BinOp") { + let op: String = expr["op"] + if str_eq(op, "Plus") { + // Instant + Duration → Instant + // Duration + Instant → Instant + if is_instant_expr(expr["left"]) { + if is_duration_expr(expr["right"]) { return true } + } + if is_duration_expr(expr["left"]) { + if is_instant_expr(expr["right"]) { return true } + } + return false + } + if str_eq(op, "Minus") { + // Instant - Duration → Instant + if is_instant_expr(expr["left"]) { + if is_duration_expr(expr["right"]) { return true } + } + return false + } + return false + } + return false +} + +fn is_duration_expr(expr: Map) -> Bool { + let k: String = expr["expr"] + if str_eq(k, "DurationLit") { return true } + if str_eq(k, "Ident") { + let name: String = expr["name"] + return is_duration_name(name) + } + if str_eq(k, "Call") { + return is_duration_call(expr) + } + if str_eq(k, "Neg") { + return is_duration_expr(expr["inner"]) + } + if str_eq(k, "BinOp") { + let op: String = expr["op"] + if str_eq(op, "Plus") { + // Duration + Duration → Duration + if is_duration_expr(expr["left"]) { + if is_duration_expr(expr["right"]) { return true } + } + return false + } + if str_eq(op, "Minus") { + // Duration - Duration → Duration + // Instant - Instant → Duration (caught here, not in is_instant_expr) + if is_duration_expr(expr["left"]) { + if is_duration_expr(expr["right"]) { return true } + } + if is_instant_expr(expr["left"]) { + if is_instant_expr(expr["right"]) { return true } + } + return false + } + if str_eq(op, "Star") { + // Duration * Int → Duration + // Int * Duration → Duration + if is_duration_expr(expr["left"]) { + if is_int_expr(expr["right"]) { return true } + } + if is_int_expr(expr["left"]) { + if is_duration_expr(expr["right"]) { return true } + } + return false + } + if str_eq(op, "Slash") { + // Duration / Int → Duration + if is_duration_expr(expr["left"]) { + if is_int_expr(expr["right"]) { return true } + } + return false + } + return false + } + return false +} + +// Record a temporal-type violation. Surfaced as `#error` directives at the +// top of the generated C, identical machinery to cap_record_violation. +// kinds: "instant_plus_instant", "duration_plus_int", etc. +fn time_record_violation(kind: String, detail: String) -> Bool { + let csv: String = state_get("__time_violations") + if str_eq(csv, "") { let csv = "," } + let entry: String = kind + ":" + detail + let key: String = "," + entry + "," + if str_contains(csv, key) { return true } + state_set("__time_violations", csv + entry + ",") + return true +} + // Recursive type-propagation: is `expr` known-Int at codegen time? // This unifies the BinOp(+) dispatch so chained arithmetic over Int // operands stays arithmetic. Without recursion, a wrapping `+` between @@ -2643,6 +3595,30 @@ fn emit_cap_violations() -> Void { } } +// Surface temporal-type violations as #error directives. The cg_expr BinOp +// dispatcher records each violation (Instant + Instant, Duration + Int, …) +// as a CSV entry "kind:detail" via time_record_violation. Each entry maps +// to a single #error so downstream cc fails the build with a clear El- +// source-level message before the bogus C even links. +fn emit_time_violations() -> Void { + let csv: String = state_get("__time_violations") + if str_eq(csv, "") { return } + if str_eq(csv, ",") { return } + let n: Int = str_len(csv) + let i: Int = 1 + while i < n { + let next_comma: Int = str_index_of(str_slice(csv, i, n), ",") + if next_comma < 0 { return } + let entry: String = str_slice(csv, i, i + next_comma) + let colon: Int = str_index_of(entry, ":") + if colon > 0 { + let detail: String = str_slice(entry, colon + 1, str_len(entry)) + emit_line("#error \"temporal type error: " + detail + "\"") + } + let i = i + next_comma + 1 + } +} + // ── Builtin arity table ─────────────────────────────────────────────────────── // // El programs sometimes call runtime builtins with the wrong number of @@ -2714,6 +3690,8 @@ fn builtin_arity(name: String) -> Int { if str_eq(name, "str_split_chars") { return 1 } if str_eq(name, "str_split_n") { return 3 } if str_eq(name, "str_join") { return 2 } + // HTML sanitizer + if str_eq(name, "el_html_sanitize") { return 2 } // Math if str_eq(name, "el_abs") { return 1 } if str_eq(name, "el_max") { return 2 } @@ -2918,8 +3896,98 @@ fn add_int_name(name: String) -> Bool { return true } +fn add_instant_name(name: String) -> Bool { + let csv: String = state_get("__instant_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__instant_names", csv + name + ",") + return true +} + +fn add_duration_name(name: String) -> Bool { + let csv: String = state_get("__duration_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__duration_names", csv + name + ",") + return true +} + +fn add_calendar_name(name: String) -> Bool { + let csv: String = state_get("__calendar_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__calendar_names", csv + name + ",") + return true +} + +fn add_caltime_name(name: String) -> Bool { + let csv: String = state_get("__caltime_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__caltime_names", csv + name + ",") + return true +} + +fn add_rhythm_name(name: String) -> Bool { + let csv: String = state_get("__rhythm_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__rhythm_names", csv + name + ",") + return true +} + +fn add_localdate_name(name: String) -> Bool { + let csv: String = state_get("__localdate_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__localdate_names", csv + name + ",") + return true +} + +fn add_localtime_name(name: String) -> Bool { + let csv: String = state_get("__localtime_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__localtime_names", csv + name + ",") + return true +} + +fn add_localdt_name(name: String) -> Bool { + let csv: String = state_get("__localdt_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__localdt_names", csv + name + ",") + return true +} + +fn add_zone_name(name: String) -> Bool { + let csv: String = state_get("__zone_names") + if str_eq(csv, "") { csv = "," } + let key: String = "," + name + "," + if str_contains(csv, key) { return true } + state_set("__zone_names", csv + name + ",") + return true +} + fn build_int_names_for_params(params: [Map]) -> Bool { state_set("__int_names", ",") + state_set("__instant_names", ",") + state_set("__duration_names", ",") + state_set("__calendar_names", ",") + state_set("__caltime_names", ",") + state_set("__rhythm_names", ",") + state_set("__localdate_names", ",") + state_set("__localtime_names", ",") + state_set("__localdt_names", ",") + state_set("__zone_names", ",") let np: Int = native_list_len(params) let pi = 0 while pi < np { @@ -2929,6 +3997,33 @@ fn build_int_names_for_params(params: [Map]) -> Bool { if str_eq(ptype, "Int") { add_int_name(pname) } + if str_eq(ptype, "Instant") { + add_instant_name(pname) + } + if str_eq(ptype, "Duration") { + add_duration_name(pname) + } + if str_eq(ptype, "Calendar") { + add_calendar_name(pname) + } + if str_eq(ptype, "CalendarTime") { + add_caltime_name(pname) + } + if str_eq(ptype, "Rhythm") { + add_rhythm_name(pname) + } + if str_eq(ptype, "LocalDate") { + add_localdate_name(pname) + } + if str_eq(ptype, "LocalTime") { + add_localtime_name(pname) + } + if str_eq(ptype, "LocalDateTime") { + add_localdt_name(pname) + } + if str_eq(ptype, "Zone") { + add_zone_name(pname) + } let pi = pi + 1 } return true @@ -3195,6 +4290,8 @@ fn codegen(stmts: [Map], source: String) -> String { state_set("__cap_violations", "") // Clear arity-violation accumulator from any prior compile. state_set("__arity_violations", "") + // Clear temporal-type-violation accumulator from any prior compile. + state_set("__time_violations", "") // Preamble emit_line("#include ") @@ -3264,9 +4361,11 @@ fn codegen(stmts: [Map], source: String) -> String { let i = i + 1 } - // main() - emit_line("int main(int argc, char** argv) {") - emit_line(" el_runtime_init_args(argc, argv);") + // main(). Use _argc/_argv so El programs are free to declare their own + // local `argv` / `argc` (compiler.el itself does this) without colliding + // with the C-side parameters when fn main()'s body is folded in below. + emit_line("int main(int _argc, char** _argv) {") + emit_line(" el_runtime_init_args(_argc, _argv);") if cgi_count >= 1 { let cname: String = cgi_block["name"] let cdid: String = cgi_block["dharma_id"] @@ -3298,11 +4397,34 @@ fn codegen(stmts: [Map], source: String) -> String { } let i = i + 1 } + // First pass: capture the body of `fn main()` if the source declared + // one. We've already skipped emitting it as a regular el_val_t + // function (see cg_fn early return); fold its body into C's main + // alongside top-level statements so the program actually runs. + let el_main_body = native_list_empty() let i = 0 while i < n { let stmt = native_list_get(stmts, i) if is_fndef(stmt) { - // skip + let fn_name: String = stmt["name"] + if str_eq(fn_name, "main") { + let body = stmt["body"] + let bn: Int = native_list_len(body) + let bi: Int = 0 + while bi < bn { + let el_main_body = native_list_append(el_main_body, native_list_get(body, bi)) + let bi = bi + 1 + } + } + } + let i = i + 1 + } + + let i = 0 + while i < n { + let stmt = native_list_get(stmts, i) + if is_fndef(stmt) { + // skip - fn defs already emitted above; fn main body folded later } else { if is_top_level_decl(stmt) { // skip @@ -3317,6 +4439,16 @@ fn codegen(stmts: [Map], source: String) -> String { el_release(stmt) let i = i + 1 } + + // Fold fn main()'s body in here, after top-level statements. + let mn: Int = native_list_len(el_main_body) + let mi: Int = 0 + while mi < mn { + let mstmt = native_list_get(el_main_body, mi) + let main_decl = cg_stmt(mstmt, " ", main_decl) + let mi = mi + 1 + } + emit_line(" return 0;") emit_line("}") emit_blank() @@ -3330,6 +4462,8 @@ fn codegen(stmts: [Map], source: String) -> String { // so a misuse of a known builtin (wrong arg count) fails the build // with a clear message naming the builtin and its expected arity. emit_arity_violations() + // Temporal-type violations (Instant + Instant, Duration + Int, …). + emit_time_violations() // Return empty string — output was streamed via println "" @@ -3464,15 +4598,6 @@ fn js_is_int_call(call_expr: Map) -> Bool { if str_eq(name, "str_index_of") { return true } if str_eq(name, "str_to_int") { return true } if str_eq(name, "str_char_code") { return true } - if str_eq(name, "str_count") { return true } - if str_eq(name, "str_count_chars") { return true } - if str_eq(name, "str_count_bytes") { return true } - if str_eq(name, "str_count_lines") { return true } - if str_eq(name, "str_count_words") { return true } - if str_eq(name, "str_count_letters") { return true } - if str_eq(name, "str_count_digits") { return true } - if str_eq(name, "str_last_index_of") { return true } - if str_eq(name, "str_find_chars") { return true } if str_eq(name, "native_list_len") { return true } if str_eq(name, "el_list_len") { return true } if str_eq(name, "len") { return true } @@ -3504,6 +4629,33 @@ fn js_cg_expr(expr: Map) -> String { return v } + // DurationLit — postfix-literal time value (e.g. 30.seconds, 1.hour). + // The JS backend lowers to a literal integer nanosecond count. The C + // backend uses the typed wrapper el_duration_from_nanos to make intent + // explicit at the runtime boundary; JS has no equivalent shim yet, so + // we lower directly. A future Phase 2 JS time runtime can route through + // a wrapper once added. + if kind == "DurationLit" { + let count: String = expr["count"] + let unit: String = expr["unit"] + let mult_ns = "1" + if str_eq(unit, "nano") { let mult_ns = "1" } + if str_eq(unit, "nanos") { let mult_ns = "1" } + if str_eq(unit, "milli") { let mult_ns = "1000000" } + if str_eq(unit, "millis") { let mult_ns = "1000000" } + if str_eq(unit, "millisecond") { let mult_ns = "1000000" } + if str_eq(unit, "milliseconds") { let mult_ns = "1000000" } + if str_eq(unit, "second") { let mult_ns = "1000000000" } + if str_eq(unit, "seconds") { let mult_ns = "1000000000" } + if str_eq(unit, "minute") { let mult_ns = "60000000000" } + if str_eq(unit, "minutes") { let mult_ns = "60000000000" } + if str_eq(unit, "hour") { let mult_ns = "3600000000000" } + if str_eq(unit, "hours") { let mult_ns = "3600000000000" } + if str_eq(unit, "day") { let mult_ns = "86400000000000" } + if str_eq(unit, "days") { let mult_ns = "86400000000000" } + return "(" + count + " * " + mult_ns + ")" + } + if kind == "Float" { // JS numbers are already doubles — no bit-cast trick needed. let v: String = expr["value"] @@ -3922,6 +5074,16 @@ fn js_cg_stmt(stmt: Map, indent: String, declared: [String]) -> [St return declared } + // Bare reassignment: `name = expr`. Mirrors the C backend — emits a + // plain JS assignment without `let` so we don't shadow an outer binding. + if kind == "Assign" { + let name: String = stmt["name"] + let val = stmt["value"] + let val_c: String = js_cg_expr(val) + js_emit_line(indent + name + " = " + val_c + ";") + return declared + } + if kind == "Expr" { let val = stmt["value"] let val_kind: String = val["expr"] @@ -4326,6 +5488,91 @@ fn strip_flags(argv: [String]) -> [String] { return out } +// ── Import resolution ──────────────────────────────────────────────────────── +// +// elc supports two forms of import: +// import "path/to/file.el" — quoted relative path +// from module import { Name } — bare module name resolves to module.el +// in the entry source's directory +// +// Codegen treats Import statements as no-ops (declarations only), so to +// actually link bodies across files we textually concatenate every imported +// source ahead of the entry source before lex/parse. resolve_imports does a +// depth-first traversal with deduplication so any module that gets pulled in +// transitively is included exactly once. + +fn dirname_of(path: String) -> String { + let n: Int = str_len(path) + let i: Int = n - 1 + while i >= 0 { + let c: String = str_slice(path, i, i + 1) + if str_eq(c, "/") { + return str_slice(path, 0, i) + } + let i = i - 1 + } + return "." +} + +// Extract the resolved file path from a single trimmed source line. Returns +// "" if the line is not an import. +fn parse_import_line(trimmed: String, dir: String) -> String { + if str_starts_with(trimmed, "import \"") { + let after: String = str_slice(trimmed, 8, str_len(trimmed)) + let q: Int = str_index_of(after, "\"") + if q > 0 { + let mod: String = str_slice(after, 0, q) + return dir + "/" + mod + } + } + if str_starts_with(trimmed, "from ") { + let after: String = str_slice(trimmed, 5, str_len(trimmed)) + // module name is the first whitespace-delimited token + let sp: Int = str_index_of(after, " ") + if sp > 0 { + let mod_raw: String = str_slice(after, 0, sp) + let mod: String = str_trim(mod_raw) + if !str_eq(mod, "") { + return dir + "/" + mod + ".el" + } + } + } + return "" +} + +// Recursively resolve imports starting from src_path. Returns the combined +// source text with every imported module's body inlined ahead of the entry +// source, deduplicated by absolute path. Uses state_set to track which paths +// have already been pulled in for this run. +fn resolve_imports(src_path: String) -> String { + let seen_key: String = "__elc_imp__:" + src_path + let already: String = state_get(seen_key) + if !str_eq(already, "") { return "" } + state_set(seen_key, "1") + + let source: String = fs_read(src_path) + let dir: String = dirname_of(src_path) + let lines: [String] = str_split(source, "\n") + let n: Int = native_list_len(lines) + + // First pass: pull in every import body ahead of this file's body. + let prefix: String = "" + let body: String = "" + let i: Int = 0 + while i < n { + let line: String = native_list_get(lines, i) + let trimmed: String = str_trim(line) + let imp_path: String = parse_import_line(trimmed, dir) + if !str_eq(imp_path, "") { + let prefix = prefix + resolve_imports(imp_path) + } else { + let body = body + line + "\n" + } + let i = i + 1 + } + return prefix + body +} + // main — CLI entry point. // // elc # emit C to stdout @@ -4334,7 +5581,10 @@ fn strip_flags(argv: [String]) -> [String] { // elc --target=js # write JS to file fn main() -> Void { let argv: [String] = args() - let target: String = detect_target(argv) + // Use `tgt` not `target`: `target` is a reserved keyword in the lexer + // (Section 1.5 of the language spec). detect_target itself is fine + // because the function-name position has no token-class restriction. + let tgt: String = detect_target(argv) let positional: [String] = strip_flags(argv) let argc: Int = native_list_len(positional) if argc < 1 { @@ -4342,8 +5592,8 @@ fn main() -> Void { exit(1) } let src_path: String = native_list_get(positional, 0) - let source: String = fs_read(src_path) - let out: String = compile_dispatch(target, source) + let source: String = resolve_imports(src_path) + let out: String = compile_dispatch(tgt, source) if argc >= 2 { let out_path: String = native_list_get(positional, 1) let ok: Bool = fs_write(out_path, out)