From 677c31f50d5e677ff6c3b569b14b89db4b4465d6 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 1 Apr 2021 23:01:43 -0500 Subject: [PATCH] refactoring the standup code to be more modular --- bin/onyx | Bin 344432 -> 344432 bytes bin/test | 6 ++-- core/builtin.onyx | 14 +++++---- core/env.onyx | 4 +-- core/intrinsics/onyx.onyx | 3 ++ core/intrinsics/wasm.onyx | 2 -- core/io/file.onyx | 4 +-- core/js/webgl.onyx | 4 +-- core/map.onyx | 1 - core/{ => runtime}/build_opts.onyx | 2 +- core/runtime/common.onyx | 34 ++++++++++++++++++++++ core/runtime/js.onyx | 20 +++++++++++++ core/{sys => runtime}/wasi.onyx | 44 +++++------------------------ core/std.onyx | 18 ++++++------ core/stdio.onyx | 34 ++++++++++++---------- core/string.onyx | 28 ++++++++++-------- core/string/reader.onyx | 2 -- core/sys/js.onyx | 43 ---------------------------- include/bh.h | 2 +- progs/poly_solidify.onyx | 4 +-- src/onyxbuiltins.c | 2 +- 21 files changed, 132 insertions(+), 139 deletions(-) create mode 100644 core/intrinsics/onyx.onyx rename core/{ => runtime}/build_opts.onyx (97%) create mode 100644 core/runtime/common.onyx create mode 100644 core/runtime/js.onyx rename core/{sys => runtime}/wasi.onyx (61%) delete mode 100644 core/sys/js.onyx diff --git a/bin/onyx b/bin/onyx index 2cd9c3488783a3389a5f4c0c9f89f50d4aff95d0..a733f4b9ce3a68cabb61d2577f856de8f62869ea 100755 GIT binary patch delta 60013 zcmZ@>cU%-n)86U@T@?fr1Ox>Y6;wn{F|UH6EQ&d&6XTh4PJkG0T`^p%ZO-w`qOM}X zbn2PV^Ngp0aX3tvGvCv*t0(h&KmVBCsi#AAb#--hbq~In?D1l<#|{JK3!9|Z$$w$o zjY9J2?x`<2U2-&qkXxk~2lf4X%FQgteRrQyyMB7{!hG*glk>Mnm5I4(s=Xw6slI1k z+L25J20K!9KGZdYjC>WI;rxp%#%ptasgNf(6%GVCw6G`j=jOs8-rvyp zvo@v;_O1-&mkNg2b-UQ>-l#$U;pFM*{ls2& zp9ZbTLp?pCuh`Mk8uX2wo~EIHveU0?=q5fFZQZk@iUuvrj{@yr=kvV=jpf;%p42%x zpI2E%J$PtQPw#d1tf$ZC9ylxSR@5{4k{!LSL7&*^=^FaGESnlC8u}uBw5TUJCf_JJ zT2DXo7R8TH$7DCZ!HjP3gc6?K5AWN`rT&$hi)_9V=odShu0iwh44_3G*vjgzM_uz6$6dI~uP+$MQ=+r`pk# z8gwqFGM?Vc>}aY6-NZwI?y;lk8uTdd2K1sG)m_Wo-v@jy&<}RhUxPaFqd-eMvPm*r zgI49)K%?zwtOo7OOO*BW9&AVBHRxpC0_c1@x>AE~*1F}+sjN%mJ`CE{|EmZ@|Bu0YZ?$ZFm#$kThXoeABI+}+#5=c3#kl=Igh zXZcYesX)RtNCwXa@*>FK9jig!*;^UH-O72o#cNP!-l80gq+%20N)77I6Uuq=_;To* z2C2$-0@(p1U4z8%3?S)1bT@PNt2=iq@5x=uqhA_i438-9>78KbB3y%7_)wtp>}ae8 zUB*`dU2jL@HRyJJ3Fy9W{nMbwI92fUK5Iu)HRu%{3iP%eP1m50c()3k(a-Iu?pE%; zzPHm|HFSqeyV7dtn51aS!;Xe)&;Xtdw4xo2)u7dRiC|CfC_5UjLEG{cKzrKJl^S#` zPXId0j;3nRg?uN_wRSXJgYMuNKvV3f?w{Ne_>;R;^z^=INBuSE10DhNwH*!DpbmT} zP}hHLvWnH9zI+wXKsy?*L96gfKqKtvN)6hWQ;4T`8#|h+L3{F0pu_EGx&}?)-GDBz zqq^I<`@5OX1$x|$`fJdC_)(y*?P$0Lb>`VXJ?-vMtOhN`OH}go4zZ*08ngy)0W{i< zuGF9%cmmKKb~IIk4(B_8Cfd<-4VuI=fG)D5x;wf1yNeUetrpP$tQM;r9o?P`pMI~l^sphpaXa)&{1|YU4u^M z-GI)rqq@7f`@4|O1-jaf`fJcF{3y_Ub~Idrp5WO))9h%h2K|SZsO;(e$d1Nq&=sr3N+d1fYeU+N6=HL4Em7pk?f6x(2PpGl15#qq_9m{cXVAs(5-gv!nhRv;&U- z+QW{9YtVswDA3V%G**Kq@Kr!9b~Ijt&gYk^V4#IjmFCL9&S3b9T2%Y3d@%)QtfvH6>i4w489-F>O2$AR@}Qz2zn5W zXD>b$&;EQ9oayN=}p>IJk znd=*rp**H#cHxUPfF(I@Y^>Auc6pv^N-{3v&0CH3-BTHK%Y*=heIR5`g(x4cB!%0D&My6uSM(_BNM-n`J{Rea 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࡯>SYLYQb!Z(syEwU=ukk8jblqu zt0)`gbSuBan&VQMN18ZPl!fVc<+B~(=ksAl88epv*SNvryncf zlA=KxO6|K5__nL#{}V4f|aBW)+!~Ko(ygDvMR@_qHal6 z%DE8U6vtlDL-)ud2A5=OJ-gwCP+}k4xUo2@mxXN2_7LStu~3&#fEZKur`m#E^ee^6 zdUlG;EriV7Qna{%Qi@gRw*ps+aOdmVe9VYfFt3(Bx^aCpm?VP9~d9aI*If`iYptR1`lMeHrh z%9mL31eOmhTkAQZ<1AlfBw5iF1edvsAL&7r|KFpO;~yJd_Jk%6od49dtr z%$^P6Q6QTL*RW?0>+5txUEb8O+bwPcvGwFE;>)oS&4(OQg*X(6Qrj2x*rs3yyoX+n zHa85ETX+m^a}d63uyQO~ZLzW}3^j(GM^?GM1c}Jn-wDU=@mv#a$-b z!6IlQ@M1e_Px1&9O)9V`zck!50CEXQjAe{#jQNA|aOHPva8o2#U@fq0I|f68dWpbb z))CQz#9&t4<PKFz=GM@RnIl)|BM&cI9`*?!OX=p)8@C5~gW13^!1f%NlCdQf0QN_!En! zlh!dmv8Vdt)!vgXWwqodDeUa=W>esVPBy~Jz&#u!MgPL*8BK76ROJ5_vLwZCcNhRWp}(JPXLz^2TPWVMUea{8JRY3c73k<=i^R6}u@QV(6khi0b4 zlZ0D}&m+-=mBP6Jt5EH)0xIuY(rukZf?MWl_*XoHB&*bb8!4dL-!G;|d7)n+Vn_q5 zeP|AK6mN_=(46b{=4xUVeQWN5xZ40+?-HLHusUwZ((Os|X#T)1g3Y2)Ll%zUk)f|4-<5r4z3`P364jfsc7|fO*9Y|}E<{tdw^GPmOoGq0i+_19JK7exV5UbZf!x(?V;5mh2G2Wj1{qRwr(A zA&mh$0fqP>9A(ks9Wi!4;Qh6DmpAy@SX$c9%b9iM_RIUz7Z^|H%h%DBr?#&Aenss{ zrN60^PAO``lO^8XhFfg-m>cNor;p-(8~Bnw;-|K39!~5}wPh_>`c+Z19s5e@VrhHk zZNR<|s^@r49BR+J3XR;2_Wnk2ytm0^5WcVR=qq}*hn{tjnf(!1Wt|n(MjllO2^GAoR6m zKbDj$`%E#eBP)f&qU9Y~55zH9CoG$3qDv>%iY8chc48y-*eaIo%EH)-Kg7>nnP0xy z*^m~3`DMkluB=7AF#GFyk=~WntDcf3zk871iNCHU zn1`oC?;h+O)aK`&%-3a@^d^!#DqldyEnx$MxhFOPwZyKTteasGoCXjV3!h%>0PVG2 z>%|7>4JD?i)RLlcU$z^e@qTa%V#KO`*mqVH)_yPv{vxX%3n;kf4=GGTX0$vxOcTZW zGfzXM$!g(HQM*5zjnkNO{aH!&^^oR=UuliE!jfLI+d) z@c@5w#O=ZGur{7X6TcZVuuJG!eUClngEwb#_nRwF*4q2ya_^#xiv02 z9({zJpp4HW&OHQPQ7^G?2&?ImvRfUG12Qpt_zD`z0t|Ig3T=jq;GygeVv$b6;1D3J zF$|08bMf;q6#rX{8OExFt$h6j+WHugNaf9Kso>9WArG-hQl@=F{!nfK!J)N0l#$2; zkui)FF5Vs)z~Rna=xMmElUwoI_T5hbQD`_CyCR~8GvDHmU#VHcf5=)Jzts@4<6@CG z95$f4I4~UQF;JurXFUvkcd9+;CmN4{VMq`IMqpI`5VJ>MIpQL91Pc#{dHE&hmCIm! z_+xM0xEL4JY<22JtHtMvfRUIumqp`|ER;4{CytaJT8Nl6ik)Pa_KP;7*>cRP*Q41| z@1+=xlnJ(xsSopk!R?E`8=zFNZW_aW&jTJ>$H8-2Ceq@VAA34aWXEA`YAo`{qiSza zJD!a_jOT?im2IN>;P_DQs#<-(^;604>FtJfXXXRrli(s?@cxS8sP(lR8|S6U)fNP z*{5X&+jY;vFQsLDtoVrEer2V7+Ne;2O182wvh3LrzsL-?#N}V%O+<^&zp|q4SC`6R zkg>xn_$7k_nOu}J!|AIpI+$7IeDSBGdcRZPSeap`{uRf~EDFcG1!l0)-UGH_jEblm z*swM0)iKIJqRbP~Gng+nlD%gzW7WQYpbE>t>Y0^b^<`b}PkzZs2~uZ;@yTMzKsFfo z7r%N(nBDWJcCC=OF@uHru0~eeMR9C|mSi2ccH@vI^B_!)B19Pr8;#{*ITCMyj|WXX zE|`)c-oSF=V+#aQaU*?CXHjW3^AZhbGB@v|Ba!EaZ!H`nWuYX;-eSm1*npbCGLwxk z^omtS3_H*y=I8osIu=@-XvLWQp>oP}YtTlO^7{uQ zxaKla4CHKsw`nbE`(&%_$WpbohpSK8jH zFGcNOEt%)CEze7QT8R$+BJfp94=zS3HA%Sx!kG<_D)Y*Mfws103$`vQdYg1 z`paN!YYM)M)nM0`iVMqF9Q$j96%%?Gd4Iy6 z=}5T_TLRIqSfp~c5ezDN>&+D`FI6jmN%f-*$!w6j?JUfgT=+2A_B!FUiVb6zmx`II zSOecqnBtb!0S+?WjXT{j_aT%XXvI*c^m>yTElAM zI?nzztStNdhq$)}?$9t%U@Z&s|8 z@G;YfQqavAUDOvqmvG zKI_>uR-!S~HCJcH<`zbI>#>b&HDOQH>vy)L+O30{>@%S;KaAS}E$$+X#Ykb=%p%xh zE-af_Gxl!R|aV0HGiC8+Lht5_7)w-2e0?cCxB3`xBurCl+DO z4}Jy-EEc7#tT)aUXINPb4YFRdviuGu3P5vnjbZcL8iDiZgRE4AQ=4tAI@w!Q1-}c# zTxB!ma4Z!q4l~Nb8teERn%G`+S>KFs((*1%5=p z5NOGgQfL+)vq>3*=>{V`T?OX_thCM7IN(Yv8#KTUrP-jq)**LTwqu+nQ6svQPjabx ze=T19PA zs`dkp?czh$2Y#~8BQ`3oQ-Y?pLpO8h*5XfYU@%K-sfDpIQ(Uyvh})okh}X2x41Zlr zxo@Mo$}zCbnx7#~M3DR+GY?Ozw#-erRa+%u9>YZR5mO(tA)fEzH1%$HjyxH{NkOoO zTgxeI4bgM!g-nE#3w|1p)j(|rmsbvpoGipL3R{~#L5R!PZ(Qz*vNprA_k=5j4gT`^ zUvkc2F1PIn6~8MFO_IV=8mlU9t`C(eE{;59o9Rz$|7YyHfp%MKyu)D(?$SAY#2%)M zwd_ZhpOKICr_VTbVlN(AE9TW7#Fx?5ENA`lJapVT!(HFol`2@X1N4RSlF8~=L4Ub0 zH2r#AJ?Z9A%BQQ7gTLx_TCtTY#8c7tPXCuLthJa}G60{HppC9^PBk z7rP$}^kk}3BIo&uNL(6RifAE^v%a4vNpI5F*IK2Geui^g@rT&FjkDR+)mLRPW-q%tCc7h7y)l2UYXVrp5p!^Ch9{sp7r)BMbpGD%>aKq?Y>X zBBkZhZZBnsYn8u%!wp*S-e!PvwbW-)hU2x=ol=Iqv{b(|P@8F~ z<#F#vsiCF%F2i5kQ%Y&cg|>t0EYc;1?{Yrp);I_Jp#ddBOEp{q^{kfan*!<{Ep^r{ zP*-TF6_$c()>3`9o&|ZhmRxu@s9nUIKHxA)3y#?cFjPx*{R>ndEp?h4B1bK?=0Bi5 z$A>OIc)@9zFXbrT&{BilFfn0^``&?_#a~T>NeT;tR|q@10g1Bc@n_Y4ZSnx6;Y0V; zdvutltz`8nfJ3xYPic%hYN@y707q)6OZR|UQ5-?_o?cpT&@zBbWcAhe!s%{{ev$>O zM7er5OU{BJTB=^^V@ECZrj%u*mik6o60m^kgT1t%vz$&$OEpVB@QI-Q;OOdS4M)qR zP*Sy22Pu@_wbY=ipw81$`>q8QdplGg+(!$JJ^-+#mbyU>eQmK*a#ThOu0I3NRZDf+ z1?tC78t#2@D?xdnr4E%A2v_(AfTMj{F!d0?)mrL0$1?(nCvqJ`dEK4;oILq_8rzRNt#xK>kZhUMQ6t zHg}M;xms|yv;lLq)M#m4$7`vklc4s}QX9?%wV9TxlS^m~E!8)86Ue2sYoci z{rX0{7^-&AGR_GYnR5y%tQ7!k(k0{vxG3PD{NZSNxt@YE$Vm zG!-jQeQjbE{yMQ7cs%pV|av}5AQXS+h&ab6TmDc@rwx+9Da(%xeTte~~p6PBN) z{~g}}T%D!QN2MNG(aJ;H9w}jy+DiN1(aOWr&$jRLl`Jcpqrc!N|BBRnXkVVons%II zhhALLP))K!H?>q9##1?=r6z+@xnM8QdsJPh1&@DK-Ct!V__QC=yyFY@Y(h zpt5zw0{tfP+<#HS1^!qK+$L+Ih59Il4^MwvtgkEMii`DKJrA7IIDcEBk3gOo zOCZ#B)*VaqCCJ_9Z0@{StCZ{F;Zl7weEAi&Oz+2ZE5*(w`Xbf=%k+n+!tv9&vuEPs zzYO1Q*3h%&Dt)YNR_Gn|I6mpLT7Q+5IB-l;be1goUx0LpwdFd!AIXpK*6WwiZG4ri zuMxKfgOzJu$;)17(4wU~=AH=swfGb%gE#oYLW=(;RSCzggxEjW{INrGRk8muA7U>7 zcuoZVbc6h#TCArx=yy`c@WUD|TIZ--bkfo<%U1B+!X|xW^VIPOx?94I$^=)W4C=+H zQ&R$TxKZPeS)|lG1V$`j3z1>J11LCLnup)G?1XThG8c8@Dqal!oHhQ)$wMVV)c#%n zr(yj#wbl)y;AXwQ>m>P>G%sKw>O)ndMV-xh&$xD=?l;;2OE9bYN&!#3Pg;_5kvC9JR=-zf3r5>J{C5NP{5&X%yJ^6bpw@l2kbB|No(rUu{2 zrrFR-676Y6hkOH*ZQyPRMgg?bjZ0K|*izxWMPG*fnNrvrQ641nuWVYHJ0u<>Q;*BaOzY7d z`j%u^G+gBx_YQaIeceW?Z(*ZkBJYpkKJP9>(cdn&_SvN`N6tm%y%0;74-!n}70LQ% z&VEDx6OfN}@oxQ8!k<6&->VO$C8FhCeE@C}kKPMyZYu;5R&}R{Kcsi}-SZae;j>et zOiU_`qfqwht@PBo(yD((-oi{1p+)P;xPhM#fJTQf5XH6Do>BZ#r^ss zFxZdw<2)hO+8{;mMKs&`^8x)3!u{ln2lYki|B5>wxTvc1|6kyusAxk%N}&#lifK9& zCZ^U9wH7xkEZv~6u&8je zvKqL*_nG^QBI&kUyWih^y&gXI^E}Tv=Q+DV8=kJ$tgD7*xt@82 zIAZ=S)oQira>}m!%D=uZ87?{;*l4_`=foA=1UZupaynM6oX{h3|3x>4OGY1!}54dd&lb>>iD9;>tU_=u1?MCVe|M#-koo- zq(fAf-C=z7;lwkNDnvD{L`8@iFu-Ve9xXxau!qV?sVt*X#+q zotFlEd%~vi_1z2ihIQ1hg6s`@h;KX`*&C+c&X0K;s8szl>`=FBSfrkOn+Vd>;kUzn z;XQ+cf92>Ntz!4lxudG@KKel(_Jz5fogeY*S5OEj@Cr)Y4jtgGggo*}hq$MSefwVs z)#&&7D%%vj`%YNf&{ZX27pjX(!r~jYpV{@+8FS|pT~`t|Bc$Jnr~H-=x!_5^m5%J# zXrtb*E3512Pt>vJ6@~vjY;9BTy?^mr*E2Epf)9gkunD*Ud;#=;F7N_y7U)N+-t=34 zMRG*egQe&@s#NBOiPwu~1XAsE!(ei|Qs zszA_T`e_cowg>&rhTfuMWnpEZMTb5MJEuue^*3R@=HA4EeygDL*Wx&f{!G4qK<7Q# zc=Z{A_;)HUrJO;q8efz;rouCjT_U?b@>_L9>otG-koS~R>X~MpCq_F@TJJ($nZLq1nc-6=sg*UZe$fb)Tn#nM<&sb z=DOnU@Igo;kv5>#pG#ng$mK{nqWy0MbCBN(Xq6uS^fonCMeAS7fwSn((R=F~{#QKZ%z=1+6jb)W$S!pCW!_oz_5F6W_Wru?ubqC|C-dKK@btR;di+OI*blxhJsAw|jdhb#a|1S439>24} zEtK1bXk09H^i5#dAybh}=;}*heZBV#PW21@5nfQg!Fug^&sKRN1yc}>uSlT`_6Hz+ z+tYKfzH~W@zP?`_?)_CIb&S7hi~G+T4AdD(xh+U!d&d7ruqP;XA=Q`GSP?yHtWwY^ zsQ2rNJLPm<*Y+Rnd+SwPzpzId%K4oQ`lNo1iF76htSeqkbZ_e_|JVB`P6grpj~d=V z!AeBq8mUBQY!4FGv&LFMM}pD?9#@BNk^LYZf>-r$)L08i?FQsH64|q8XH)b15bxk# zHC6(mvF?6-U0q(+FIet(qW84M>sAtMP-7)hitM?}mX@-g*t^EcV86Pbjaoky3HocU z_q9&%YhNw8oYwETjAfxKJxm3q0mZ3CbRjKT-?E-9*s!ilOVCf_o}f@~(5}nZ7wy;5 zD+XOqJDgSlJlJE6?+~PMwfMo)ufU(d*RsWJVz&f z`J+itR$gUS;Jfnl3Ol9RJogM0>B{{&c&S)(Ed}Vb=zSfCmQljB4u7xpE{dFMpVBM;R`7rUsu9+t!s1|=)HVDc?RzDvTpItFAkvX5 zkvku#vDzTJ(f?EH@2jz1T5hA>56U3XonOb+ogQW*L7#tx-ulMg5B_@v>zDhT+y2L=xbLY`_A2(5OS#^gxFN1nHmHx=$oK~<`fuVc z8s1k&O!m{CBv3@-Nr{C7jT%qw7d2~RzSYp%`v@thuw_G?eXSe(d5tv>UG!JnGuE>O z%lr|fZLek0h^{1(29AGmDj3bR3>NW!Sz|4&tg*Tr<${+oap<+^vT>B#fd03FNv2#f zKlC!|+n_K$r-;2j8sli3`f98ryZM2cb@0KUE~9N4{ijv<>-y@~Uzcz3QuxqM^z?@_ z%k~qteyQNu{C=zV_BCtu{+X1Zj7eW53I`-+ne`H3|!9&!Q48|er&{Z5~{G(Bx zNp|6&^^Xaj$>)#j82>X>vYV(g`8gGBTgU#He11!JKnG4wM^gtqwfchz$Od%Lwag>r zP+vc@`DY9k3)-l){533M_+a)YA&1!4Jc!Bo9YBI*OkGChUub^fZOiYEl{KujT#ak3 zl89O>t5K~L0nX9;=y!mdz#L>NzT1%%$UWCL;liEK*c;C3Xgj#RMU5y?Uvhzs!urio7LwYZU4)H4rRh%7}`ARCZ$ zq;EjH_Rb_oB0oq}fH)AnzX-`fGLUM=DQO8$XilP$h5R~~-XDx4BYya#Iuebp8o4F9 z)|!dDhOFUt6SeLgFwT2ktu++68;Qf1%&()Rx1bVaJF>1Ni1g*R%~l}$5EGwhY}d7A zXxKlKl%lUh5-*@rNE$z9wW)Qj)v^s8L-si77(e#rJ;Bau9Cd*mICW`XYmG&2K!zaw zklx58NP5C4X#?LAPlk{Ih~6(i79kl(DfI?r2mD%sUD}TN!O>t90(z|qQEG#heee+- zYb}Gus@X3?oa{RgH*x}>pt#^;I*~1;FOrO`5KI@H)@#{-Z0bU1ksZh)#Mgz?=pENZ zGzNOW640Ts=-#eouL$qC7c*wvSP|feOQxiu<(B;+9&u9PUI{Zxaji_huD?G^|JFNwuD7rSqd?DQH z@{oEY52+sa$7Ba}Br;smElmvBW!k}Ln z{=ssSq>eNBpRQwAPFIi#Dhf)l^142{^8cE6>s1zPaL;4{L*^i9NS93H7P5q_VE+)Z zCkOi<6z?CcK$oxlok1*Gz=3Pi0uHB3I2h&Iy~$Y0F$2kbk>kl$4%2_OQSa{)o&N<6 z-TVl+)>Wa)#Ao03Q+`_i?+N37Hpg@-JoGF_LuB7`oIj8__P0poOTkIVLIT-R$gDqYNpwO01NTHbZwuIU%~bhfmAXVj$_|nYqkH8qvjzp@J+3?a(Atjd!p7F z`6;LDW3^VyUn%o_t@Yyvl=-UGs(6*m{OMl>^=PxuC zVOjes2=JF$>!EjQt@}ePD}*-gsIIlXp_5NEvaC1h=n+5T|3C?6#W2hInI7N$U9I&6 zy?(BtWj#|~YjvZyQ{Jw%Ive~7GQD_}s4t}#*AT#jqqWv&ykPqUStzIc4To#3kI2eZ zq;(7dG$gYR{9J3jK^6{D{>cw(t@G*ZL$8rt0+{xBt<}TN_;(}S_l8>5qaW2;ZAs4q zuXEW&07FUrd!)As>7Q@aT3?fq2~{*gRt~_Ykb&iXCLrVa327ch2DZIbYu$+4PVZYI zz36=f!+Recd72?^Lk1KXNFif0$iSywB1|R&E>iRa8R$p`^2op;0!k+X7c!m>GH_XK zt@Tglz!Wm@3G<)hJ3p#i%8So|(Kq(X99#Yhw4E&XelS~GdkkS*MaKIr0+nEnbN%bl+(1Z*uAOr6* z*4JPk!^FCr478%$8pe1Mlj~0m!TWS%7y*r8vYt-{VraO4Aq*v`qXdvd#Mf#JOV*W%U6jI$WeRN%j%tJ5BzCe(>4i$Dq`m^^S+hGkWO zXOfB$XV#y|_v|{x|Ln%oZD(sRnIO|8P!r6XW?8Fmw)h86zZT~d%SuH57WlHZ$MDCM zX*)V^v9aaUqI>$AADQ0jFkW@#pB9yb`>oY24C63ZdcI+N0;XMH80Fv`@H4OgJOb_k zzW^t-;)^rjqALyKq6WNX*v~L71zV;YMjALT4s7AKHc@|COTPL6I%54+mq^3#frBFr zui-wQcVJPZfwRCYa1odTt^*6fLa+?n4H_2^Am{?Cz%?ccZ~FFb6EWjDWzjUfB7EnrXcW7%X!$ zrl99a>|hpH0ak-?OlsFvylx5>f?GhNFB#YRe!MuD){>s}W3qvHSCc}`2QYTA6c|V* zz=CTi06GVgT2@CEm<$$x13=fcerq&XGK5rXK9p30Wnh)YG$tRb#yyNzPr(9kJLvOX z$E0DWkoTmWESG9f|KE$ObYA_{9Gt^4b6!tD&;=HNo)La)pXL)8n$|QhnT~*-n^;9) z-ZaJ-bk8KfHUu_{@}O%za||q`<6WGF;dSOPmh5DKqrpOO7FZ1~1zowMOxwXd+74EO zWng4HLv#ao0qrOV z&H++ybFQ6 z%ohYe$1Y|&nD;u9@FK?cEsk(q35f5bIlIwd2?2wy0|eqiU&?{Xn?wa4<8Uzrz;w`2 zMg^d&oD^R|Pd=q*U`_>-26P?qTPHwYC6g+d0FN?6pmB^z+8z9k`Yt6vFbB*!jvX}k zrn}jL`cH7Y0Q3B;{{bnCP2(DCHCP5#fLW2e=g^Y|z%;M~oCH>bb3l)S&y~O&uoNte z(QlYg{`?wi5$KBJ-6pW0m3}LPdO$zuXw8GsUf97zu&_0chX=6ZLophx2D7w78{TIE zJs0X1bO-=E4rX=XseNz!F5*=M(9xCGPe3p^pbdj~83QaE%+pse?ONWC0IR{s%h3;^AXqpQe~oGM5OiKg&%kOhX&7|g&+}+br|!ixd=(9?f`e)6 zsHiVv_$Up4IeZ}HepC1ntSfrG)UFL_NA zEC6?bPCim90rS8Lu%wE2B0%G7=D=V&2D%5c{vF>i7AUg7La+p^1grTJCiz+d;K}+z zFpH<{e$e>~AH@z~NE&fRGZeqZ+|z@3O}K#ovzl^eqp=w`onQ%QrqSRzJOcn74sJR@ zC+JRN{kz#oN0A0j1@pjpU?G?XmVg_;YH$bWjN)D$bc1DJ8h9Mk52Pc8F~(pV=s1@E zK^NE;%mOpOYA_4TiRN*yDBmY#t6@o6Pk)}Gs>;WXHR=QChQM;?2Do<#0C zGzYt+6F?_A0OnlC0|3y|nMbnMlj<%!0t2032AButY5he!vIh%5ub&-4lLj+rs27<6oqc#P06MPV(Te8%sCXpxfYo5xKmxdto)6+7 z0aysG152(Yb70;O?#+&~lQxvpjiTZ-QU!X3@dOI=4X5X$iTHZP7IbIOb1)A)1ZIuo zf%6yw29rVeI35~Jxbgd)x zpzjfS>Y>MvF(ja`vt^}?ClKznR)AU8SXKq-8qBr!1aPQjWr8JX++2X};at~)1*0r0 zWg_*D;YI_@@>te((3fplEhiC><2K7mW+x}tva%-Apn89V*_r=Z6Ov)J;QuhkW|$rM zZ#=0P=2anw)V&#In?9LM{nlJU(VGJ~fRv)s`+Cz@i5x%|s}*co=SRv^d4}1%&ml|+ zTF<6U2_c4Y0$t~T#@3~vi*Dw(qUz}QIZnf=l15TRZ%i?DOtUZzKvy>kev#Jbi|&Ft ze*DU}k*0E~qSI(h@pVkQG0j2OSagYCDY{wem62xWm=lg8g3wzVH;c$6LQ=;*P{TH@Oe zA4B(L9!_~`{3!ae9Vd=qflUv@E=<*G{V20zXvDed?NMfjQ0KYopI}VJxqMkjTw8(z zOv6Z57mYSA;OnFVf!Hm0IJHOLW{y!b7R~Nzytb?Pqs55lY?J%QP5uKqFFyfD0FbFMN}`DnOvjOpYXoT+0-=pr?Dj5#P|o_ceP*^B>% z7BZHA4yabZc@Z&wtAnnR&52BHz!Zy7L&lnILmlU-+cZYDP^-q8SMz@o4v(dt6xC^* z*(-Kw92axC7_m+#7~SF34Gm+1nm>;Er>ZsM%+5WRa%Z+hd-ZQt783dxBazxfd;0No za#yzFr0to2P1o3xLD;Qo#+my6fhT#WY`2Ey%HuI3LQbe@9xN5=5s%r9-V}T2)GSq_ zS(=I;kNYguN5djDa=h7%fB3j~yg4)^LmkvmsyagWXXikL;6{T4Thflbfk45sx$)n}sFqt!l4y|iJVo@7&+MGSbu zNP%v_rCQ}rG{^C+-(wTa<{^F+K8fj)&_#8fWZp>#nU1K>Z(XBXW7AV#-_9mq?6iD_Q zrJ*~dx=-a;%JiLTUeJ0=55IK>7Ur8PG&3++0yB0Wo{kjt{8Y0oy?%eH`9;iKm8ZvD z#ep$P?Vn~gk6B7B!SU3~C;D8DD(a_cX6FV=xpRHHiMsm^vz6+9v)L*%uAjQ;X7fq{ z*nBgSt3thVvpJogq3=1}oD#wzU^>C|R!63r6Il}jGtFKx^Tu&N(J`{=S-ze1U8>e( zvhpK6+}CP--)7F4va~BPC#!dub0MSEkxa8qt9f|!(O!WA*IjzJj0B`N$L|6ae+y@r z9cth$OzwSZvStU=GR>G$8b+%(Z(%i*sE`@v6(MewIs;|88Z(1wwMT89VRnnnn9Qw_ zZb3G^I3ru=qusF?=5rKXf2-Lo)R?ONeye$*URSr8kI~8_S*)F8^)(P0J-z7iZ1bNX zG>|mY96`;CXA+7_ZJWt*%Tnbt&57ZMvi;Up6_Q0VZ<=LZ8Jaj#Jw40pfO-F{zzH(u zc7k%N@wb!AIco3iq;`wyeusHgc+0tdYrQVoTCKgq>=Qoq&XfEXI2q_U+a7`0<|u}x zX14hqOaIs$vkm9psJUjZ(C7!%kh$hZxOTeJyemAD8_g6|KGtlhZpkqt)jM~Z&ycgZ zcbP>5lr)bn7OMU80{zdOZ~n+ZX71e_WG1PtcT+rNtKVv4A1vHnGa)qYS#^`wyoRFN zyhN~DHO-+*E;THNPNb_>a?Jh>s0 zUtkoY?gt80>iuT(Yj<&5tM6F!u|Cw@EP^FxEb7KN8GZ1gL!W!sp))@7Teksv3f~vn zznMF9QZq-YU1k?{k6KTaokrv4(r#?Jx(ZDCCl>>21fGVRK(|31zTX^9bV-Yt%Lml8 zi}bOvT0OeRyewwwu~XMgdc8#?=}VBW@$9q+lN*)Zbp0uqwxbJP;ON8*M(0yWi%I7~ zHGi?$F3H)n=Cm_-2_A9ixa$fYLj%_cy2dJOX=?vsj+aZ-k;UdE=k37LBL_Ae&VY+K zH=m=rF5&w<8T?BeI&er$UP7|xsTY^9%;KWd=Sx^-)hg-%^QzFe=IVwA%*)7n{sY8B z*B>xvv#76M3M*6Vm$ImHRQXaWC{szxP)<_wmzfj!hpXz-Wz4D->Z0Z53n3#_`EsI~ zr@miq-rAtc)iu_{rt0$9W}F&wli5%$d(fQHAaZz(l^?F|&PRJ*p1CB{$WV{x(fBNN zIL};5ymRx-yJ8mmemR*CH(g4&jB}uB^bqrXmb&&KQ^jQ7USnN|MQ{30rJovbM16=O zLY|6$*lZV*dB>@wcEMv79#hrGhwXFo!{*FTGe^}vY))W`k6(e-rSeypYeN(6S6x?{ zT|*NVsj(}~88rCLO8UH~D0UTTAqDx0Ui#IOibcp}&1!wQ%uV+^9SWNsq`q#3;W6Hh z)(SSQ%WyNT(CN!&z3HLKbaO|bhOK6ZD%35jS(8)M{?+Cs;Z+#&^llFhCP24FdghEy z)fecgYY1n%TDFD(VX)Siv%@nt^EDq;zJ|lz9e?87u|vJ|C-ZNdG#0Nl`|E?>+Ca!h z)|x~6EY&yo5`&IwQeT$9t9%!MeZ6Vj9CW+UeH75xx~1syRQ5XEU7igDuQ;{)c1)${ z&adOX2VF%yzeDKCRI#oi(s#PM$wF_5j&nj_)77>_mrzgF1)WPpJwg?O>s67CDFa>b zM60WqiY^@;4F@)@n}?38Y^u0^9j3aMHybdOqN^Ll4s;dhm_C6`Up((a=P0hRW{XaP z9-s>JoK+rSfOe^vN6k?U9B=S$d{ec2EfapmA~Qn$=~462#txpH?tcO*IzL3pYZzi(IM?e-%zZqv z@u_X=nQ(c+pd(K1-4PPncIUaDGx_g@&oS$C&Y|#|HCSa&+$oPMeO;)ax6} z%bBMkPntu+9Xv2wj(6PL` z%<#bJPQAR*Y|j!c-)J@ujXb7)*l1qasgi$6S44z*3(Se3hOy#1zB6E}0$0!T&~a7p z6qhl{>XD~dS-aKOPnj>X9yf0?dxdB6251kxz|L1;o6S~)8o!w(#ihe$^QxEu{u-;D zu8k9w2iP=>Wu=yF<`S(y9ox)RT$PG>I&c>>>}l%eDo(Q%>ab?X>Y`@=4yw;E&Ml+W z+s~MHaQaQ%VqVo?DNj(^hU%QPQ(L!C6N`C^`Js+$D@Vgg>g%nP<=)^~j^xId>Yis= z{=3whnzsB#HGa;#EPQZvtu;>dnawzie~yXeQTfm5tCgSCyU&sK?W$>EAkyqYeH?2?9xhpN>(O-Jk!(fKM)uWhI*){T{mIj5dEMIFP; zj}0|?nJ=8&C?Sm#Ec?u^EU2F>dS5;LbkP^o(`So5r=EVc=slNn*P^zZ1V&k66_$DDp(t1`wbP|P_VIJnBXOXZ3MdtwmWFI z{)N;t+}2Mp&Jl-0VyF_lO!NnYe=qop-~h3ID!jSyk%At<(JJH>v#94pp-&1H3GNrH z68!NiJI*zsc7Mawu~(SIiAC|Rno~^vN8RGrxk9;7?S0++(0lMR+gVO<#u4Gc8_HwC zZ7*&;h1*pdMkASF;WCxa6V3yQz}8wg4-x`f2jLMm^%_Z{2%aA=6CQkK)l+!zK~<{o zNU3n3@ZiCHnDF3PZKUvX#D9WtePrWlyk9$B6$|ffQ{!*KFBM)Pyod0ggr@}Zk23OeJHsb zyr>!|ytmj#3lBV%KzFO~%f)_=@GFF`6z+A4Vv{IRg}*HPO5yJcze;$y@V>&o70v}+ zVEaY*)xsNoVRtZai-xYb&AoxkK<(2;9Js6sY@LM%FE@J#=dvlVxrOWdW4&D?{92nD z*9#va+#{R|m%uhXz{!7_DDDsku0;Y{uJG%GFBLvqxDuW&{Bhye3x7s<@G;zr!bgbR zr@0>g3{m`597YQNK=_Tq%Y}~;UL}0A@E?Vb5guA;r#yJ0(p303v7ZOm?He9ZIK^SS z@Xo>~2)|VLMB%BzCkY=ce6sKn!h?5p6NFC@`z@7Wf%c85qL?EN(}d>=zghSL!lw&g zAv{y~Bf@VHzESuL;m--bRrn76-%?;VOBAn*L$>h03cpSG0pT-+9~M4K_~*iJ7yhmA zz!On)Cxp)yyXie@2QWtzk;3N+j}d;S@C4y^3GXUAcr%?Me7@NG3%^_V4Z`ibGyf)u zB1atN3eOe3T=+f0R|{Vte1q_X!V87pD}1N$`-HzO{C=BzjgLgJNE|AJFBX1W_!8mf zmv+V;5bhAZRCt{5Wx^AMFBhIH{J{Vx52>Qa6Nf><^Mzk8{2}3!gg-2NrtlTQbA_)I zzDoEi;m-(Hn(J|RLlmpU;gIk(!jB98lklc;eYaM43*qa8w-f$|@NU8%72Z?$WAMN{ z7$}MYaTqClz3_>`9~VAT_!Ghx2;U%lneZotuMxgc_>;n)lJ<>lqSz!3uL$2P{B7Y+ z3qK(I8R7pBzD4-g!nX?d3x8I4<0^X&J!kjdFxrZuP#k&*-zI#x@aKhR3V%WP9m2N@ zzeo6s!j}vGv+&izivsya`M4-{h{G1)FA3ive5df;!e16%B7B$dL&9GX{<-j1g;xvr zz9tI4D15>rzP3|TEc{&IuM3Y8{)X@l!gmXI34c@gWy0SQ-p}S<<1eBZDh_*uj}*RF z_(b7v3%^D9Uxm*WzE60r@OOkiApBk7D+8ST|4kGH;!q;|Y2o{YZx{Y|;japRPxv0; z2ZaA!`1`^S3I9O&an0i(ABrMU?siLsw=Ig_Z#E1GS+7z*G&?HC-_7XoNNms6;SJ%t zPH|Q7cXM#a0+sY0AF|9>!!*oR*&4D{zJ}>)n}*41zlL$@n1(l1)B)f7(s#QaEz5RJGM3pWz?H~oqwYh&-%8{^#w}rM>)d%^YeYlGH2)A*% z0+(9+5pI*!daatSTkfV>eoSTAI->rh4V6o6{ursMReKes95VSw0zB6~%w2Vk zDn5+KQPk)k^fR_lg#<<~`1!&M&`_h9;ZUic@H{4GjcpDd+P@OBQ)O$jW36ot&f%y~ zyEGpvXmgo<)q{%bq~2OX@mL>RKkwWh%Fvx?Eq{bLm+IyGeJMX)D3%7_NTh8o_5#{yDB4F%s#bVn@dt`vtFfodqT`^wO?26meN6U zM7Y5R1=OXIKBIJ@lx|@cHj>56vvh6F67#uYzDCSxDjzeSu5A8{pVe}zH5EL*EL7P? z%m;yx&ncP{XQ!Y{(pl2L?p29O(&oaZcGyu;^II+VKYKx(#PN3Qo1{ z3&tu>m1}UQs7i`@RHsVw!B}?_d*oKhgzFC4Q)a*Ra;l@1=D1knJliXHt+P_R%GCIy zH0+AA&53sV##S-&ME58Im~*jhmIr6XCQ_mMSg4Lsnn%Ztz6^xd6NokbWIGp0zS=jk z1M;cdFU=NFIcsfmXK5;36{A+ZFU^S99Q}$Bn=|m2kJhAUp(@8GHt!L;=olM}hcN3f zN>tQWn5!SN^}VF#SERH{rD}6l|I zrK@FtnoEjX%R=9zQnlG9=HNO!A)y&6TboylnPdgF;4&>$>$Tal)(&m8w0(?FbjMt3 zf1q;dcQYv+Jjg6kA>UH^Q!&ec8P{=rp-cZmC4I{W-~MfC!nb_3;!+2{4Xoz)Y6>~u zwVR|Hf$cDb&JC>QVVF6*OsmG(qqbEuHF!}$18e&jz?3~^wg@$f)s4r@uCZxyq8lVN zRdVjpHF3Vf?P90f?o^JL8_^4G4qmbauh!#(`YiROt~PJET>y1p%MiOyCH<4gTxzZc zrz-v@y)kCnjmW9j_*k4dHEDCs{ZfhKHZ zdGJnZ=gBtqQj8IPd7VJZe2=&P^}joMhZ? zry%&KWu15#a^wDylzv+DB`WrWJ`Knf-Zf(Wo0vJdo}lfte7n{OV*XGs4kk^a%BM6h zZWU|b1f!ijdu^|5yNof4Lxc{rOvV4Co9bojqwF*rPl!23P5X&6B(F0Diie6hfg^}L z5u$#kn{L(VXDTU?M@23P$Rl0_DqDMT9jv`vbL_g#7q6Y-#gz_bre4S|0EhcuDC1BA zVX=ApZRbDB9O@fmx9?N=c*PdXvGuaPjA>%#`a+xCx7wxSrNvw^d(<)A6z~4}_1s^p zF7vabvu?57f-9&>ybDw=Zn0?{?Y4rCI2v;8s8dm(wrR5`*Dn2&wAD_`C8}JTtCQ{0 z!5gokVs@*j8q9@qT;D9E=ZM*(Qfr9Rsj@ZXsrA~qK-O}KI3E>fuF)|wC`W6UuVpH! z7U#0@cEj!DPTP%o;|^~SzP~=$fBdBz*Z>coRv}G#JaLmc>j>XmD%A$y3+PIBAzj^c15n0 z>+vaBc{F@Bof;oPu`D$=B)nU!??u~nb0Zs%N(r|r#>`YYhI6bj%kI=Nsn^W}v;&L} zrLG*+GnD$djMU&zdo^%c4Wp=A@(~O^@&dbPno7lt*T^v1@u|f?Y?>tE5@~0eI9IFv zx~{aDwm#Ax4`Z2_ohroCP2FtkIraoL-^r$uwAm@8JBayHF>_g@%?_FA!NXB=?iX|) zohlzQYiqMfgk{Rk#JM&Ync~HI2!t@t*3T64`jh7PaB{+3uZBXkEu2ns4-~HBy3Gz~ zzQi@7mEAD&x&aOQRHp_sTyVE-{zbf=6EEg9Ua?t^*!odoep}2gwZ1|4Q?Yr^+j@OR zr?*b6?KTS3_=c4BMA-3mwynlcG4t-2HW%;?hTfi&(zl!}UEDCxk7L@))zkLcD3xpx zFOCrr;r&C6&(+Nl;mh^8AcFoFAKPy2Wh{rcu_G!`sg0HL|U+Hb24aSwC z=c0@1VjVJcH;DO0F_)>RNX%tfwqCBXjQhmwQ>mEs0*WNGEVVe2eEHOVT_$g~-GPUt z%J8JPwv(a6%jjn7x7uKA z6n(Xv1JcERhv+!~QXOqKYDS<=H4GS7q91RtMa#^Z)=pA6%GL+Z?h8bp*3fS4Q>lEV z=sl{u89geIR0dy&-zH|3(m9x&58B0gN$LG!=DI|i(^lL1;5EZ>F}qauIpl-u67A)g zWqUY#(k>3qko>oTdb3-ioA4aG-MmqSg9(o3blHqRHYhs29x4rhzll1uHx&J**qV)m(W zO0#I9&c&-x#xU4am3TQ+D&~-aqLJr@|9D|Ydo`?2c(+E0a;K4~7WW|#?rF5vHP{Ta X;Zlt*5AV^)H^QdAqJfu(cMSV~VKuoD delta 60036 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 QMK`*%D8Jw3u`Oc$AEVt@g#Z8m diff --git a/bin/test b/bin/test index 98aae825..4b485717 100755 --- a/bin/test +++ b/bin/test @@ -17,19 +17,19 @@ for test_file in $(find tests/ -name '*.onyx'); do print_check "$name" if ! ./bin/onyx -r js --use-post-mvp-features "$test_file" -o "./tests/$name.wasm" >/dev/null; then - print "\n❌ Failed to compile $name.onyx.\n" + printf "\n❌ Failed to compile $name.onyx.\n" failed=1 continue fi if ! ./bin/onyx-js "./tests/$name.wasm" > ./tmpoutput; then - print "\n❌ Failed to run $name.onyx.\n" + printf "\n❌ Failed to run $name.onyx.\n" failed=1 continue fi if ! diff ./tmpoutput "$dirname/$name" >/dev/null; then - print "\n❌ Test output did not match.\n" + printf "\n❌ Test output did not match.\n" diff ./tmpoutput "$dirname/$name" # failed=0 continue diff --git a/core/builtin.onyx b/core/builtin.onyx index ccb57325..b15509f5 100644 --- a/core/builtin.onyx +++ b/core/builtin.onyx @@ -1,5 +1,9 @@ package builtin -use package build_opts as build_opts + +// CLEANUP: Should builtin.onyx really be including other files in the compilation? +// Does that complicate things too much? +#load "core/runtime/build_opts" +use package runtime as runtime str :: #type []u8; cstr :: #type ^u8; @@ -31,7 +35,7 @@ vararg_get :: proc { ret := *cast(^T) va.data; va.data = cast(rawptr) (cast(^u8) va.data + sizeof T); va.count -= 1; - return res; + return ret; } } @@ -53,7 +57,7 @@ OnyxContext :: struct { assert_handler : (msg: str, file: str) -> void; } -#if build_opts.Runtime != build_opts.Runtime_Custom { +#if runtime.Runtime != runtime.Runtime_Custom { #private_file default_logger :: (data: rawptr, msg: str) { use package core println(msg); @@ -132,14 +136,14 @@ calloc :: (size: u32) -> rawptr do return raw_alloc(context.allocator, size); cresize :: (ptr: rawptr, size: u32) -> rawptr do return raw_resize(context.allocator, ptr, size); cfree :: (ptr: rawptr) do raw_free(context.allocator, ptr); -#if build_opts.Runtime != build_opts.Runtime_Custom { +#if runtime.Runtime != runtime.Runtime_Custom { new :: ($T: type_expr, allocator := context.allocator, initialize := true) -> ^T { res := cast(^T) raw_alloc(allocator, sizeof T); // @Robustness: This should be a '#if' when those are added in procedures because // otherwise the __initialize intrinsic is going to be generated no matter what. // This could be a problem if the type is not something that can be initialized. - use package core.intrinsics.wasm { __initialize } + use package core.intrinsics.onyx { __initialize } if initialize do __initialize(res); return res; diff --git a/core/env.onyx b/core/env.onyx index 660c158d..e1b2770c 100644 --- a/core/env.onyx +++ b/core/env.onyx @@ -1,7 +1,7 @@ package core.env -use package build_opts as build_opts -#if build_opts.Runtime != build_opts.Runtime_Wasi { +use package runtime as runtime +#if runtime.Runtime != runtime.Runtime_Wasi { #error "'core.env' is only available with the 'wasi' runtime."; } diff --git a/core/intrinsics/onyx.onyx b/core/intrinsics/onyx.onyx new file mode 100644 index 00000000..e77a2ddd --- /dev/null +++ b/core/intrinsics/onyx.onyx @@ -0,0 +1,3 @@ +package core.intrinsics.onyx + +__initialize :: (val: ^$T) -> void #intrinsic --- diff --git a/core/intrinsics/wasm.onyx b/core/intrinsics/wasm.onyx index fd7174e4..0d2d115d 100644 --- a/core/intrinsics/wasm.onyx +++ b/core/intrinsics/wasm.onyx @@ -5,8 +5,6 @@ memory_grow :: (val: i32) -> i32 #intrinsic --- memory_copy :: (dst: rawptr, src: rawptr, count: i32) -> void #intrinsic --- memory_fill :: (dst: rawptr, byte: u8, count: i32) -> void #intrinsic --- -__initialize :: (val: ^$T) -> void #intrinsic --- - clz_i32 :: (val: i32) -> i32 #intrinsic --- ctz_i32 :: (val: i32) -> i32 #intrinsic --- popcnt_i32 :: (val: i32) -> i32 #intrinsic --- diff --git a/core/io/file.onyx b/core/io/file.onyx index 99c1759c..757be624 100644 --- a/core/io/file.onyx +++ b/core/io/file.onyx @@ -1,7 +1,7 @@ package core.io -use package build_opts as build_opts -#if build_opts.Runtime != build_opts.Runtime_Wasi { +use package runtime as runtime +#if runtime.Runtime != runtime.Runtime_Wasi { #error "The file system library is currently only available on the WASI runtime, and should only be included if that is the chosen runtime." } diff --git a/core/js/webgl.onyx b/core/js/webgl.onyx index 8ebabfd2..b0befbef 100644 --- a/core/js/webgl.onyx +++ b/core/js/webgl.onyx @@ -3,8 +3,8 @@ package gl // To be used with the corresponding gl.js // There are many things that are missing but this suffices for me. -use package build_opts as build_opts -#if build_opts.Runtime != build_opts.Runtime_Js { +use package runtime as runtime +#if runtime.Runtime != runtime.Runtime_Js { #error "'webgl' can only be used with the 'js' runtime." } diff --git a/core/map.onyx b/core/map.onyx index cbdb47b9..e8ac3db8 100644 --- a/core/map.onyx +++ b/core/map.onyx @@ -1,6 +1,5 @@ package core.map -use package core { printf } use package core.array as array use package core.string as string diff --git a/core/build_opts.onyx b/core/runtime/build_opts.onyx similarity index 97% rename from core/build_opts.onyx rename to core/runtime/build_opts.onyx index 11f1cf95..5b60b137 100644 --- a/core/build_opts.onyx +++ b/core/runtime/build_opts.onyx @@ -8,7 +8,7 @@ -package build_opts +package runtime // At some point, these will become an enum. The problem at the moment is that diff --git a/core/runtime/common.onyx b/core/runtime/common.onyx new file mode 100644 index 00000000..917a97fa --- /dev/null +++ b/core/runtime/common.onyx @@ -0,0 +1,34 @@ +package runtime + +use package core +use package core.intrinsics.onyx { __initialize } + +// The default assert handler. This assumes that __output_string +// and __exit are defined in the 'runtime' package. +__assert_handler :: (msg: str, file: str) { + __output_string("Assert failed: "); + __output_string(msg); + + if file.data != null { + __output_string(" in "); + __output_string(file); + } + + __output_string("\n"); + + __exit(1); +} + +// Use this procedure to initialize everything needed in the +// standard library when you are dropped directly into a function. +__runtime_initialize :: () { + alloc.init(); + + __initialize(^context); + context.allocator = alloc.heap_allocator; + context.temp_allocator = alloc.temp_allocator; + context.assert_handler = __assert_handler; + + __stdio_init(); +} + diff --git a/core/runtime/js.onyx b/core/runtime/js.onyx new file mode 100644 index 00000000..2907569c --- /dev/null +++ b/core/runtime/js.onyx @@ -0,0 +1,20 @@ +package runtime + +#load "core/runtime/common" + +use package core +use package main as main + +__output_string :: (s: str) -> u32 #foreign "host" "print_str" --- +__exit :: (status: i32) -> void #foreign "host" "exit" --- + +// The builtin _start proc. +// Sets up everything needed for execution. +proc () #export "_start" { + __runtime_initialize(); + + args: [] cstr = .{ null, 0 }; + main.main(args); + + __flush_stdio(); +} diff --git a/core/sys/wasi.onyx b/core/runtime/wasi.onyx similarity index 61% rename from core/sys/wasi.onyx rename to core/runtime/wasi.onyx index 2805a217..3fdb3365 100644 --- a/core/sys/wasi.onyx +++ b/core/runtime/wasi.onyx @@ -1,15 +1,15 @@ -package system +package runtime #load "core/wasi" +#load "core/runtime/common" use package wasi use package core use package main as main -use package core.intrinsics.wasm { __initialize } -STDOUT_FILENO :: 1 +__output_string :: (s: str) -> u32 { + STDOUT_FILENO :: 1 -output_str :: (s: str) -> u32 { vec := IOVec.{ buf = cast(u32) s.data, len = s.count }; tmp : Size; fd_write(STDOUT_FILENO, IOVecArray.{ cast(u32) ^vec, 1 }, ^tmp); @@ -17,42 +17,12 @@ output_str :: (s: str) -> u32 { return tmp; } -assert_handler :: (msg: str, file: str) { - output_str("Assert failed: "); - output_str(msg); - - if file.data != null { - output_str(" in "); - output_str(file); - } - - output_str("\n"); - - proc_exit(1); -} - -proc () #export "_initialize" { - alloc.init(); - - __initialize(^context); - context.allocator = alloc.heap_allocator; - context.temp_allocator = alloc.temp_allocator; - context.assert_handler = assert_handler; - - stdio_init(); -} +__exit :: (status: i32) do proc_exit(status); // The builtin _start proc. // Sets up everything needed for execution. proc () #export "_start" { - alloc.init(); - - __initialize(^context); - context.allocator = alloc.heap_allocator; - context.temp_allocator = alloc.temp_allocator; - context.assert_handler = assert_handler; - - stdio_init(); + __runtime_initialize(); args : [] cstr; argv_buf_size : Size; @@ -78,5 +48,5 @@ proc () #export "_start" { main.main(args); - print_stream_flush(); + __flush_stdio(); } diff --git a/core/std.onyx b/core/std.onyx index 58428eb4..d10f13e1 100644 --- a/core/std.onyx +++ b/core/std.onyx @@ -1,8 +1,6 @@ package core -#load "core/build_opts" - #load "core/alloc" #load "core/memory" @@ -17,6 +15,7 @@ package core #load "core/string/builder" #load "core/string/reader" +#load "core/intrinsics/onyx" #load "core/intrinsics/wasm" #load "core/io/io" @@ -25,18 +24,21 @@ package core #load "core/io/writer" #load "core/io/binary" -use package build_opts as build_opts -#if build_opts.Runtime == build_opts.Runtime_Wasi { - #load "core/sys/wasi" +#load "core/runtime/build_opts" +#load "core/runtime/common" + +use package runtime as runtime +#if runtime.Runtime == runtime.Runtime_Wasi { + #load "core/runtime/wasi" #load "core/wasi" #load "core/io/file" #load "core/env" } -#if build_opts.Runtime == build_opts.Runtime_Js { - #load "core/sys/js" +#if runtime.Runtime == runtime.Runtime_Js { + #load "core/runtime/js" } -#if build_opts.Runtime != build_opts.Runtime_Custom { +#if runtime.Runtime != runtime.Runtime_Custom { #load "core/stdio" } diff --git a/core/stdio.onyx b/core/stdio.onyx index 47ac620b..81a98369 100644 --- a/core/stdio.onyx +++ b/core/stdio.onyx @@ -10,25 +10,15 @@ package core // It is expected that a file will be included that will be part // of the system package -use package build_opts as build_opts -#if build_opts.Runtime != build_opts.Runtime_Custom { - use package system as system -} else { +use package runtime as runtime +#if runtime.Runtime == runtime.Runtime_Custom { #error "'stdio' can only be included in the 'wasi' or 'js' runtime." } -#private_file print_stream : io.DynamicStringStream; -#private_file print_writer : io.Writer; - -stdio_init :: () { - print_stream = io.dynamic_string_stream_make(2048, context.allocator); - print_writer = io.writer_make(^print_stream); -} - print :: proc { (x: str) { io.write(^print_writer, x); - if x[x.count - 1] == #char "\n" do print_stream_flush(); + if x[x.count - 1] == #char "\n" do __flush_stdio(); }, (x: $T) { io.write(^print_writer, x); }, @@ -66,12 +56,26 @@ print_array :: proc { } } -print_stream_flush :: () { + +// +// Private and internal things +// + +#private_file print_stream : io.DynamicStringStream; +#private_file print_writer : io.Writer; + +__stdio_init :: () { + print_stream = io.dynamic_string_stream_make(2048, context.allocator); + print_writer = io.writer_make(^print_stream); +} + + +__flush_stdio :: () { if print_stream.data.count == 0 do return; ^print_stream |> io.dynamic_string_stream_to_str() - |> system.output_str(); + |> runtime.__output_string(); ^print_stream |> io.stream_flush(); } diff --git a/core/string.onyx b/core/string.onyx index 18a2e75e..76d86963 100644 --- a/core/string.onyx +++ b/core/string.onyx @@ -41,20 +41,24 @@ length :: proc { }, } -// trim_start :: (s: str, ch := #char " ") -> str -// trim_start :: (s: ^str, ch := #char " ") -// trim_end :: (s: str, ch := #char " ") -> str -// trim_end :: (s: ^str, ch := #char " ") +concat :: proc { + (s1: str, s2: str, allocator := context.allocator) -> str { + len1 := length(s1); + len2 := length(s2); -concat :: (s1: str, s2: str, allocator := context.allocator) -> str { - len1 := length(s1); - len2 := length(s2); + data := cast(^u8) raw_alloc(allocator, len1 + len2); + memory.copy(data, s1.data, len1); + memory.copy(data + len1, s2.data, len2); - data := cast(^u8) raw_alloc(allocator, len1 + len2); - memory.copy(data, s1.data, len1); - memory.copy(data + len1, s2.data, len2); + return str.{ data, len1 + len2 }; + }, - return str.{ data, len1 + len2 }; + (into: ^[..] u8, s: str) -> str { + array.ensure_capacity(into, into.count + s.count); + memory.copy(into.data, s.data, into.count); + into.count += s.count; + return .{ into.data, into.count }; + } } split :: (s: str, delim: u8, allocator := context.allocator) -> []str { @@ -85,7 +89,7 @@ contains :: proc { return false; }, - (s: str, substr: str) -> bool #export "ASDFASDFASDF" { + (s: str, substr: str) -> bool { while i := 0; i < s.count { while j := 0; j < substr.count { if s[i + j] != substr[j] { diff --git a/core/string/reader.onyx b/core/string/reader.onyx index 2b46d033..c950227d 100644 --- a/core/string/reader.onyx +++ b/core/string/reader.onyx @@ -1,7 +1,5 @@ package core.string.reader -use package core { printf } - StringReader :: struct { // Think of this as `use s : str`; data : ^u8; diff --git a/core/sys/js.onyx b/core/sys/js.onyx deleted file mode 100644 index 727eddc9..00000000 --- a/core/sys/js.onyx +++ /dev/null @@ -1,43 +0,0 @@ -package system - -use package core -use package main as main -use package core.intrinsics.wasm { __initialize } - -output_str :: (s: str) -> u32 #foreign "host" "print_str" --- - -assert_handler :: (msg: str, file: str) { - output_str("Assert failed: "); - output_str(msg); - - if file.data != null { - output_str(" in "); - output_str(file); - } - - output_str("\n"); - - process_exit :: proc (status: i32) #foreign "host" "exit" --- - process_exit(1); -} - -// The builtin _start proc. -// Sets up everything needed for execution. -proc () #export "_start" { - alloc.init(); - - __initialize(^context); - context.allocator = alloc.heap_allocator; - context.temp_allocator = alloc.temp_allocator; - context.assert_handler = assert_handler; - - args : [] cstr; - args.data = null; - args.count = 0; - - stdio_init(); - - main.main(args); - - print_stream_flush(); -} diff --git a/include/bh.h b/include/bh.h index 127e74ad..c3dcdb32 100644 --- a/include/bh.h +++ b/include/bh.h @@ -1221,7 +1221,7 @@ b32 bh_str_ends_with(char* str, char* end) { while (*e == *s && e != end && s != str) e--, s--; - return e == end; + return *e == *s; } char* bh_strdup(bh_allocator a, char* str) { diff --git a/progs/poly_solidify.onyx b/progs/poly_solidify.onyx index 29c6219c..931c5e7e 100644 --- a/progs/poly_solidify.onyx +++ b/progs/poly_solidify.onyx @@ -11,7 +11,7 @@ specific_compose_1 :: #solidify specific_compose_0 { A = f32 }; specific_compose_2 :: #solidify specific_compose_1 { C = f64 }; main :: proc (args: [] cstr) { - use package build_opts + use package runtime println(Runtime); println("=================================================="); @@ -78,4 +78,4 @@ array_map :: proc (arr: [..] $T, f: proc (T) -> T) { } } -double :: proc (v: $V) -> V do return v * 2; \ No newline at end of file +double :: proc (v: $V) -> V do return v * 2; diff --git a/src/onyxbuiltins.c b/src/onyxbuiltins.c index 0d8a9b4c..f4c0ca28 100644 --- a/src/onyxbuiltins.c +++ b/src/onyxbuiltins.c @@ -383,7 +383,7 @@ void initialize_builtins(bh_allocator a) { } void introduce_build_options(bh_allocator a) { - Package* p = package_lookup_or_create("build_opts", context.global_scope, a); + Package* p = package_lookup_or_create("runtime", context.global_scope, a); AstNumLit* runtime_type = make_int_literal(a, context.options->runtime); symbol_builtin_introduce(p->scope, "Runtime", (AstNode *) runtime_type); -- 2.25.1