@@ -29,8 +29,7 @@ typedef struct Parser {
2929
3030 struct ErrorVec errors ;
3131
32- struct Scope * global_scope ;
33- HashMap functions ;
32+ SymbolTable * symbol_table ;
3433} Parser ;
3534
3635#pragma region source range operations
@@ -627,8 +626,9 @@ static VariableDecl parse_variable_decl(Parser* parser,
627626{
628627 const StringView name = str_from_token (parser -> src , name_token );
629628 // TODO: handle different linkages
630- IdentifierInfo * variable = add_identifier (
631- scope , name , IDENT_OBJECT , LINKAGE_NONE , parser -> permanent_arena );
629+ IdentifierInfo * variable =
630+ add_identifier (parser -> symbol_table , scope , name , IDENT_OBJECT ,
631+ LINKAGE_NONE , parser -> permanent_arena );
632632 if (!variable ) {
633633 const StringView error_msg =
634634 allocate_printf (parser -> permanent_arena , "redefinition of '%.*s'" ,
@@ -937,8 +937,9 @@ static IdentifierInfo* parse_parameter(Parser* parser, Scope* scope)
937937 parse_advance (parser );
938938 }
939939
940- IdentifierInfo * name = add_identifier (
941- scope , identifier , IDENT_OBJECT , LINKAGE_NONE , parser -> permanent_arena );
940+ IdentifierInfo * name =
941+ add_identifier (parser -> symbol_table , scope , identifier , IDENT_OBJECT ,
942+ LINKAGE_NONE , parser -> permanent_arena );
942943 // TODO: error handling
943944 MCC_ASSERT (name != nullptr );
944945 return name ;
@@ -1006,8 +1007,9 @@ static FunctionDecl* parse_function_decl(Parser* parser,
10061007 Token name_token , Scope * scope )
10071008{
10081009 StringView name = str_from_token (parser -> src , name_token );
1009- IdentifierInfo * function_ident = add_identifier (
1010- scope , name , IDENT_FUNCTION , LINKAGE_EXTERNAL , parser -> permanent_arena );
1010+ IdentifierInfo * function_ident =
1011+ add_identifier (parser -> symbol_table , scope , name , IDENT_FUNCTION ,
1012+ LINKAGE_EXTERNAL , parser -> permanent_arena );
10111013
10121014 if (!function_ident ) {
10131015 function_ident = lookup_identifier (scope , name );
@@ -1021,11 +1023,8 @@ static FunctionDecl* parse_function_decl(Parser* parser,
10211023 }
10221024 }
10231025
1024- hashmap_try_insert (& parser -> functions , name , function_ident ,
1025- parser -> permanent_arena );
1026-
10271026 Scope * function_scope =
1028- new_scope (parser -> global_scope , parser -> permanent_arena );
1027+ new_scope (parser -> symbol_table -> global_scope , parser -> permanent_arena );
10291028 const Parameters parameters = parse_parameter_list (parser , function_scope );
10301029
10311030 Block * body = NULL ;
@@ -1065,7 +1064,7 @@ static TranslationUnit* parse_translation_unit(Parser* parser)
10651064 struct DeclVec decl_vec = {};
10661065
10671066 while (parser_current_token (parser ).tag != TOKEN_EOF ) {
1068- Decl decl = parse_decl (parser , parser -> global_scope );
1067+ Decl decl = parse_decl (parser , parser -> symbol_table -> global_scope );
10691068 DYNARRAY_PUSH_BACK (& decl_vec , Decl , & parser -> scratch_arena , decl );
10701069 }
10711070
@@ -1077,12 +1076,9 @@ static TranslationUnit* parse_translation_unit(Parser* parser)
10771076
10781077 TranslationUnit * tu =
10791078 ARENA_ALLOC_OBJECT (parser -> permanent_arena , TranslationUnit );
1080- * tu = (TranslationUnit ){
1081- .decl_count = decl_count ,
1082- .decls = decls ,
1083- .global_scope = parser -> global_scope ,
1084- .functions = parser -> functions ,
1085- };
1079+ * tu = (TranslationUnit ){.decl_count = decl_count ,
1080+ .decls = decls ,
1081+ .symbol_table = parser -> symbol_table };
10861082 parse_consume (parser , TOKEN_EOF , "Expect end of the file" );
10871083
10881084 return tu ;
@@ -1091,12 +1087,17 @@ static TranslationUnit* parse_translation_unit(Parser* parser)
10911087ParseResult parse (const char * src , Tokens tokens , Arena * permanent_arena ,
10921088 Arena scratch_arena )
10931089{
1090+ SymbolTable * symbol_table = ARENA_ALLOC_OBJECT (permanent_arena , SymbolTable );
1091+ * symbol_table = (SymbolTable ){
1092+ .global_symbols = (HashMap ){},
1093+ .global_scope = new_scope (nullptr , permanent_arena ),
1094+ };
1095+
10941096 Parser parser = {.src = src ,
10951097 .tokens = tokens ,
10961098 .permanent_arena = permanent_arena ,
10971099 .scratch_arena = scratch_arena ,
1098- .global_scope = new_scope (nullptr , permanent_arena ),
1099- .functions = (HashMap ){}};
1100+ .symbol_table = symbol_table };
11001101
11011102 TranslationUnit * tu = parse_translation_unit (& parser );
11021103
0 commit comments