From 1916e9035e71756f2310aca61c0a11e8466dca3f Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 10 Aug 2020 08:54:03 -0500 Subject: [PATCH] added char literals and fixed cast bugs --- docs/plan | 4 +-- onyx | Bin 136192 -> 140288 bytes progs/print_funcs.onyx | 44 +++++++++++++++--------------- progs/stack_based.onyx | 2 ++ src/onyxparser.c | 32 ++++++++++++++++++++++ src/onyxwasm.c | 59 +++++++++++++++++------------------------ 6 files changed, 82 insertions(+), 59 deletions(-) diff --git a/docs/plan b/docs/plan index 7c5ac2ca..ca7bcea6 100644 --- a/docs/plan +++ b/docs/plan @@ -148,13 +148,13 @@ HOW: [X] Be smart about when to use the stack versus use the wasm locals - [ ] Better numeric literals + [X] Better numeric literals - suffix 'f' for float32 - no suffix 'f', but has decimal for float64 - suffix 'l' for int64 - nothing special for i32 or below - [ ] Char literals + [X] Char literals [ ] Properly checking binary operators - Shouldn't be able to add two structs/arrays together diff --git a/onyx b/onyx index 85f516464e0eeaa952f31e064c2f09299c68e940..5c7d161715bb4e7c70c41744143e35291c75aa90 100755 GIT binary patch delta 41827 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 GxBU+)oN&Yd delta 39691 zcmcG%2V51$*FU^76agt$iUOiu1QEr81tls9igHm@?8b^E#xBO1SS|@@yt$GPM_o0I z7>y<|35p5EiWN&th!s1Q=w3_g#+ZbCzq17|`~2SLd7t<5|L^CsoSE-AbLLDxGrO0~ zI_#0P(Ic-B@&2&!Wv{2*h`_I>-IzaV)-rmK5)*VPnAA8Ia>reISQRfV(0Df^m?tg%XsnJOs@r6X(nR}Jsc?ty2oxqdWqO~AmO*GA>G{cFY5_5YGT3nluS zt5wU%Lp4MYTC0IF176Td#mf!&@l4eU$$*z@_yYs}Ov9gRxK+uf%@Hh=OSH-PDyvB&G$`D#;c&q_W*6?@(o}l502E2!cTMT%*f?EY4 z-M}barj~550q>_N$}r%sYWR2qK3u~y4fq%hpUZLNFX&Z0Sz}}w63o!>B?f$+hUXdZ zw>5l~0slb5^PO;>zpzYWY;Ks^QPiS*!N;?=^;SzAC;&!#xc64;pSV;Hxz}*noem z;bt9I%P$CS1 z*N2~=B`7u|7@#FMY{1KZR~3~S@WGmVnE@}>$v-#X zS(?0XK{ZS-*u5+*Zoo4juk=5YfiXtQAlQH>Y8jXfc;~m(45AIVS(A@7;IC`?<1c9A zU$<1y5+oWDtkyEH81V8NYR2gX{DCGv*nk&n@)?!5HvU#?RW!bm!3Q6jKueHmz?Z(I zW<1w`=U-RxECaq;lV4)MGpt&IJOkrPEx{@SZr0?B4R}wjN)H?GhKp2#N)32d4Y!sV z7(+EixdES|;gSJ2FIF>nV8F9A`R4{))NtXVlFnK={Jzr|9x9^}w`dud40x7?2OIEh z8g4e=$29%XRdBTbb1gw^6^0;~-&IQ%Z@|+vJkfyXX}HCJ7i)OB0hc(=``=&#!=YK4 zVZcpGRD;GFaEpd#8t`gb!LkhaCz|{c;7b43hu;?(BhQfF8x3D&zza1z-+=e9sfKPe z;6<8z!Ao2ne@8XOwwDZL`0df~Vgr6s!w(zqa~fW1z^`a{nF0TOiMIZi8yJDwVj~&w zyPBd02KjS+81&_}})4S0rzTMYPA4No`VZ)*79s<>6KX^f1j3}Kaqk2m0-YIvpr-=N`h z4frMv&obbJ3XcA_#K73CCCD@2M>Twv0Y9tZ`3C%khHo_BcQw3#AHQ>6V z@!Wvx{zSC4T&yknSrrQOYp#e>rL?7fahuQrr)df z3B4(U4fuFXK32g||9Xk_P7!ZNkf%YX-K@|gx)@1%2`ao+w9v|gU)%mA+U z_EiS_uqIz%!1YnH&4A}?@}&lxZ&Z~2S7u<$)e<}~;QBazZotzudDG3RO`y*Q!3I29 zlaIY=@c;FRCEk!g&=M41Q8VCYb*|b7;pDIr?&pM;I^q6Kcv&Tm@`pMx$}1Uy5axsj zYcpdtV5$i!)9i#(C;4b6+{Foxb;8{^uGBwhyc2_$PQMbJaGtq-S)6da19M)w6Yi-C zgAR7Wy_|4sh7+T@6Jxv+?(KwUI^jM}_*^I4*9p&Z!nM;@g}X$>tpYDq4W|ToP6+~> z@KsKDpc9_&gaX&*Qu+IZBoI2_ENN$Wg4skMcP0 zI*tM*zK_RwpLgUd@$Ed$yO7n9rvO_xz`KqkONoEYIc${|; zN4gSU#^bzeI1-ikdpyp2gdJV=0v zjywfuxrZ$eZ|PmL77_Z{{MOg_j?gg3CRuZb}Fi!D8DPnTcrD zy2u=mf7tB$=EgN!5+QemLi>&$Fyk zJBE`@k?H6MJd->mX;Eyk2MyWJHbu0d=U1~E5i#`JU{)itJ4PgQls%cKXK`% zT|lH?8ng07sWiJWi)q}0w&Ae^U*5+p_Sp~8Y`3L5joALiE$LYw_Ge>Dz_-IVXMUtf zdW;Yhr!8ZBW17%UC6*Nv<$30g0^a|SeIFA^-wa}>W171h{#RhtntVpxqnW8`U3RF6 zg?`!)!GW|JCw1B4rit`sloGs&;9@n{tyvq_@FVE3AJq4OIka_P;x&=8Ka zWF^gO&{L5L`n-8ZI$I46j7_99)!>h@b*x903c{jdznqVr%W_F_q$}@Pyx+`4Yoip6 z?HD3IJeB1%TLoIC$rz=@4}|f0QiU91B{xdtj>DL7On4^C7W>x70w_en7AmU;XC?jl zl4S+YMdihE-YuRiH(_Qqf7Xuc|B3`SmlKEcZ}C+gAY)Y za_nnL4ZnuU;LV}T+VN_->Z28wS19URus>TiZ^@@DORi5Rg(S@V1C<^0-X_Yp)lh1ZDI3Ug^^8cb*s9K0SU8O4X|VILe*vX-*V6st{OTnOLZaX9Uok}MaK-inUl2@Jxj}c^p#bT;zl}+8 zwYa2s`2A?|`_ad5GZB^qd2VKH;{Kq+l37%nt~9AGo6^QkJ%<&(Xw!qxcZU?F#DC)E zVyO@cZzZ&%E}dTptWM$!x*~vuBn_itO*SWKFuml@eoKmXiFhFtdUp;ZbnKkM#$B2c z8uurAHFzrtG~q_7@5^>GAx>v&m75p*@b@n>Az1|i~bFx5AZ%=>*8Utca6=C zA3oEY&t-eeyb8LQcMs6YJDZC$G(m@5C{){~w5a^fULxkPYnrg4VS>V7P^qw~x zHE;%%K4E7D#s}7Yj3oBtNRJlJEVhy~+dgSn8LK}ig^qd5CJhRw`H$H9gCgjpzgXd* zXqxmFyEG_~`aNRx2FK77&so~wF*NrK+dQ}t?fZ~j9Nfe+5Pc2?<$la+yc!Ua^|7{? zNp-zo$~?`KtADbDS7Yc6Pd4$@c67-DwtIL@w)0h=PW{l&cehiecx6eQdB;b++(z%* z-M*3$EHwfn6@~}HHS$~31ARt1^niH`38#;rv6vwi`c(rqYsgZ+d6F#e;R#c12c@YJ zGYt(7_To*<0#yI%~RUkym^FA-vpnO}`W6K=C~9*!OxI4qeiyT?8rR*#N)!gdV{ z_8$b88=kWk9u~SwwN>oaut>ied<@&}r`irlHF?6&;bHXIT^2vQZMEE$7#iE|vf0C% zhs=4*>v#b=!z_>Ou}ay{f>P#P)MG?qdvMcilY*V=G1WFK(kzAZbSOllT7s~Tmbw@~#4X*J)UDdNrv)$x6-0m^Y*UbKp??5kn7_OK1sOxuF``5y0 z=@>TRwdVALJM4qkI!5*8LY2LkH%$VNDlI0pzrnf&Iv$G4=@ma^XC>(Sj;S?2gqe}5$9ZPYV&a%41W!7G=2JU+xvd;vB3 zARQvH1LK>}4p%V))MB0!Ow>hUwI?*8ZZBBsgt@f(RknXZ)7U~R9z54T3^d-O5fyef z*G%!dg__VJ7|#}|;wCds>=X6PO=AtM22!<##4D(w&e2`KaNOVvWl5KKUOj2KO@GA+ zC-3|`!FE2sNlmXXGO3Bz!eG^yvo~4WNl9MqwCK{C?43!|Sc|Ul^s_)VscT~z5X8i; z5p>HXwzF#kdf^Pa-Zh+#AI99fHK0kCSkrDT>A%<6sBY06nq!M&$-e6$zhOqh?1DSm zLYChMZc*H|#Xb2AleB**=N~XT24cRj*k{0~_R64?zPiW`c8j1hue00T28AEPNY8#g z)Gw#65{RC47J^)Udm=A@_eC~3r3wAz8p}&*OV?juM^d8b0(bT>C89dtmObk-nD{N4 z%IaA{$SC%TWd?^oLn{r5O<`SAUeE3SH^K4>jgQliTq08g`D=?H&h*J4oJ*07p9bKcL#tt=HfuplA-REc7xgKrk zgtM$hT8y;`l4~nA8W1{atNNt3s$RVN80cV8`Lw#dix^JXGSbnkZMy>Lna5yH$SF8r|W6^-7Yw0 z06@qw2~=|5p;Wb>l?acOs&*{*1x4`W%r`hh8BtC~dg4Bj@N3e{VlAd+tgLEV&V;=Xw z4*O_zzQIk%_FLlOgO8P5GEMq!9&$SR+_vdN0*88L*PuLHAX3+j# zta0B))bnKFfW89=-SQjT)US@K%a5|m?oH|$wH8e`4z73HaLoDA%rag(GZQPPPcye_ zVJXX)97^eVHh*$++M<+wJGn{p<1@T<5+={%yLIj;PDF^i03NFMs2n^<|4NKZ38Z5@ zS*StZr9Ram`rq6kq zrZn>mlfXc^W7+gqYb~1^MvH%8b*DzOvY+Nw4M3k66U@E7>~`&DwySi`rhv;my;#N5 z8^k?5uV2~BsRQC&csdyL4KJ0gOSEGynB(%eFOW1mX@nyi4enP@kZNOTf*g14;91=} z$;h<2)mp=~leQgaQPX1Ryi=^-w5Y&-r%*6$wNm|}q*E++T0|3XWP~c%ruyy?GkaIo z1?5RJe*oT}^ynnJIIXRh1-mzH+2^NNoy;g|JIT6c)@vRNJ5_grYY&#@o{;6Ca9%Wf z_wx}_>9n*z$yjC&T5*h(XGU~50#R-F-&Y*tZ2%mLFu|dKN&VBtTrmet?7{RgboKXaz#F|o&bx4t zT2gvX-p+iQ?HY^4_UcTw>y6!B9-NCJz49AdG$Wb1l(J(p2GQ+@S>((nbm?Jbn=t5C zHfQG8u<0}OBP@H|6ol2jWwD)?s$FG&&TK}DN?5~L_2}YXm}ORH`bIfhI_q`%*U#+f ztntCqj`LC44O4AOw9?`NZ*k8OHf#1^D*w!WogGboKgj-?UBAhwUscgX7iPL8W%qJ5 z;be!K_|q}opPc+-Nj%6><_w`jFS9S^jG*%lGMBj#^v44%8szO`tmoVWI=X@_o!c-l z1Zf=!s8`*Ald2tKC3DyKOghRtQ3*PcBgqB?qti}>_P7zVOQQv>q!0)gzYAr zk78I3LKqw4Q6SQh4ZQpI_ULL)!BG-?{kEKGPk1rIj z!l4=pRgz)`;pH9+hScyJu-p`LSHGf^ny8Z$fZ$m`v?I`cd?F2&E}vxPcRmc; zQON7kH8Rz1RSS!AI`~`Z9@6x4?D#vW^yUc`oZYgP|3#jMccjHe_{{O#VxQ|F`4qBI z+2d)zPwZHBTGL=`d{G+rrznl%6VzX>&l^wBg8gA9TJWz&3VRPA>F6gcIVYUf`iZ@s zGnf8b#IEMdqKi2RVpA5?p?!6xAZcuMk{?0EL#}<1E){G!;mcH2BB!DyQ2~Tkj11--$QfV zt@wc;><8V(K3;sg*0VFb8E0Ow*ymx1yQXvoY42I~$-85y_jyK_G@wD}S)(Okbi?W| zQkIbZi$*|oiQ7>SrBQ5g^EhG)ny(O_1t5pqzQbSQ*T`)SC`gt{Y#^AgR3~Eq`nBy} zi!Gtw2=R-gJ5<% zvhEt}mvfkR5S!bpih$dYVQi~C##HC1qAN;GTx%G+Z%^|+GL)<0!h43Yl%-8#KjeVT z3-v5Xx=_HrSlWR$7|O0L?b4}yh_37m4`m>+GS?k4*5)xsL@uc7qSLG0VS!tkYe zO23-oK)+hWOO+ef7@KBvyVf95ZXSF4!@%KZ2S9Uf+#HIDa$wScr2Yf?!Es3H&W*T> zN!YE;Km_gasNZCS?gYKu=34Ci(ESsd0+viIc@51lS+e(=EQ_Aax{j3p3}BBw?BQ9$ zbFjq~3}D@srPm$EW7+dOAf0ZSS;J!Y8O9MiK|S^zz_u>y=II3>Ew{n3{>+6n2-$=& z!F^W?PKP$$qyb=!fXGv^o@NjS?54ds2FBM_6K|1wkC9Ij}*?t^|E9=K9SY(5* z)z~*6Qm=vkV}wh(DtqUIfBPz`D*7^M`Dp*qeGq%) zs9(-%WxV?M_hG|UB>DWB&$aTUD*>l(U$3Y=bOVr{i*ESk^nq8FYM%+OtbJT#=<>_? z9<#h9dx052c<0=R+tB(Gcc{0U6|3T|0+0gXBx1J-moJ0YfyI`I;=7&c!^|s((Ybxt z!j+4<5N?m{6-Nv_GdR_6@Cv$@j>Hde&SJ53Mb2LbWWxr<9+%OREnZVX zDL$;< zqH7hrs0rcS3ZH&n&n5i%PJwrLW#Qv)HyRds%{2??x7ZhW?qYH4JJL7jvsvq}dCp2w z3OzfCWqdivI|#9^EubteAc^h&at1x~7K`6d;(ff6jvwp9s&DK?1KwvtH}<7_a@qGA zPt&Xpg^RxmB>^20Q1XVnXCf$BOS!+&)eJB6&QIJC=A0qmz{sKTY~J_L z^vGhi{`*!TGv81>0e|f0xyP8B5PJeM#_%`T!|y|B(i_aDAhcZrP3SRtwkq_`Z-TIc z4=Bk~2K570%-YRx|&sXrQ|v;>BS{iYrNMhd3l^yo%0q< zXTL$qsOjt;v~<-Z11cp4a!LNQR%)d2{zP9;?d;5X{K>84Go2-E4y6w>+3?Mw?M`Q^ zwtP`3>BS{+HYi9xX}otUdG|`e!#ScLeUiyGL(AKl>^QW%rb)J{l-$fE`7?ScRpZsF zb6yzd?V83u zgqF{zv2USektT_WOw$s^B}2L71dZ3WlIO{J^*FERG)4+TX^UyBPGM-fAWiZ*SgI{2 zeuZRxF8S9~)y|Si-fqr|q^xJC)@YhK87VyCU04NAayMnd>%lVDLIYC=pQc;6M!SVVi|4ep__Cv@bZ6@EW#($Y~r1 zd?{&M33hIFw`t9pbz7eRZ=mYr&D#oMF3k(CZ+nk;PHU>9%52JJZ%?LM=CPgI6TDA0 z0jSi)Z%vrnj@7Zf#=!-tJgQcYMH1drq~hMunN8R)JKhaF%OBNaB?Z~e zkKybeM{@I}X<2OA&R*fY%|z&K4=m@817nd;s#wY`bDPGK;o*M_yS&p%KN!nK?h2zv z8nXqv8pf<@tUn#H$4lRQ4)?UEM;L0DzX34Aqo=JL)6ODzW0GGU`*l}K%Y_fP${8lx zZ7>Faf#(!>`g;IyGI@$h>kfsmu?I-nnBRH5ZCuDZ?6uuyr7Up34obg|VX3>rP5bbe z&#$OUm<5M1xe1-lvbT0e(GDN5wYytVj}O?H-Szx?H9`UXRuu0amuKTgaV2$GwLQ_X z-!9;0B-8}=r$nyT9_Np+g%1G4YzHm5=^mDnL=PU7_I$)f?g^qBKVq}@G^WE=vbB4n z>6TB~&wE1XoX^;;JzZ+`{Zw(Bn_*Ys!Hwk!r8=Lnq~aKB=6qg&Tl}Q-wNdC(wm;Hr ze_cG_?Pge6b8jd5*N(-cXHMOTxYPW{0 z&)%Sr9~J2-*mzq#lse!?R36fvHO#s>ZHhbJ*91 zqpEd4Dyi11?Cjwdb;j1_y}&h6x_}l&;g%z=jhG`Jvj#_+dVH-+MS+nb9;QLu%yAWNt_OsAOj~k0yA0W#_f4X$(+PO+qSZvNOY| zF2>Q=If$XPaDRgWtMt{CT z{cP;&FQLrycn`X9i4x2_K9IIigV&C~La)B7plyE%r7_c3zh4sR1Qq%Imsnbd2V?6` znrg^sGCzPT`LBVrZC_UO>nou<1GOf3 zyn;8$JRGb(<1^Te70j!&5k0a=<8F z><&(@eWG^4wYFdgqsyG%%}K(JJ!rwYJ)z>SG-Z>XgC-UKa3_iMogy)|8VPfaH33Pl zMqZ&2zM{PviFQ5W2c)PP=|`_wMQ;z1KqK0SJv>O8h@pJB!g|P;Lm@RBZ_yp(n=muZ z*&~%b$C^LHbsnUb>wEB0#b+KQik2=E>w1z-^n-=sNKev{_FgD{=1GRqM+?M%JV`R$ zv_S0aMJ#mm0*tj}*m$siT z7FH*%T~|~`UU#Y^uM6|U0B=ZqGLP#TOWV#9i+KF6w>WKE4T6HS<1Mk34~eI5za>ub zfk8=ciQoE=R<0j=Ld^{y($w?9n>=@%sq@hlTdgZk^~sxJA79d&roAby^+j>2zbRh# zC0U*}%m|gTah^S#qp@m+K6AyZexwUs^;C>9k@nO+M;v1!gD8C}?lh6c-48wBQ)2(f zXgowov&qt8>^6AeJ<_nXj#a9a;lMN5_7L+r_R5@Pv1gj4TpS$myirRhW{r_Lju2yO zkm>Z;aPf;8q@Dk-_qpELW?mA$YJB!UykCO^(}R-e=}+2roD6=N?V-hXn?JqLTa{bT z7aYDj*HhNlEQC9%SV*yj5*PZT#x1kNFa1et>%R4BUN(nfqqOffj(is@PpFbndozYr z?XHfKf1)?$NkffzYn&fAjnno<{xZJVuk`bz+8TcdYD_(gdQ?@x-$M-Dm13ATDxz>m?yCxK*>sY6F#FBRvB8NukzzfTu`3dYD-H(h)YOcHC3MyIjZ zhvMMu!YuR(<&BSC6=He_X-FGP=hLOQI)uaz?=je5_F>F;FSScCM*hvJ{OU%&g?kpS zbx@u=vWin3Y2F6b@pLQtH+GTdf|%)yC;RYp3(CUTfzxqxhK@F%4cD@^XPQ&@Y2wwI zB#32RtIn33@lIc!N2P+;-&W|Ci{7kU_Sa|T)CH-yL$hC1>fE!9?r_)^{jr`=m6;=wt-wP zo|`I)b3-w42D?6zc1&i4WeNV1=U2`6pI{~9^vTFLiY1>540DBq#cz9gE39pP*|USV z8Jd-=897&*UYZ2i#K>>3yU+g1)$iSwI4o%KEc-8-=qDaZv-gPYY43yO;H-4yJbQYs zmFd(5I3D&Uc}dy-qDE$iv-tC!=z?HwSM^8Ixrsaj6jCg%jvC*5zKQ=Hl*+m2^?qmf z&j&YZfWhL(<1d=p=b5Dq=VZBq6*Y|9J1q2D^e3og(GkC#Ng*uuLMW|2v9hTrUZ@+= zS`(j)QxAyeoI<%eEbz-oWS?J%q=RZIY3vi&^$YQl59g|F6;cB#ZI`jlkeXpVNWvaS zuZe}M_+oA9KS61(`4>ZCQc}5HU7{8LGS$8_G7C!vj)Fa;I&bjen=6ynQIdW*o?W`w zwCM@-R7Wlfrk%y%MMi!anHx9tOH`^XXPV{AU^&x-&R6Rf*7i~~O$cYBF4dydYiaFT z_Bva6sS9PV^B!AUv_=p&_V=Z5nig|kN21L$})g`bLKT@N60lx((*Qbf)|WTGlEN=2I8 zKsJGj8ZQ-D1msgyabbp%>LQSDRheNb((3mBny<>ZsmOaky7()4z8k5ex(Z~Cnre`W z#NP~{Uj-;Kf{J_qNw^h2{nb=|4_9QC0|{62TBjm+fCQ>C zJ%_V!sWrLI_TDwqXTy{PtEB+yt0wqNMIHdDqh@1KkrYP&HK{TWhbpN)bp(*MikdYl z@Dw8Zd=%Tds7TuF09xBuLGBJw5`6(=vMRGeMP2|os3ILzq|coIy3AWib?a3n)kYw9 zR3uMDWFQ?>+`SfbQ?aV(vAM*oWymH5b1Vz@V0% zzRoAYL#g(h$YMTJ`Jv=4H@4tjC_O!ht-cpsKciy*2?|6h%%` zZWniLYKt1gr+~_-Expu@P52{>o^Vsf;<1616V%>6+VNLO{{5p?%=1!A2-$c!PkC@z zIUOumZk!JMcCt?Qn_7EdVo5jKTV_|d`sJKWY z)Fs&TC?&^RN(gxPEwb_jny(1oxU-QD@m@rKmh~{!bmO|S{?@#)LTTgv&>wEa8JOUh z`8%39FU>wFI%#KT4kW>o#pY@z?>OhBe%LH2>#O5!ybW9VN|@B6y`j6j#`U~(-eQdW zc~I-buijpGwW{-Wv8uqGc7_c8MQu1KIA-Lpb)clY0t8p30!;l-0Wm>ID3dhxnsY7K zT$Eba+E=NCNxaY%sHSA44!ZE@arAv$H7<1Xrz5H_UfL^IK#H#x( znuAv|m0II(>gcr=RJGb}^J=@)Tj^nIc$aF3MA_FcDGY&e_CBWU7nmt7^U?bPqqi%- z?U*(&mSw+1&#_N&v;?#f@^?{b_Rc0{w6D`gJKxo9rb-FVI7aX~-KU~f z-Y3+}VkY{Cw8<#^ms0l1**7}Z*c;Dp<&~3$y*YnJc?8}fRa!&!-T3di^cFEWTA~%C z?p1Q|#~TxuknziD?limiqAp$93$+u%qW%uBmZGv9!;y5+3BN@$9K;qU9NTyljk$$K ziyf<>fpf1Sx*gRZI7Ch0Lm=A}WEL+T4aJ{aybV%iYj}`%y*Wm-7f`GL){qm~`&=9; zP>3}nq&U0S#nBkLwxNCTOHzckE1@U|NUf?WDRsQT>$;8+ZTkplH6!{XCQ<2O>ng^T zI;^i_=PX??!Y42zN(YT-E?4}$5v_^Mr?lFL?&5m0jc8rWl+qL@)QX2HrH;!F0S|J5 z6?F6;K$DE9FIOC6L>J;M3n|Emw&n)Qtqf(}#|?IS{$I+H_sVZFRc!#%Ci4ncXn`E;Q9m;#lM@BRk%aydqh~DD4 zO{+w$%Jfj`aO1YUS_y0DNM7bHM)X5o=B7sU4li>pBPzqmk%$p}l^cAg1!}^o3|}of zJGb~Whn>;ixy5^os0%mvDhge#i_;w>d8q?uRzL*$HYWN=W2UZEL_#P+7 zzGqev@=lHIdvN;dG8WG88^~9>P(x${$KWkaiA-Lq!bXhUQ5_vJbF!|^bGR~ScIlIsc4%Z)_S?w!Tz?l{#S;6?`14|a&(yOFwqpY<_{ zH~me#%Ef0Saq%wJ-Pj1dR49FqsA7+FaJptnizBKj2Y%#|s1HX(mFkx!;RwxX$eeKu zsoK0fjQlaY2G)D?K3mtP<2-cQHCRQ_X-DI@4t=^hre*0%@W&O!gpz8+|NL(}2W$xN zY>vP8f8sYWxi;x;T?iaeD~SGchW1L+B#Z_0Qv&xt@NyWJ%3U6rkEm2zjH6?F4AqE9`toKE^${GuM|?pyCT%r?PnSXcYF_;)>Wnf416FPO>9rn{g6 z#_k45<3E<=UMl`cfb>HnjweSB##8;(icH*^W8(a9Vs^=Mlf}=%Nfz}95yR_~x}L|6 zDyn}uDq8B3*>uQsvA8}7@tJ{_1@LIxjGqt$j}mXzC&jecp`wiuL?ra{Ofjhe$*s|B zge=?kr`o$BGrTf4ZG?EG0r{wA=R%%z3Qke)@w03Gs9$QfSImndA@uQ=;x|#`C@l&Q z=QJcqbY_6Ky&++Ky;mU(976n_DOx(=Uo%w5!>S+vA{xn zX~iWTX+ldciRM&NSM*LL{`6BN(vbdeNlZ;8&1!eOR3ZNaLj`+#yx)T@IbMjd_@y3} z{<$PBOGQU=y(Df=C5i3!U96DtyO9>plydR4p`a3h(Sr0jqIiJ>PlzCv>SuY1S8ia^ zdl$vl-7(0^E{Z>PCm+$6i(d{BZrVWlolTm7Y@TPrpLsOhmm#E`>5D? zIEkfi9T8^^Co+BIh&XEmTqw6A;#VV3&l!isUq+A~wBKQ|_DJ$JEiEbfbR@bGoq0gK zJ&KH`=?BDKqe&i}x?e0GP5RTh`^7e6$Tm84pZH)5X88B_7L|@A^$DF=EIxUSjG}{z ziw2EDOVX0vMNh_)5rhueDfXX;*9_ctieF8H%FlO*K9k6Gx^uhuXcAsK*tK13F_{dG z>h}f~nt`ddGf4wdZBLW>C)xfPfPWX047gufqkok)9r;ty_mfEGi zI^E&-E96smD&*S_Rm#Kq-5=PN|A6a!BefcV|4sZB3~BnHLf(e^FzzmhufY8V3~G(L zOrt!k-);U-!(Mk4YE>BD-K&uAJ*$wf;VyexA!k0Rkk2CgGw!{(f5iO_?tI)UaKDG! zihCyR3Ajh#?uXlgI|27|+#XmS{{_u}KK*`#_-zflqEIWU&LE@<|97-5lpjI50MP$V z?tkQ2oviyGh5v)>?*AXgJLl8EIr6^=7b0Wv!EDlA+%TQA_MR~LwUJ|{O`ZAL)R{BH zbJIx*_a+3f?i*x^7&C|D78TDS4+5-BI><7=^PFxS`%hGt(|J6euIbRR{{^*H$=Ilz zE8@!kZ{2wvtZKDLZ|97|5nVASh1-N+z!CK;sp|Whk&E+I0 zFUGwD_k-cG>;a75#W18g{PwM&#`|){f5n_+tp6o}6Z8Kw?>I8a$9)+FTwfr|e~pvn z%@c6;Jyw=|Cdu+AugUU&@v{6o-YDFGcn|Phz-MEuvOIF4EZ>LVhSz1eEd-9@Wq$w3 zvOIN)EU$%N7~(@9Tny|sUe=z0_>V|a3;b?Sd=Rt(X(xdHKGKgx22X%*LWUh6?*Z9W z(4P*Oa@3LycO33BF!(p?d-#Jp{e4vLQZ>xu65{!Y=WF}|yUOzbUC;2GC-48vZT&x` z=zpunZ8@5W$*)(IMm)q0jF?0VBi`athUj?bXqZ@_$nif9AY5cx zPIeOU%vedx;^CE~Jxk=&Z*!SkyD&+Z%1>qCW46 z-3gk%5e@@r##a?`7*19)L1RJlK+{1@UsuRk90y$vn(K-h>1mf?)m@hJc#3 zKrv`uAp}6vcUH*#@jSa=SB1O|H1S}CEO_A`Nd8hGPX^690oMt%_$-`=>iB=bpi4l7 za~1L?P!nh|sQGGzZ1zS0u2;xoK?{Bd?u~!YS&qOd0I_)8O#;mV{fEclZ&`eh5I)v& z&~(rOPT^+V1$_W2_@X56#o|F9fDQvS!FS69HG}4Wrh~2m%>>;9ng?18S`J#~i!K)n zr|&L+3{Vr^2+nw1At!^H;lE{q7Ql1!8q0Ej&^*vppaq~?L9=3H*&93a2cWT_`Awh))Z9##KL*We zj3mr}1)7N^Bd{*$hq62uv>0?br}?r~F0BUz`6xMP#^rG;`JkIX(>I_-LCqUc6QG%({PzpRpn;%*^((A+2qc1z1vV?iyT1)wuQO*>&I zXeQ`I(0ou=9QozrR6h~46tq8R)*kc)P@x!AjTto&Gz_#DG!N9Y7o&*BK?7qj{?qr# zaz+f=40IK!`5-zYsBlP@TQ@-!gXVxH9>y>QEdUjoLLM{_H0y{gM}uY@MH7M+gJyxI zAA`Z5i9gHoUC=yGk7m#Z8VOo{90fEXknsyF0xbm<#PH8abjb1wxj8HllB@CKWC0DR ze0#6>ZE^JHSdCYR?|n`pny$o_nzM0nvE{fkfMJ9xS3Lf1#620YsKzsNjqr}~QiRuG+4;#s?6m(d%_8)% zm#?X-uSZgKUT>=)lXkp9<|6#!h1mqma$LOqB?{y1j_>fC61#689o^Fr9(z`Ne*+oV zZ4<&$S%r+=uUuSLF)&vwdC5-LDPW1fcop)C7eoR!AJ|u}Vy^;tNWC_ay6&y3p;ufI z-`GgHxo07qb6MQIk<@hm7~xfy#q%3Uo6s_ZhvC3RR8*ptwoAxN1k?>-KN1ctS#y#jK@n*bgLsMiE%aNz^M1vmp14&XB5E(6x#s#x=DRKh<9Tds=jz9!Aw zV_{9;4RPw%B+7Fb!W(Z?$ScL^n@NCJ@HI(x-w90mU3~F1sqcOR;l!I_{clJw_joTs zxOhvP{S8^^bqZnb3p{jJMnF;1O~jA5yP`uqcp`TGmYi`fM>zSpSob^9#y!jj8lM*p z`HtKs?%r7K=eielFCbndGz`WEd&_b-HyT%K-25j+t-Zymn@LMg{@=rw`pEJe@xu+I zj(BJ@32n9!*w4PQ?5m_u%fA!YVJD31DFt@GSH%CMZRze&LlBzyiQTrKOtA>}_Y)j|?1_ADeZ?uqb64%84A z7Ltzja}a(2zS43^&lv2>+oC`2eDI#s5HA;!zV6Qvp6oBS*-Gk$hQW{7hDW<=wE}Qi z?%VVa5T|a1>=K0M2a1QbqS7xSyd+2r{Q=b&9Ed^$ivxea@E(uw#oFSRKVbN5LU?YN zc>4!3!rcVlD7l{4>qiubcZLp#Tg>7gMWmbO5`_P0ip5=QaR7~-zKw)=@#*XU@T_Ly zzHOwX?^bRT+@-)+S^gtRT=*jy-8ab9cYK;}W*6VNT`g$eD_L`t{5cB5ZwmdX#>UC+el}xSYWQ`-UWljmPMqw8-kNx6~`5kPCPhwsQ7ge zY3J1eQpJe39wAn2BkkM;IAi@si5-6;BkGSu_yL}PE5kvl{e?>H<3BhES>Q#^DBArK zX+uJH!ZVYyWEm5Xa`CDu1$HA#^xc7e5Qg@Pep?)}gM?Z;AiV8utecuFr|H190z(qz z;@DVV#lX*2+b;(2=D+v z40Pp+#^3(Hir*2J?Icm5SqQsk6zN zTLSF3hVgO~14~{cR_sDK?jk&Xku3Mp_)5#cyf_bjM7kJ9a>HBX~^~i#KwGOu!^1$8g2o;6FBA$1@8fzmpcRafyH?K zy@xb#Uy4ZCV)5u666L-P;k%2)XM4~X4-k%gS8P^{VbKBGhmG%wZxxd^*0~7ZeOH#@ zQ)z{p47KP{xR-+`ERp4YAVP|70ioTzbVr~7ykzk7_09~D1HdwXd1IWa6_xIrPw0>8 zifXCOWhBVp3A9{Kl@XioB|+}q;8@-hyYD5V-De_f&K0-pCH04VjPUqeyxEF`sL@zz zQSw)e+Xmhy@X9zZ#rFZB#}pTq`+lLxZ^)O{W2Wh@bpU0nqFD?!S%5og4d{$_qxL4x?6)+zD#^$ zKXhjx+?t7>?uQSs9N`Qmp5Wob2rp%#`vLUu2M8}`VzUEqikhHX4PLJGF6hd{od|5^ za&h4SGSz)6!UZeDM+ZpDsJjS1Ux9Z^xeck@K|;y9?ib<_^}vt{Tgj&|?oNh@;|`LJ zHN8hxR8E|H$j!%}=#}F3gD_$p!s#o;YX`|dcL8Hz-Ab|JA*^3%2uo0utFB-9he()v z4zNT~+y}mUDZ;H+i@qgTANlU;z-n;>4`(7gc8&O531oI6JpLo`MG0x#>@LC^Ka$l= z0c_yYih!0o0Bj`>*!M8j;B4tE+grj70eB9|PAv{_Vy@uXCguEnQaB_Z)U6)@6j}Cg|VT)j#y4e?nLPP*nNv zs+|5w++r=Rf2k^8i|b#y%F^Qcr?N7%xc;fFL@jRBztv^dfY)cM83|fk|5#Z04HehF z(^jm-^{)#_ye^=3G74p=8pnqUg`JgCTMgM-N{=HEB z`=I*wK$WJ$AN@O^`e#4&&wT2i_0&J(seiUp|4OI&RZgoQ=%3-#Kf9@aX7hLc8yZ~t zS2XpnX6j$b)W3?Ue+5(j=%xOVOZ}sk`bRAFk5=m6s8qg5iTnlqBb53_C-sj^>fe;q zzagoAGgALXr2b7v^&61*-^n)BVEq%1`X?RrPdMtIY}CKd$iK*lg;5ZE5#X2p$wmDW zixKaM=P!|F{?a&=uX~E6Wn$=MZ2rr{c9)5jloxHk%-=J)L~vXkBnFq0-)OlKUU`*- zkY!@%RlNR^K3nX}>44edL{10K7MF24bhfyi(~+~qYnbJ$OK|S@sAc$8l!Sla+jd;6YK){3sB09LIzt-uMlHm^qiNeER@buRPkdc@F z-|)(>6Au@BXONAm6DOK)AcBtzzKr0Df=UG0n5_E1)IS@jI4yc+pt|k)R|1WEecYqVC(5E8(D}P45K6U9I^)vGIsZRfhUsXOjb>-Z6RqZ-e z1+WNfQ=R^iJ|kbBd-ad<8TtBLt$&2C3ZL&@^pEffSBu)+B(n*X#)(^Qk>=J_szFYz zA-LevZPB0pC){5sE&ES+fKc`y@j#*cKjJ|+u2J<2shV+3LH`|_-- zuV-=1ZPFZb&C%N=B}A*;jha{rD9v-S{hD)38HqPk#vgpb!j-7unb*|#F)f2$x}vKpzEvf{bPbQKt_rT#N<1GpH|Vftklx9b zaoh?_+2x|2fdFM%v?joUub&F zz_~%?$QR|uR!UQ(kJG`LLB5)zMp}YQ4ab_HT>5xVG!&qdCVxu9(NfB#kN0Q|$0)$A z4OdSs!9_!Yks4n1ff)J-zfy`U5xYMk%|{uQKD#3Ja_Lia;tzi=u}s zd9uvKDxfDz(eS)3;+n@OUBLkH=wp&%Ew5@-0mN$Hh%5iRikmccv6eh5Q3ZNw*`3za zZdZY~HTjzwUeI3!o@nxqHQcNXUF%mG!v!lZx4U$(njl5P12jCbql$Od@Ce{FFh!JW zYn55Uqc!;~En~j$^D9Ba)6-Qw+5qn-@TWmFF#YQLWwRm1;RE!8k%5tx2(n@c4?c4nzD^xFoftD zg&{SXN)VO!VI#&SM3akXf+Wc5hX$+Sf?6IbE-`|<)H8GbQ_VUbc00dw=5^-G^KN&+ zUHblF9qfJYF7V7&mH30^x=cOG!$|izzOs%A1*EZ4+;S zdpo!QikfhU{&2~t5%dnQI1K$h`if{BRzh$b++S>XT7SgGgl{2;1RQ^e-^2x*U_ECv z2!7Ra_^BrB1$1a=3{3XOm2>L!@O?skW z!g=sOe`PX-M)NAfHE381XrEbYx9I26TTwqxXV=%o_sILRN*p_lGA1qg8ha=(rnU>B)xz;i2^ zpMw4c@SbI=_B!>HyIFNyr_)f;oVbKmLEX;OLQcLP$=87gu#4@G$B66p3$))3$!_So zux|zO*#(}BFi_qNXKqy{;MlMHCQd>twu)GG*oTa|b%y3w{7R zx|F$jE<&zPlERP z*8|T&KSjUppu>CSm3Dyo%j|C;(j}twxD3E^XC=&DxspEgsB!Od<2Za(crLI>2E5t(Z8Q{5g29@CRz+>APTn1l2 z+^h;k9@hYUZ!;_I-XbfUq22rBQYq?oUzA}P$*7Pc!--52Tc#5^oLq8dyhu3H$bQwJUSzgcoI#NJdcW-ZP>Yry>#%*~TKDk=`10k@O#Myn6Q z*df&op28%awi&$$LAHhqpe5XdUhpV9WjXi(@IsRHt(`sqkKl*_M-pFIj%j-{=QCcM zfgqPqXQiZF50;&cD5!KYy0XYs%86@33QS;S(60pdQF0r2MCU^jSn+OX1@vRj8^ubY zkYIyOK!YlVoy7w1r;s38qYjUd;ZO!+!usTgHr-E3j-&<&Sm;Njzl8J!4B}`Y_(X8?M3LASHn{M>qu55qp|3w1qYdNnteM8BCqqF{z+klrR)PoU`YL3!9z52- zC7MUeBx|!A4WAADXTkGpS%1HIqlLBC7O-4Zk0Of%m^bNj4kmm7xsNT%yOQ}2;61RE zJ%#=b9(jTFe14;+3}`uy9gX0n#C1=4+>>c@;izThNDyFxwF^cB3Gzigw+i|`EI1wo zYyj_>&MhbVo6rqjK>iOJO7_}m1+`@ zc6L7A{-o+Jk&DzzB{Jkb8gK1t?+|sXo7U7V3*Wb}|K}2UUe4?6igzV9(f^PM`+pVx zrXEI#C)!&#s)G|`y*fQ!Zd2_OebQjSUG<}4eIFk z91TvY&@77DJx5M8|0kNysa_o&V&%wy8k{AUj2xioD>WmgD8HO0_W{*hE|`poJA3r+O8UO$Q diff --git a/progs/print_funcs.onyx b/progs/print_funcs.onyx index 575e0f5b..8abf5672 100644 --- a/progs/print_funcs.onyx +++ b/progs/print_funcs.onyx @@ -48,33 +48,33 @@ print_u64_with_base :: proc (n_: u64, base: u64) { for i: 0, 128 do str[i] = cast(u8) 0; c := cast(^u8) ^str[127]; - *c = cast(u8) 0; + *c = #char "\0"; c -= 1; if n == 0l { - *c = cast(u8) 0x30; + *c = #char "0"; c -= 1; } else { while n > 0l { m :: n % base; ch := cast(u8) 0; - if m == 0l do ch = cast(u8) 0x30; - if m == 1l do ch = cast(u8) 0x31; - if m == 2l do ch = cast(u8) 0x32; - if m == 3l do ch = cast(u8) 0x33; - if m == 4l do ch = cast(u8) 0x34; - if m == 5l do ch = cast(u8) 0x35; - if m == 6l do ch = cast(u8) 0x36; - if m == 7l do ch = cast(u8) 0x37; - if m == 8l do ch = cast(u8) 0x38; - if m == 9l do ch = cast(u8) 0x39; - if m == 10l do ch = cast(u8) 0x41; - if m == 11l do ch = cast(u8) 0x42; - if m == 12l do ch = cast(u8) 0x43; - if m == 13l do ch = cast(u8) 0x44; - if m == 14l do ch = cast(u8) 0x45; - if m == 15l do ch = cast(u8) 0x46; + if m == 0l do ch = #char "0"; + if m == 1l do ch = #char "1"; + if m == 2l do ch = #char "2"; + if m == 3l do ch = #char "3"; + if m == 4l do ch = #char "4"; + if m == 5l do ch = #char "5"; + if m == 6l do ch = #char "6"; + if m == 7l do ch = #char "7"; + if m == 8l do ch = #char "8"; + if m == 9l do ch = #char "9"; + if m == 10l do ch = #char "A"; + if m == 11l do ch = #char "B"; + if m == 12l do ch = #char "C"; + if m == 13l do ch = #char "D"; + if m == 14l do ch = #char "E"; + if m == 15l do ch = #char "F"; *c = ch; c -= 1; @@ -84,16 +84,16 @@ print_u64_with_base :: proc (n_: u64, base: u64) { } if base == 16l { - *c = cast(u8) 0x78; + *c = #char "x"; c -= 1; - *c = cast(u8) 0x30; + *c = #char "0"; c -= 1; } if base == 2l { - *c = cast(u8) 0x62; + *c = #char "b"; c -= 1; - *c = cast(u8) 0x30; + *c = #char "0"; c -= 1; } diff --git a/progs/stack_based.onyx b/progs/stack_based.onyx index 364ce910..75a8dd43 100644 --- a/progs/stack_based.onyx +++ b/progs/stack_based.onyx @@ -53,6 +53,8 @@ start :: proc #export { print_bin(42l); print_hex(42l); + print_hex(cast(u64) #char "a"); + a := 12345; arr: [N][N] i32; diff --git a/src/onyxparser.c b/src/onyxparser.c index 67749e1d..8849e451 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -319,6 +319,38 @@ static AstTyped* parse_factor(OnyxParser* parser) { retval = (AstTyped *) fc; break; } + else if (parse_possible_directive(parser, "char")) { + AstNumLit* char_lit = make_node(AstNumLit, Ast_Kind_NumLit); + char_lit->flags |= Ast_Flag_Comptime; + char_lit->type_node = (AstType *) &basic_type_u8; + + char_lit->token = expect_token(parser, Token_Type_Literal_String); + + if (char_lit->token->text[0] != '\\') { + char_lit->value.i = char_lit->token->text[0]; + } else { + switch (char_lit->token->text[1]) { + case '0': char_lit->value.i = '\0'; break; + case 'a': char_lit->value.i = '\a'; break; + case 'b': char_lit->value.i = '\b'; break; + case 'f': char_lit->value.i = '\f'; break; + case 'n': char_lit->value.i = '\n'; break; + case 't': char_lit->value.i = '\t'; break; + case 'r': char_lit->value.i = '\r'; break; + case 'v': char_lit->value.i = '\v'; break; + case 'e': char_lit->value.i = '\e'; break; + default: { + onyx_message_add(Msg_Type_Literal, + char_lit->token->pos, + "invalid escaped character"); + break; + } + } + } + + retval = (AstTyped *) char_lit; + break; + } onyx_message_add(Msg_Type_Literal, parser->curr->pos, diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 7033abef..75fc778b 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -1174,17 +1174,19 @@ COMPILE_FUNC(expression, AstTyped* expr) { *pcode = code; } -static const WasmInstructionType cast_map[][9] = { - // I8 I16 I32 U32 I64 U64 F32 F64 PTR - /* I8 */ { WI_NOP, WI_I32_EXTEND_8_S, WI_I32_EXTEND_8_S, WI_NOP, WI_I64_FROM_I32_S, WI_I64_FROM_I32_S, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE }, - /* I16 */ { WI_NOP, WI_NOP, WI_I32_EXTEND_16_S, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_F32_FROM_I32_U, WI_F64_FROM_I32_U, WI_UNREACHABLE }, - /* I32 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I64_FROM_I32_S, WI_I64_FROM_I32_S, WI_F32_FROM_I32_S, WI_F64_FROM_I32_S, WI_NOP }, - /* U32 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_F32_FROM_I32_U, WI_F64_FROM_I32_U, WI_NOP }, - /* I64 */ { WI_NOP, WI_NOP, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_NOP, WI_NOP, WI_F32_FROM_I64_S, WI_F64_FROM_I64_S, WI_I32_FROM_I64 }, - /* U64 */ { WI_NOP, WI_NOP, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_NOP, WI_NOP, WI_F32_FROM_I64_U, WI_F64_FROM_I64_U, WI_I32_FROM_I64 }, - /* F32 */ { WI_UNREACHABLE, WI_UNREACHABLE, WI_I32_FROM_F32_S, WI_I32_FROM_F32_U, WI_I64_FROM_F32_S, WI_I64_FROM_F32_U, WI_NOP, WI_F64_FROM_F32, WI_UNREACHABLE }, - /* F64 */ { WI_UNREACHABLE, WI_UNREACHABLE, WI_I32_FROM_F64_S, WI_I32_FROM_F64_U, WI_I64_FROM_F64_S, WI_I64_FROM_F64_U, WI_F32_FROM_F64, WI_NOP, WI_UNREACHABLE }, - /* PTR */ { WI_UNREACHABLE, WI_UNREACHABLE, WI_NOP, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_UNREACHABLE, WI_UNREACHABLE, WI_NOP }, +static const WasmInstructionType cast_map[][11] = { + // I8 U8 I16 U16 I32 U32 I64 U64 F32 F64 PTR + /* I8 */ { WI_NOP, WI_NOP, WI_I32_EXTEND_8_S, WI_NOP, WI_I32_EXTEND_8_S, WI_NOP, WI_I64_FROM_I32_S, WI_I64_FROM_I32_S, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE }, + /* U8 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE }, + /* I16 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I32_EXTEND_16_S, WI_NOP, WI_I64_FROM_I32_S, WI_I64_FROM_I32_S, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE }, + /* U16 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE }, + /* I32 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I64_FROM_I32_S, WI_I64_FROM_I32_S, WI_F32_FROM_I32_S, WI_F64_FROM_I32_S, WI_NOP }, + /* U32 */ { WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_F32_FROM_I32_U, WI_F64_FROM_I32_U, WI_NOP }, + /* I64 */ { WI_NOP, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_NOP, WI_NOP, WI_F32_FROM_I64_S, WI_F64_FROM_I64_S, WI_I32_FROM_I64 }, + /* U64 */ { WI_NOP, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_I32_FROM_I64, WI_NOP, WI_NOP, WI_F32_FROM_I64_U, WI_F64_FROM_I64_U, WI_I32_FROM_I64 }, + /* F32 */ { WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE, WI_I32_FROM_F32_S, WI_I32_FROM_F32_U, WI_I64_FROM_F32_S, WI_I64_FROM_F32_U, WI_NOP, WI_F64_FROM_F32, WI_UNREACHABLE }, + /* F64 */ { WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE, WI_I32_FROM_F64_S, WI_I32_FROM_F64_U, WI_I64_FROM_F64_S, WI_I64_FROM_F64_U, WI_F32_FROM_F64, WI_NOP, WI_UNREACHABLE }, + /* PTR */ { WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE, WI_UNREACHABLE, WI_NOP, WI_NOP, WI_I64_FROM_I32_U, WI_I64_FROM_I32_U, WI_UNREACHABLE, WI_UNREACHABLE, WI_NOP }, }; COMPILE_FUNC(cast, AstUnaryOp* cast) { @@ -1229,49 +1231,36 @@ COMPILE_FUNC(cast, AstUnaryOp* cast) { } i32 fromidx = -1, toidx = -1; - if (from->Basic.flags & Basic_Flag_Pointer) { - fromidx = 8; + if (from->Basic.flags & Basic_Flag_Pointer || from->kind == Type_Kind_Array) { + fromidx = 10; } else if (from->Basic.flags & Basic_Flag_Integer) { b32 unsign = (from->Basic.flags & Basic_Flag_Unsigned) != 0; - if (from->Basic.size == 1 && !unsign) fromidx = 0; - else if (from->Basic.size == 1 && unsign) fromidx = -1; - else if (from->Basic.size == 2 && !unsign) fromidx = 1; - else if (from->Basic.size == 2 && unsign) fromidx = -1; - else if (from->Basic.size == 4 && !unsign) fromidx = 2; - else if (from->Basic.size == 4 && unsign) fromidx = 3; - else if (from->Basic.size == 8 && !unsign) fromidx = 4; - else if (from->Basic.size == 8 && unsign) fromidx = 5; + fromidx = log2_dumb(from->Basic.size) * 2 + unsign; } else if (from->Basic.flags & Basic_Flag_Float) { - if (from->Basic.size == 4) fromidx = 6; - else if (from->Basic.size == 8) fromidx = 7; + if (from->Basic.size == 4) fromidx = 8; + else if (from->Basic.size == 8) fromidx = 9; } - if (to->Basic.flags & Basic_Flag_Pointer) { - toidx = 8; + if (to->Basic.flags & Basic_Flag_Pointer || to->kind == Type_Kind_Array) { + toidx = 10; } else if (to->Basic.flags & Basic_Flag_Integer) { b32 unsign = (to->Basic.flags & Basic_Flag_Unsigned) != 0; - if (to->Basic.size == 1 && !unsign) toidx = 0; - else if (to->Basic.size == 1 && unsign) toidx = -1; - else if (to->Basic.size == 2 && !unsign) toidx = 1; - else if (to->Basic.size == 2 && unsign) toidx = -1; - else if (to->Basic.size == 4 && !unsign) toidx = 2; - else if (to->Basic.size == 4 && unsign) toidx = 3; - else if (to->Basic.size == 8 && !unsign) toidx = 4; - else if (to->Basic.size == 8 && unsign) toidx = 5; + toidx = log2_dumb(to->Basic.size) * 2 + unsign; } else if (to->Basic.flags & Basic_Flag_Float) { - if (to->Basic.size == 4) toidx = 6; - else if (to->Basic.size == 8) toidx = 7; + if (to->Basic.size == 4) toidx = 8; + else if (to->Basic.size == 8) toidx = 9; } if (fromidx != -1 && toidx != -1) { WasmInstructionType cast_op = cast_map[fromidx][toidx]; if (cast_op == WI_UNREACHABLE) { + bh_printf("%d %d\n", fromidx, toidx); onyx_message_add(Msg_Type_Literal, cast->token->pos, "bad cast"); -- 2.25.1