From 5b1b4c3c271d7094adcbffe036b588c90d9daf43 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 25 Sep 2020 21:21:24 -0500 Subject: [PATCH] added completely variable type varargs --- .vimspector.json | 4 +- core/builtin.onyx | 5 +++ include/onyxastnodes.h | 57 +++++++++++++------------ onyx | Bin 487708 -> 492108 bytes progs/vararg_test.onyx | 28 ++++++++----- src/onyxbuiltins.c | 8 ++++ src/onyxchecker.c | 92 ++++++++++++++++++++++++----------------- src/onyxclone.c | 2 +- src/onyxparser.c | 34 +++++++++------ src/onyxsymres.c | 11 ++++- src/onyxtypes.c | 2 +- src/onyxwasm.c | 47 ++++++++++++++++++--- 12 files changed, 192 insertions(+), 98 deletions(-) diff --git a/.vimspector.json b/.vimspector.json index ea4cd749..61caceea 100644 --- a/.vimspector.json +++ b/.vimspector.json @@ -6,9 +6,9 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/onyx", - "args": ["-verbose", "progs/poly_struct.onyx"], + "args": ["-verbose", "progs/vararg_test.onyx"], "stopAtEntry": true, - "cwd": "${workspaceFolder}", + "cwd": "~/dev/onyx", "environment": [], "externalConsole": false, "MIMode": "gdb", diff --git a/core/builtin.onyx b/core/builtin.onyx index a867c8d1..92c28622 100644 --- a/core/builtin.onyx +++ b/core/builtin.onyx @@ -13,6 +13,11 @@ range :: struct { step : i32 = 1; } +vararg :: #type ^struct { + data: rawptr; + count: i32; +} + null :: cast(rawptr) 0; // --------------------------------- diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index fb6994f4..b937438f 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -155,42 +155,44 @@ typedef enum AstKind { // only 32-bits of flags to play with typedef enum AstFlags { // Top-level flags - Ast_Flag_Exported = BH_BIT(1), - Ast_Flag_Foreign = BH_BIT(2), - Ast_Flag_Const = BH_BIT(3), - Ast_Flag_Comptime = BH_BIT(4), - Ast_Flag_Private_Package = BH_BIT(5), - Ast_Flag_Private_File = BH_BIT(6), + Ast_Flag_Exported = BH_BIT(1), + Ast_Flag_Foreign = BH_BIT(2), + Ast_Flag_Const = BH_BIT(3), + Ast_Flag_Comptime = BH_BIT(4), + Ast_Flag_Private_Package = BH_BIT(5), + Ast_Flag_Private_File = BH_BIT(6), // Global flags - Ast_Flag_Global_Stack_Top = BH_BIT(7), - Ast_Flag_Global_Stack_Base = BH_BIT(8), + Ast_Flag_Global_Stack_Top = BH_BIT(7), + Ast_Flag_Global_Stack_Base = BH_BIT(8), // Function flags - Ast_Flag_Intrinsic = BH_BIT(10), - Ast_Flag_Function_Used = BH_BIT(11), + Ast_Flag_Intrinsic = BH_BIT(10), + Ast_Flag_Function_Used = BH_BIT(11), // Expression flags - Ast_Flag_Expr_Ignored = BH_BIT(13), - Ast_Flag_Param_Use = BH_BIT(14), - Ast_Flag_Address_Taken = BH_BIT(15), + Ast_Flag_Expr_Ignored = BH_BIT(13), + Ast_Flag_Param_Use = BH_BIT(14), + Ast_Flag_Address_Taken = BH_BIT(15), // Type flags - Ast_Flag_Type_Is_Resolved = BH_BIT(16), + Ast_Flag_Type_Is_Resolved = BH_BIT(16), // Enum flags - Ast_Flag_Enum_Is_Flags = BH_BIT(17), + Ast_Flag_Enum_Is_Flags = BH_BIT(17), // Struct flags - Ast_Flag_Struct_Is_Union = BH_BIT(18), + Ast_Flag_Struct_Is_Union = BH_BIT(18), - Ast_Flag_No_Clone = BH_BIT(19), + Ast_Flag_No_Clone = BH_BIT(19), - Ast_Flag_Cannot_Take_Addr = BH_BIT(20), + Ast_Flag_Cannot_Take_Addr = BH_BIT(20), - Ast_Flag_Arg_Is_VarArg = BH_BIT(21), + Ast_Flag_Arg_Is_VarArg = BH_BIT(21), - Ast_Flag_Struct_Mem_Used = BH_BIT(22), + Ast_Flag_Arg_Is_Untyped_VarArg = BH_BIT(22), + + Ast_Flag_Struct_Mem_Used = BH_BIT(23), } AstFlags; typedef enum UnaryOp { @@ -404,6 +406,12 @@ typedef enum ParamPassType { Param_Pass_By_Implicit_Pointer, } ParamPassType; +typedef enum VarArgKind { + VA_Kind_Not_VA, + VA_Kind_Typed, + VA_Kind_Untyped, +} VarArgKind; + // Base Nodes #define AstNode_base \ AstKind kind; \ @@ -616,12 +624,7 @@ struct AstParam { AstLocal *local; AstTyped *default_value; - // HACK: There is a little too much complexity here. If a parameter is - // a vararg, not only is the flag below set, but the type_node of the - // local is also a AstVarArgType. I think this redudancy should be able - // to be cleaned up. -brendanfh 2020/09/07 - - b32 is_vararg : 1; + VarArgKind vararg_kind; }; struct AstFunction { AstTyped_base; @@ -751,6 +754,8 @@ extern AstGlobal builtin_stack_top; extern AstType *builtin_string_type; extern AstType *builtin_range_type; extern Type *builtin_range_type_type; +extern AstType *builtin_vararg_type; +extern Type *builtin_vararg_type_type; typedef struct BuiltinSymbol { char* package; diff --git a/onyx b/onyx index 2579a91eb8674956fb5d1e13956a91bd4dfd259b..730b313e12ee5142c888724334bab81dcc50d37b 100755 GIT binary patch delta 87001 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

~wj*k4 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 delta 85069 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 z ze)Ut>Pjb;09k9*!%oJMR5f<4)s9oTzke}*RqOo1ql_y1=)h@|dSxVKhSxYu_C-u@PhFTuqF`5=%b^(cQt2XTZ*| z@R#WaaE|s*2T>Ns#$PyyPUt1umJpTD4U8@!>R`F_s}f=;jx{-%#E`%XuWl7To<- zI*alc1MYJcbO7a^v#5nxoW(`dpi^liur*6!mP{pqS74C9sK8ZNT*IiyRmBY)rdm4= z6LoVHAr4!g;PqO4@k&wYDq17lKU_t1*G{qd*6+nCYme^F@GiNgDrZNdlF%PaaucB* zzXn&Kak}^RUl&1Q<%rg^6n^aM|a_dlNepyMb$9< zYr*;L&jZE6Z+xMmcsV3Lm z(Bb9wz~Iu~121FS+b>A|;UN5+0-sRXx4x3@D9?T?{Ank}1J$_HO5_|LM-D}vS}brt z^a=8nr|_>j9D4mr;rr?JO)HtalmAHVs7=Og)#+%DlrNp=BlAo6n$wsHN z1TT?bq$QOy!Vfosst{$%-9z;HH{GKs8TfsLh7ql>moI$kSE1CA^Gw?c1PhCkKsB?l zAw%qRQg^ZeZR8mb>XbpS5l(L0f7@P`o$ z6?#?|`OsTfX;aBZl-D*sQa&w_dKKDT*!g(`agnm&DAc2#|zNm-Ea*r>X zD4K$=2*SevuYHBD*7Tu_Y=*v~Pbb`H{wQ~Yfp2f&4NqubFM*-xQ@-sy=6rL zor`GZhi(8Jjh~1J*n3;$GMBP-2CuD=+mrQTJMV}ru=rO;nF3QUGfx<(3 zo}*{`Y>xcHU-)Qqa#Yk9Xq^ibjkVAm6$5q*xyt)t!d3oK0X626TY8bUlVvL+3ATUrB&4P-sVJ}%6C)pm zh%n9jA6<>ZH1Xdd{K z4r(dJSJNts3bb2N8Py#_smdY}=VOeaBE+@aRRoaKI-V-&FS2&1=*&@i+X^x9zv6T^)#q-^ySd&&-HzMHbcneUcMB-&k#a1rd9 z`nn?IC6sdTort*=*^$9UKKRbtFl)W5rRS7 z3~1?TEs!?#Pdy?uSyi1o$mUgHi}OHLMZ+N{{wRL2zaky3f8h%78R=TQtDE|N>|#lW zZ?+cpi?feaagDED*NX~^cGbi_&4Ce9$?9k%$FAuYb+24p9aVYuMFhcZe=}X+LKk)O zH7>g9;xvwhTOv^6*f*^q8q>`arRZC~bDEX=`#s|}6rFwV=*sF`O zT|E)*)a(+Ky}A|Gs3&}l+vW0l7=YsaJM~3vqeoiH`r-=*%o=}dgwfUaP+wEjn|_mValY3tPBLAbL8q1fGLKHdW0A&z$0i~%BHnRIk7BL- zIuc`ZH0&1Wv7VjO8wF;BEkr&4T{e5lFJh!nxKUh`yIP2b*0HtoM^>@w7Y|R5w_9); ziK0C6qIWd>tMvtaQl49d`WDPO@@=x*-!-^c%;5eBq(IrzT^hrW6In-OY)kQvHt_@w zh-qGFF|9<~5)Kn91<8d?wP0)aNx@+Sm;p$PnFB_Hk2jA060-Tau}?-OG7d`h9V-&iJ7G;OaFjNZsQ! z6&!}K^mb`SENR&gI{x7b(}>ceqp0ojdxHY|<+5`};ct!lu6X1ZE&1UuvD@@=NV?SHB zzqJJj1-JcRH3^FxTX8@j?UJ52_45?=im78nHE4gUHT2AGCW zf$6gb(|Z*WkeWj_Qoo8!XRE;nrn6DBiix-8>Wi89;!3A3qN2;TIt7W3l{31agl?73 zPu4WMTSK|Mi|Fm=1C8ENGO_2Ag{l~};2h0Vp2@(jVxa4Fs^=;t7lPGvuga2L=%Vx& z>)O;ToaWI%if$!(Nr+LfBp7_Yc!|u3WR*=CTh!z+>4gLW0;q>hk&fHveT;)X8 z$8yaFVlp=CynBdoSl3(7L#%Wt^$oU4D&jeI1QLl`>&%{F4D}v8#c=KAcG<6&sG+5A zl^)+|zH(D9;qJVd3QA>mt+e$L0dCLq)TUBuU+t22dtsE0IC_gJuH_1BJ2+{fYviE(^+YH#BnZY9oIBx_;P)CUVD_hrvMBG6&yW`q3mA=Yta zA7rDV^z4fs?y?-y7b%`7|LTkU*OeY0ibHNEJk{k@Bf+fS<@FCml$*7%Znmt|PwaNP z=uyZH%g+5o_ZCxhoqn&;L-_D(RKC(w`I1a=g}tn`iqWk!G(2~efx516bUVJXM^~n>moMOe=*kz?#gnmGs!uYNEbM@mF2Ye##5F>$A1J&WZ*EnDV+uqkbQ+-3 zcAa8$`urW5sME)~TVI{xbc)nzp(31b%NU3nGtdj^RJE(8mtJFh(gFsFc1CR24EspT z)H-}A2M!Tovh-ka06oqxgR!XbtBe^U))_z8H&pa8R&y#@IID#Vb{3V@Khzqy7-oJ& zcl*+wNv2;N3tbwQHKg`Q`!QCyX#QzPlypiKDu}Er za%seH-?Vzeg{!f|`E^+EF^<5V#lR8bixM>m*Z0Ak%WI@Kj)SsSM~cD5XZT71TJ0q{ zbCmG$-o6%PjU|@ss(N>)R$?~Gon%s1=8nQDT5D+;Exz}iw8mh#a}hlvMlkk8n?0*! z?oneI%@i)3$6(p>s2n#2Uf0XLV=yq-BJYh6fu(z`MkH#>MWo zU7ukzlJ9a=PK^`Gwa1^!spCa8oT+UwR-D2~3FmQQf_BU-UB-y6^3pi5vGStNRNB+w z6CZ%U#>U(VdIj@+V?n04f?byDJ`qf~JCJws4k?#bGmeg2kQ$*uBmEQ?Z=*FdV<9AbO(%qir;S-}%u(W+u4xEbN-MT5l z?06{8LfI-IZIeZ5{|!1}1Xd^=oXL6euPMT(?r7bF7Dthr>|Y_Np!6uZz_C~!n;_nU zlSNs7i|+OR=CTB(shpPeR?e6z{IoM~{FLBR~bLxhur zUl}zF51vo2a=weSskJjNS!$a2p4#~|+*MrU%V}a-*@2I#F160g?uPKyau4}PGIf@V zrwboEYqV)PI*NWts%^`rGq8vjj*r2OM&ZTH5QlMoA;OBz4Y+L5j-BwpFkbFmB_EdM4Y8t6PUev^!zCn{<8=Sq)7=T&J%S@Sgq)CYVN~P_h$34e)@Kz95!D(#YR&91S|-?oh{EV5S8SY3BnzlEISjh zsDE1ioFMLK&8%`j0?PAOnXv#xFk=?J+AhlB*^`P3#UmQ3Bx1p)mu#9SqS_qAMMd-0 zJKLIzsrprV(JgM^eGAv>|luwq4AB?rr z_AD2jjaV4eR$!%nqwKN*ec=!pze3b^6iu~@BT(Z5N0sFmMX`}V;eCpt|nh>#8~ey z+2d=m6le2tzQ$d1pX|H|CAcYV-6r&o@UefhXy&-1f8nUG5bi4f+ky6-EkE3Xn^p~3 zX{-1Q=hgRZ6{~QfqsumN7Nr;X4aV5t;dGxkM04itVkVM)e!Dp8Z2N%k{uS`)^lwCY zd2olAta%KOpMN95Wz0^o31|MyyTm-Sp2fRF9var-RAiuue3>e~!P9DA@5UBhY_w{T zY0r0y$3}-foeXkkJA8^LW`b~&)y82jB5*HS_AS|YFIED#$;7?LAMW*g#cFKMFZvF5 zJiJI~pYU;b|9!hxpR~^VaP6^V`$?LJ)rPm1E#{-<<)&eOuDkS1#~PWZtdlNQpp~9Y z7wfg-QL@E;bTMbY7cTO%{h|j}=5FoBL(aG5j03R7qaz0}QkbPvb14oAtM*qHX+40s z<(jmu2XTGSJ52pSyf4;vM&Iizcbw5I#-3^Se?Yy#4u6HixJ-NH%)_D)-h}!6VG)lP zbT_r(#*MZSbU07jTC)1wc(R!s(a;MHeBUk>Gh+iQQ=Xfx`H+}ewgD*X0!w_ zJIgoQ8<2G*(m>C|l#x?@#2h6$QttXmRCY*mT_in@h+v0D%?&bUHYPODM{uD=G|zWV zlTVL`A>Q3~Sr9Fn^xR%*W=P#u)&v=MRCMruwlm+2w(@8g3b)eo{87=|xLJB06Q%LQ zYo%kNhj+6A%SgLrH@W1PXy)^HM}8;`>~49@j61t&!~c6MD(K{-SAJcTORU(P=T%lY!qDQs@|$bi$Lw!_8x271iHM}5C>*d=rU z3r~xMnx#Gtl!;J@k2r?Iojyxl_;?$4#SrK1$aTArr7wXeV`Q143 zF;VV1i_|5`(-0*xni~vDZw&R8Z_lDpxXVW8M2F@_?;>Lb-Ta*^s6CB0LS^4>^M^MY zdCsBXPj*jBk8}LCk_9QR(qe)1STy zRI|9}ZL-QQA{~#Y{PT+lEz{%<`Lp3VVHk{G6!9?`lp(yEc;*y~cp*}l-H}39!*F~% zEyD>38-WHS;k|lV>wT z7q|24RY-dF7s#sTQ9a`1g!9-*+7>}R_4S8Na`So7%+0^B^%42_JUXZyveyL+V6bLz z0qf*b<*Ey4#GlG@7sMG%a8_Rw9m}4nj*xKo)YmpCP@Z+?^#lJG`unZ=)nQgveiVFmD@mRU~PRD(fEbInnpUnM$yAQ?}TkICo8) z(^iD&?&q$H_wnk^a({^44yhFla%#4TgW2~7f_Yd$H=FP$;+>7DQFdi~Y%kqOkGCXl zF)el?jdlM*8rui!w&gPs<@F$#x#&^G%0rom5)XN(JRG`#C>u%Vn~2gDi083(BZL_@ z5dxZ#Afkx*Ze#i+LogwQ(`TJwh$>EKwVQH7EzVhcB?CB18f?Lyv zu9W;5OI@#d$g)pG^OCP|O`;M_|IU^JpJJqb5ZC)QhD$M5Fnk>#k3U70Q=IiIAActL zIM%^_4D9`7=yNR6-E$(RigNmMG~^oc_;XQH>*p%hzrxgt*RH~*TI|JHboLR&p%~JSGTY--+egPPS`>(L<*h?n863yLGCKd8|ORV>x0;p(C z9sM9`!M{;6@1|fT8ns|LrdShlv!3AVVqx(3>DQta-tg7yHKuYlx$L#5>Q;L^9P;buEqs$je9*#%N|^mAN?hGQXvxkLHL;Lc zgd5y@zT@7xuzR!|@dbvA#U_M);-Wz7bb6E$f42r_I$#yfXiY z1tJ^ehs6Ue0C;=Gt7>}8Hx{(J8B7Dl%#kMu@iBs;%&sJ zsd$Zs;tj;=ew3`3;v42l?(xLdkR_x*CJotf%3vX}J8_KSS;Vxqo*k`t3NdntFCr-( zM_h_HLh*27FJg<`o$fW+9(H#hVguNk7oq|{`^B3uamUOHQ3256Uv{Qq6=5K8hGJ!J zA-37=gNRcV526GF6Vr2#c_E5v3okp_&bX(b1l}V4ypTTRp)x7rl!4+f;uytU$vvDn z+RjypBNewN_iDruidz!nR*Mo)+=#dav4`SX#JK091l}V4ypV8G)FeeNJ`9!@5=>l+ zI8(77ac$xZ#ifYr5Ze?x5!WS7Rjd)$BTiBLYAm=uakAn^#0`k!txAzY3JhdW0*Y@E zHzJNve3cjjWt4#83&a>zq68G5CZ@4pc7)<1#2DhC1QZ`2#y}Azpm+~)B(c??6x&GA zf)u&+1=X`rz%zvyic5>ScOl+zU*YX|4v|QcD!8? zO$Kp_RfJuLV-zo;1au{iR=kk78*!xKS;XCmBNR^|{(#t`cpPyLVh=m_Lj0%%N->-a zdXqsezRrePOWcQ;K6QsmO5B$?LvdH)4~cDx+Y|RAPF38JxIb}<;zq;+h?5o9B91}) zs02z8PKtqK5T`hpco1=nVn5=Kh@%ykBE~`kNT zhvF$<>#)hBFet@1GMGY~`;tmvIPp~COvQtUrx9l;?n6AC*rvEE@eJZr#qEhz38yG- zNgPk^$%-4rS*(U(Gf5Gz6t&1;7IB>7aN^m-F^YqU=MYCL_9LE49I3bz@jT)P#ZJWY zi7kpX;sjz3#jnO#p;$l)11rFZ#JMl11Rjk6FCxxVoI{*MoT2z8@nT||;;Y1;5vMA? zK%7jRqWCoN=fug1k61~ugcR{gae#O!ah&2k#9t7{DBecAj5u2H2IA$!k&0IlOX3K{ zONdtxTkO1w*h8^(AsMVDg+VE15w9W6#h04%LZ%R}CC*elj`&OB48_BV*Ad$k4 zPPOv};uOVw$o(tgWMXSbS5j;wMZ7X-Py97;oZ^N|kM!b_aQ}L_O;9bNSiXRcD z65AB#5bq{VReY0p4{?f}_Yx;RL;QImSIOWzQp78R3&i_~Cmk^&MPEov&_!M!nRVikX;xsAZ6;C1lnK(}IIN~$JF^Y#1pCyh~ zJc#%lairot#J>42l~OUnI`OSElkpY7t)|&Qu&u z{3~&W;$Y&-#5To##J>@zDlSEQg*ZjA6Y=k0Yj(0yXr#DG2JwntjRIdIj#K=I_&RZn z;vC{Xh@%zXB>s~)Qt?&dzlb9gUm(sTwkSSLd_&#;J(S`IDQ=R1LGc0Nzln44EiBXl z;(v%U6>lT{mpDW52I5=9HpQ!mZxg2~UP7EjoT7LkakjeuCo9D)Qsj_9yy7XucZlN@ zk0ZWI9HV$R@jc>b#e<0N6GtlUL;Qd^!p;wgEsDF6`y+LC@~|tOkbyyQdop-RocoAM zpe6A$;!MSjh@TT@D6U2Pg4m`wocJYis^VbcSHvk`NcyuHA`G$WS1XpiS&n2mp5;`Q z@hs=CoX>I*%cU$=v0Tq`6U(hEcPfee?`1_g%R?+rusp}|GRx~M|6+NIcF8Pohc&ECQxt7Pob^I=#>8g9nk{dD{n?PKKDb-9==e&E~btowZW-qO5#XeqL?~`)Q-i}8Kib8s$O0e zT92Yy8A0mO#ndsR_ARDPCUsyjwT;vv#nic^u2M{G@q@Z%F?BSl>lahUle%d!btD7V!l#f<{4=A@r+}&qoZyI>d+nvm}t66VSga2bUjO||J+tsc$sgB*w zYRHc`nGHir>IwL`UY$v`?1lw)>1@}F?S{S^V1ZpG+a=`N{on9H3>;Mz($i`w2ppp@_pI_K;dc zKaKTQis<86Z{T{BpP)Ic4=tikV12aG(_M!D7O}&mA|8@ikMdNOl6eiw7p&jFyqTqi z>%|V{JuIVGpH58i|G*A$>~NI%B+C`7KgWELrH%E!Gylmli}imq-(i`-b>IcFp>(W) z>Yc&hsaHI7Y^m1xAU&JhehrJ5HDzfqtYCIvPGK&=yoK4s{4KL!KFF-cY%m;QcGTUi zhSRJl$sR5+J278nc4ofGOs#|d?l8ORXn4Zx#{8Puow-D?o?#EgxFGJV@MHrY=2FZ7 z%wEium`gKPXU^}*>M?t>doyMq=C;hf#8e@oSy7e^dNG${9>`ptc?7dR^91Gq=9$cX z%nO+VnU^qIz!bk>6)S=W@VA*cSVzMy=8DYe%;@CQ-x20Y%x9P@Ghbn@z?u>1@i>vHOv#4zh?fFd2fDzlUQ+x4JI?6WS+wO8}n4=Tg=m#pD<5nE?HU6 z;0)#fX1&}||3X<2&jxjvXEH}J&th)RJe#=>^Bm^k%yXH?GtXn5!#rPStKkb)B(OmW z^8)7W%nO;*nG>0hF)w01&z!`3jd?Nizs#R0MmaoTMKT*Wgz821IkPA866Q+GOPL!p zf5F_1c^UIa=H<+Dm?be?hqbI&!3LX|S2BOgyo&iS^J?Z(%xjo`XI{&k&HN?vW9D^W zRSz7(^c<(Kffw_7W`E`l%wf!5G1q0@$lQYYYvzv3o0$7BZ|3+7gITeK4MsC>WuDHw zjd>CCH_WS;w=?fy-ogAc^G@c!nRn^=HyB>CB9#q9xLzW=nM*P6VGdyamN}GpFLN#C z@0gn~?_-W)PE+L%Wp`Gjvq22=e&&(P2bd=^A7qYa{+@Xe^AF4`m=7^;V74A+#dcQM znD;UN$ZTUi!hD+fDD$t($C&?O{)su8`8e}qovnrwta!r)Cz;Jv^h(vSmv=bwd916q(KeeEF?yBw>RF%Qc_d+9;!lbJWdu7e>=0Lm-sSAW>)#|#dBfBQZnd8ls9kK?+ zreUS-zBz5{G;=E>&gk8nZm!|E*H^dR>#Lh5%W5;A&X3}~P+grRN0B-|?5fpub%NXh zbtzkGJrG-KUHx#Yyg$QS-FfeWHcGMg0UqJAn(I2JvmzaeSW?(>bqiarkef+yofX%i zxJ`;&R^;XiwWQu8-fStRoc8~e-xpEh0Wfo2&*-;9RhpvT3ME&_YBS9>oKQRpvj)kb yGtKo%C48iF!bfJM&o#@PGtJdKCymhclSb(JIJ~yrT)$*Ku9q{1o4shs-{pU%CIJWl diff --git a/progs/vararg_test.onyx b/progs/vararg_test.onyx index 6d391825..7fd5e44e 100644 --- a/progs/vararg_test.onyx +++ b/progs/vararg_test.onyx @@ -8,23 +8,31 @@ old_va_test :: proc (prefix: string, va: ..i32) { for v: va do println(v); } -vararg_get :: proc (va: ^rawptr, ret: ^$T) { - *ret = *cast(^T) *va; - *va = cast(rawptr) (cast(^u8) *va + sizeof T); +vararg_get :: proc (va: vararg, ret: ^$T) { + *ret = *cast(^T) va.data; + va.data = cast(rawptr) (cast(^u8) va.data + sizeof T); + // *va = cast(rawptr) (cast(^u8) *va + sizeof T); } // va is just a rawptr with no bounds checking new_va_test :: proc (prefix: string, va: ...) { - println(string); - - x : i32; - vararg_get(^va, ^x); - - println(x); + println(prefix); + + for i: 0 .. 2 { + x : i32; + vararg_get(va, ^x); + println(x); + } + + for i: 0 .. 2 { + x : f32; + vararg_get(va, ^x); + println(x); + } } main :: proc (args: [] cstring) { - va_test("foo", 1, 2, 3, 4); + new_va_test("foo", 1, 2, 3.0f, 5.0f); } // Things needed to make the above work" diff --git a/src/onyxbuiltins.c b/src/onyxbuiltins.c index 0869e6cd..965a7c77 100644 --- a/src/onyxbuiltins.c +++ b/src/onyxbuiltins.c @@ -37,6 +37,8 @@ AstGlobal builtin_stack_top = { Ast_Kind_Global, Ast_Flag_Const | Ast_Flag_Glo AstType *builtin_string_type; AstType *builtin_range_type; Type *builtin_range_type_type; +AstType *builtin_vararg_type; +Type *builtin_vararg_type_type; const BuiltinSymbol builtin_symbols[] = { { NULL, "void", (AstNode *) &basic_type_void }, @@ -345,6 +347,12 @@ void initialize_builtins(bh_allocator a, ProgramInfo* prog) { return; } + builtin_vararg_type = (AstType *) symbol_raw_resolve(p->scope, "vararg"); + if (builtin_range_type == NULL) { + onyx_report_error((OnyxFilePos) { 0 }, "'vararg' struct not found in builtin package."); + return; + } + bh_table_init(global_heap_allocator, intrinsic_table, 128); diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 5f9940ae..815ee18c 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -320,16 +320,6 @@ b32 check_call(AstCall* call) { return 1; } - // NOTE: This restricts you to only passing simple structures as parameters. - // At one point in time it was okay, but there are some necessary complexities. - // if (type_is_structlike_strict(actual->value->type)) { - // if (!type_structlike_is_simple(actual->value->type)) { - // onyx_report_error(actual->token->pos, - // "Can only pass simple structs as parameters (no nested structures). passing by pointer is the only way for now."); - // return 1; - // } - // } - if (actual->value->kind == Ast_Kind_Polymorphic_Proc) has_polymorphic_args = 1; @@ -440,45 +430,71 @@ b32 check_call(AstCall* call) { Type* variadic_type = NULL; AstParam* variadic_param = NULL; + i32 arg_state = 0; + i32 arg_pos = 0; while (1) { if (actual == NULL) break; - if (arg_pos >= callee->type->Function.param_count && variadic_type == NULL) break; - if (variadic_type == NULL && formal_params[arg_pos]->kind == Type_Kind_VarArgs) { - variadic_type = formal_params[arg_pos]->VarArgs.ptr_to_data->Pointer.elem; - variadic_param = &callee->params[arg_pos]; - } + switch (arg_state) { + case 0: { + if (arg_pos >= callee->type->Function.param_count) goto type_checking_done; + + if (formal_params[arg_pos]->kind == Type_Kind_VarArgs) { + variadic_type = formal_params[arg_pos]->VarArgs.ptr_to_data->Pointer.elem; + variadic_param = &callee->params[arg_pos]; + arg_state = 1; + continue; + } + + if (formal_params[arg_pos] == builtin_vararg_type_type) { + arg_state = 2; + continue; + } + + if (!type_check_or_auto_cast(actual->value, formal_params[arg_pos])) { + onyx_report_error(actual->token->pos, + "The function '%b' expects a value of type '%s' for %d%s parameter, got '%s'.", + callee->token->text, callee->token->length, + type_get_name(formal_params[arg_pos]), + arg_pos + 1, + bh_num_suffix(arg_pos + 1), + type_get_name(actual->value->type)); + return 1; + } - if (variadic_type != NULL) { - if (!type_check_or_auto_cast(actual->value, variadic_type)) { - onyx_report_error(actual->token->pos, - "The function '%b' expects a value of type '%s' for the variadic parameter, '%b', got '%s'.", - callee->token->text, callee->token->length, - type_get_name(variadic_type), - variadic_param->local->token->text, - variadic_param->local->token->length, - type_get_name(actual->value->type)); - return 1; + break; } - actual->flags |= Ast_Flag_Arg_Is_VarArg; + case 1: { + if (!type_check_or_auto_cast(actual->value, variadic_type)) { + onyx_report_error(actual->token->pos, + "The function '%b' expects a value of type '%s' for the variadic parameter, '%b', got '%s'.", + callee->token->text, callee->token->length, + type_get_name(variadic_type), + variadic_param->local->token->text, + variadic_param->local->token->length, + type_get_name(actual->value->type)); + return 1; + } + + actual->flags |= Ast_Flag_Arg_Is_VarArg; + break; + } - } else if (!type_check_or_auto_cast(actual->value, formal_params[arg_pos])) { - onyx_report_error(actual->token->pos, - "The function '%b' expects a value of type '%s' for %d%s parameter, got '%s'.", - callee->token->text, callee->token->length, - type_get_name(formal_params[arg_pos]), - arg_pos + 1, - bh_num_suffix(arg_pos + 1), - type_get_name(actual->value->type)); - return 1; + case 2: { + // Untyped varargs + actual->flags |= Ast_Flag_Arg_Is_Untyped_VarArg; + break; + } } arg_pos++; actual = (AstArgument *) actual->next; } +type_checking_done: + if (arg_pos < callee->type->Function.param_count) { onyx_report_error(call->token->pos, "Too few arguments to function call."); return 1; @@ -1295,13 +1311,13 @@ b32 check_function_header(AstFunction* func) { return 1; } - if (has_had_varargs && param->is_vararg) { + if (has_had_varargs && param->vararg_kind != VA_Kind_Not_VA) { onyx_report_error(local->token->pos, "Can only have one param that is of variable argument type."); return 1; } - if (has_had_varargs && !param->is_vararg) { + if (has_had_varargs && param->vararg_kind != VA_Kind_Not_VA) { onyx_report_error(local->token->pos, "Variable arguments must be last in parameter list"); return 1; @@ -1316,7 +1332,7 @@ b32 check_function_header(AstFunction* func) { return 1; } - if (param->is_vararg) has_had_varargs = 1; + if (param->vararg_kind != VA_Kind_Not_VA) has_had_varargs = 1; if (local->type->kind != Type_Kind_Array && type_size_of(local->type) == 0) { diff --git a/src/onyxclone.c b/src/onyxclone.c index a4e95d97..d1b7ffb7 100644 --- a/src/onyxclone.c +++ b/src/onyxclone.c @@ -342,7 +342,7 @@ AstNode* ast_clone(bh_allocator a, void* n) { AstParam new_param; new_param.local = (AstLocal *) ast_clone(a, param->local); new_param.default_value = (AstTyped *) ast_clone(a, param->default_value); - new_param.is_vararg = param->is_vararg; + new_param.vararg_kind = param->vararg_kind; bh_arr_push(df->params, new_param); } diff --git a/src/onyxparser.c b/src/onyxparser.c index 82e75940..a8180c3e 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -1507,6 +1507,7 @@ static void parse_function_params(OnyxParser* parser, AstFunction* func) { symbol = expect_token(parser, Token_Type_Symbol); expect_token(parser, ':'); + curr_param.vararg_kind = VA_Kind_Not_VA; curr_param.local = make_node(AstLocal, Ast_Kind_Param); curr_param.local->token = symbol; curr_param.local->flags |= Ast_Flag_Const; @@ -1519,29 +1520,36 @@ static void parse_function_params(OnyxParser* parser, AstFunction* func) { if (parser->curr->type != '=') { if (parser->curr->type == Token_Type_Dot_Dot) { consume_token(parser); - curr_param.is_vararg = 1; - } - - i32 old_len = bh_arr_length(*parser->polymorph_context.poly_params); - curr_param.local->type_node = parse_type(parser); + curr_param.vararg_kind = VA_Kind_Typed; - i32 new_len = bh_arr_length(*parser->polymorph_context.poly_params); - i32 new_poly_params = new_len - old_len; + if (parser->curr->type == '.') { + consume_token(parser); + curr_param.vararg_kind = VA_Kind_Untyped; + } + } - if (curr_param.is_vararg) { - AstVarArgType* va_type = make_node(AstVarArgType, Ast_Kind_VarArg_Type); - va_type->elem = curr_param.local->type_node; - va_type->token = curr_param.local->type_node->token; - curr_param.local->type_node = (AstType *) va_type; + i32 old_len = 0, new_len = 0; + if (curr_param.vararg_kind != VA_Kind_Untyped) { + old_len = bh_arr_length(*parser->polymorph_context.poly_params); + curr_param.local->type_node = parse_type(parser); + new_len = bh_arr_length(*parser->polymorph_context.poly_params); + + if (curr_param.vararg_kind == VA_Kind_Typed) { + AstVarArgType* va_type = make_node(AstVarArgType, Ast_Kind_VarArg_Type); + va_type->elem = curr_param.local->type_node; + va_type->token = curr_param.local->type_node->token; + curr_param.local->type_node = (AstType *) va_type; + } } + i32 new_poly_params = new_len - old_len; fori (i, 0, new_poly_params) { (*parser->polymorph_context.poly_params)[old_len + i].type_expr = curr_param.local->type_node; (*parser->polymorph_context.poly_params)[old_len + i].idx = param_idx; } } - if (parser->curr->type == '=') { + if (parser->curr->type == '=' && curr_param.vararg_kind == VA_Kind_Not_VA) { consume_token(parser); curr_param.default_value = parse_expression(parser); diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 7abad056..7add1d58 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -582,7 +582,7 @@ void symres_function(AstFunction* func) { bh_arr_each(AstParam, param, func->params) { if (param->local->type_node != NULL) { param->local->type_node = symres_type(param->local->type_node); - param->local->type = type_build_from_ast(semstate.allocator, param->local->type_node); + param->local->type = type_build_from_ast(semstate.node_allocator, param->local->type_node); if (param->default_value != NULL) { if (!types_are_compatible(param->local->type, param->default_value->type)) { @@ -593,8 +593,15 @@ void symres_function(AstFunction* func) { return; } } - } else { + + } else if (param->default_value != NULL) { param->local->type = param->default_value->type; + + } else if (param->vararg_kind == VA_Kind_Untyped) { + // HACK + builtin_vararg_type_type = type_build_from_ast(semstate.node_allocator, builtin_vararg_type); + + param->local->type = builtin_vararg_type_type; } if (param->local->type == NULL) { diff --git a/src/onyxtypes.c b/src/onyxtypes.c index 8d961b08..f18a4d0d 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -474,7 +474,7 @@ Type* type_build_function_type(bh_allocator alloc, AstFunction* func) { if (param_count > 0) { i32 i = 0; bh_arr_each(AstParam, param, func->params) { - if (param->default_value == NULL && !param->is_vararg) + if (param->default_value == NULL && param->vararg_kind == VA_Kind_Not_VA) func_type->Function.needed_param_count++; func_type->Function.params[i++] = param->local->type; } diff --git a/src/onyxwasm.c b/src/onyxwasm.c index f98edce5..83dee10f 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -1325,6 +1325,8 @@ EMIT_FUNC(call, AstCall* call) { u64 stack_top_idx = bh_imap_get(&mod->index_map, (u64) &builtin_stack_top); u32 vararg_count = 0; + u32 vararg_offset = -1; + VarArgKind vararg_type = VA_Kind_Not_VA; for (AstArgument *arg = call->arguments; arg != NULL; @@ -1333,7 +1335,16 @@ EMIT_FUNC(call, AstCall* call) { b32 place_on_stack = 0; b32 arg_is_struct = type_is_structlike(arg->value->type); - if (arg->flags & Ast_Flag_Arg_Is_VarArg) place_on_stack = 1; + if (arg->flags & Ast_Flag_Arg_Is_VarArg) { + vararg_type = VA_Kind_Typed; + if (vararg_offset == -1) vararg_offset = stack_grow_amm; + place_on_stack = 1; + } + if (arg->flags & Ast_Flag_Arg_Is_Untyped_VarArg) { + vararg_type = VA_Kind_Untyped; + if (vararg_offset == -1) vararg_offset = stack_grow_amm; + place_on_stack = 1; + } if (type_get_param_pass(arg->value->type) == Param_Pass_By_Implicit_Pointer) place_on_stack = 1; if (place_on_stack && !arg_is_struct) WID(WI_GLOBAL_GET, stack_top_idx); @@ -1344,7 +1355,7 @@ EMIT_FUNC(call, AstCall* call) { if (arg_is_struct) WID(WI_GLOBAL_GET, stack_top_idx); emit_store_instruction(mod, &code, arg->value->type, stack_grow_amm); - if (arg->flags & Ast_Flag_Arg_Is_VarArg) vararg_count += 1; + if (vararg_type != VA_Kind_Not_VA) vararg_count += 1; else { WID(WI_GLOBAL_GET, stack_top_idx); WID(WI_I32_CONST, stack_grow_amm); @@ -1355,9 +1366,35 @@ EMIT_FUNC(call, AstCall* call) { } } - if (vararg_count > 0) { - WID(WI_GLOBAL_GET, stack_top_idx); - WID(WI_I32_CONST, vararg_count); + if (vararg_type != VA_Kind_Not_VA) { + switch (vararg_type) { + case VA_Kind_Typed: { + WID(WI_GLOBAL_GET, vararg_offset); + WID(WI_I32_CONST, vararg_count); + break; + } + + case VA_Kind_Untyped: { + WID(WI_GLOBAL_GET, stack_top_idx); + WID(WI_GLOBAL_GET, stack_top_idx); + WID(WI_I32_CONST, vararg_offset); + WI(WI_I32_ADD); + emit_store_instruction(mod, &code, &basic_types[Basic_Kind_I32], stack_grow_amm); + + WID(WI_GLOBAL_GET, stack_top_idx); + WID(WI_I32_CONST, vararg_count); + emit_store_instruction(mod, &code, &basic_types[Basic_Kind_I32], stack_grow_amm + 4); + + WID(WI_GLOBAL_GET, stack_top_idx); + WID(WI_I32_CONST, stack_grow_amm); + WI(WI_I32_ADD); + + stack_grow_amm += 8; + break; + } + + default: break; + } } CallingConvention cc = type_function_get_cc(call->callee->type); -- 2.25.1