From 51a37d1e47c4ce2deab1b570d504bdde21c24adc Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 12 Dec 2021 21:21:07 -0600 Subject: [PATCH] dynamic strings in include statements --- include/astnodes.h | 2 +- modules/glfw3/onyx_glfw3.so | Bin 80360 -> 80360 bytes modules/opengles/onyx_opengles.so | Bin 232808 -> 232808 bytes src/entities.c | 2 -- src/onyx.c | 2 +- src/symres.c | 25 +++++++++++++++++++++++++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/astnodes.h b/include/astnodes.h index ac9499a4..7690e5a9 100644 --- a/include/astnodes.h +++ b/include/astnodes.h @@ -955,7 +955,7 @@ struct AstDistinctType { // Top level nodes struct AstBinding { AstTyped_base; AstNode* node; }; struct AstAlias { AstTyped_base; AstTyped* alias; }; -struct AstInclude { AstNode_base; AstNode* name_node; char* name; }; +struct AstInclude { AstNode_base; AstTyped* name_node; char* name; }; struct AstMemRes { AstTyped_base; u64 addr; diff --git a/modules/glfw3/onyx_glfw3.so b/modules/glfw3/onyx_glfw3.so index 8b87e8c11431637f9a85e41c41cc7b48503b4c35..f41064aa2453daa874cc96e54dc8504913ed0b44 100755 GIT binary patch delta 428 zcmaFyndQZ2mJKhML=4ZaZcAwG)_KFCX`y#N-+TI*jAfhuFf9mXjF>z(tN}>Mg?9kS z<>51cq(ej_kUSJo4J7R%n?dZzc1DNEUQuQo0Uq5I9RCA6CU-<_1PWP2BMDVRgM_qV zkc2W~KtfWnNJ0^@AR(?eBq5JDkkBt=A&YpB(5rYPRT>EwL8=l|fuusBCy>la1hFS1 z`U1&&i5ftXJqbh_B&h?*h@?Ouxhe^y=0ehGAUP-507#xqehVabr}zU&?$lUDhs~L( z$&4V0G?3`5TfAW0oaMkECS$yG@pH5Zaj1Ianb20-#`@>?LeJH;PJa;L^JN^H(d zO=bj1q=7Vl1C#RUtAOlN=|Ih!Kcvet137%zAZc?jnUD>#p(7h)!>w$fqDeVBfy`Yw vAj=-)WCBUAToAh;*9%DQ&iw@>x8)@QNs0WkK=N5W$N;_qkohJBTTTK1uGy8Z diff --git a/modules/opengles/onyx_opengles.so b/modules/opengles/onyx_opengles.so index 532c064c3de5788b048b21f7328710746b5e5a69..8500f5b362fc0a3c64ab45e1b2259504d236a2d6 100755 GIT binary patch delta 1960 zcmYk7e@xVM7{`6iAOr%|X!GEJ(>poaP$7-q(ou*Y8XU)ulkPOoL-`pv6a@}38iY7k zgg!{ftQlOTo2K;zJ#shuLrYHkqik&|ZMCrl(W>fv|#d6!F_z7g*|vtJPYrhmc5&|q&F5pd@6$Z=$De;iv$w|MlmSSk=U+dan%H_ zi588jqgXudk>D=@L?>M|^w0n`sE-x{1jG=IkKy{#8&cQlxqfn7f)N2ky-&~L_?VpN z#u^qkG00j=V(nTMBNZvy48%JO%%A>3@>(MYxIUMi{uV%VieATJ)paQb#*la#tH~kZmtK5zo>d<6AaOtJn#v6)1U!k;yM27k0tOd zf(;CICs6K*1Q=51dw~N=Mx`IWnFGd0&})V5cxxLN@s6Ov{(Unbwd?sv+6!CQp1CN& z;EN3M86+iA<=#YUH=oD>t`8BCpa!2xrscR~=DR+Sd`k*(dkXWY3zF|oC4MTE`RuUd z{b|HKX}q1W^Ku?vI?ofypk^zB_91BmWKd;%1`RkVK4^!dgL3)FOY8?SXfrdYJ0}fo zCIw_>Qov*JK>=s+fA8h|FT(J0p#2iy)Cf-ZnOd``{D0*ST|&BCcg z5X)L{0gRI2=#h0{`J!&2fa_KB10BMukB z^8|9c)m=AXrjomqZo<_-0fV> z!FNh{&?B8{y9#``1H$mxQttWiP4$mmr@U4QI-qZ^bNG`DqOiId^f+zCZOxKbU9E~)(AROX~NjQSSv$Hz?&M^pJbrRHjcV2n?K01V3kKV|1(aLf60 z`_y_i=orIIcJ6Lxg9f)y{h_-MA;$>mM^{s(L2aB%O5Eb0`!Lbzd_jwbY$m!%(IuN^iOQ1wK{6Q2w(Ku(yYIONSORI@=RW6m&VBEt zO!fs$_61#@)PzoUjoXG1Y0YoQV6m-!5HjIf91NcP~PKf6E(i>9O#c=)Duml4FhVCCj2F!_qAm)3%d-sIlTaWoAa7@ffJ-+d;5 zXCAC(usxA-k0pXjo$oacC>fM~!a5EZ9>7sEY{uK0K#z9?74{$N0I6Nqr_!EV&-TgkPJ3_VFNA4Z(zRdW69U25U)sK9(h6XJ*mV`rZS)I zm%Jy9xF?ObGjv|g<4xyzA{f{6EbMPG4Vk=9PE?J&)#6)pFv9|1N%8? zXpIzLG*ZA*@j(G+@qh2{w>P=y`B^z{`&$gE8AN0;@Sc&z)p?M_Aa4^J{XGlGdDO~x z5$Lfwo3;86r8bidQv2!jLY*GJ*vwkSX*60P9Yb^AM@ln%pn_Oj-3SGA+pr-QX2t2( zZ-EQqBRCKKA~EO`9xE4@GjxO z2(J>z?NoQ&h(m2@429a3X1Ti>V2C<^!lQQU~ zK*V50SQ8_bZyhE;HH7%G1Cf8tga?}sv6u>|MPxTuag%+*$bmYdmGe43RimfK>!f3 zJBZ*^9Rw=lHSnv%mimP|G9z{|RtMcnsofA>aftn^ryQ`qX7La%Ip{p0fv=HgpS%v@ ze$*-x4WO6X3anPgqDw0OHkind) { case Ast_Kind_Load_File: { - ent.state = Entity_State_Parse; ent.type = Entity_Type_Load_File; ent.include = (AstInclude *) node; ENTITY_INSERT(ent); @@ -171,7 +170,6 @@ void add_entities_for_node(bh_arr(Entity *) *target_arr, AstNode* node, Scope* s case Ast_Kind_Library_Path: case Ast_Kind_Load_Path: { - ent.state = Entity_State_Parse; ent.type = Entity_Type_Load_Path; ent.include = (AstInclude *) node; ENTITY_INSERT(ent); diff --git a/src/onyx.c b/src/onyx.c index 024840e6..d091f884 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -283,7 +283,7 @@ static b32 process_source_file(char* filename, OnyxFilePos error_pos) { bh_arr_each(bh_file_contents, fc, context.loaded_files) { // Duplicates are detected here and since these filenames will be the full path, // string comparing them should be all that is necessary. - if (!strcmp(fc->filename, filename)) return; + if (!strcmp(fc->filename, filename)) return 1; } bh_file file; diff --git a/src/symres.c b/src/symres.c index 9c99f22a..84e5ff43 100644 --- a/src/symres.c +++ b/src/symres.c @@ -20,6 +20,7 @@ static Entity* waiting_on = NULL; typedef enum SymresStatus { Symres_Success, Symres_Complete, + Symres_Goto_Parse, Symres_Errors_Start, Symres_Yield_Macro, @@ -1390,6 +1391,26 @@ static SymresStatus symres_foreign_block(AstForeignBlock *fb) { return Symres_Complete; } +static SymresStatus symres_include(AstInclude* include) { + if (include->name != NULL) return Symres_Goto_Parse; + + SYMRES(expression, &include->name_node); + + if (include->name_node->kind != Ast_Kind_StrLit) { + onyx_report_error(include->token->pos, "Expected compile-time known string literal here. Got '%s'.", onyx_ast_node_kind_string(include->name_node->kind)); + return Symres_Error; + } + + OnyxToken* str_token = include->name_node->token; + if (str_token != NULL) { + token_toggle_end(str_token); + include->name = bh_strdup(context.ast_alloc, str_token->text); + token_toggle_end(str_token); + } + + return Symres_Goto_Parse; +} + void symres_entity(Entity* ent) { if (ent->scope) scope_enter(ent->scope); @@ -1408,6 +1429,9 @@ void symres_entity(Entity* ent) { case Entity_Type_Static_If: ss = symres_static_if(ent->static_if); break; + case Entity_Type_Load_Path: + case Entity_Type_Load_File: ss = symres_include(ent->include); break; + case Entity_Type_Foreign_Function_Header: case Entity_Type_Temp_Function_Header: case Entity_Type_Function_Header: ss = symres_function_header(ent->function); break; @@ -1444,6 +1468,7 @@ void symres_entity(Entity* ent) { if (ss == Symres_Yield_Macro) ent->macro_attempts++; if (ss == Symres_Yield_Micro) ent->micro_attempts++; if (ss == Symres_Complete) ent->state = Entity_State_Finalized; + if (ss == Symres_Goto_Parse) ent->state = Entity_State_Parse; if (ss == Symres_Success) { ent->macro_attempts = 0; ent->micro_attempts = 0; -- 2.25.1