Moving more code to list

This commit is contained in:
Krzosa Karol
2022-09-30 09:52:54 +02:00
parent cf619c2ea3
commit 0a7fe8caad
5 changed files with 45 additions and 47 deletions

View File

@@ -757,9 +757,10 @@ typedef struct String{
)=="); )==");
// Generate struct forward decls // Generate struct forward decls
For(pctx->ordered_decls){ Iter(&pctx->ordered_decls){
if(it->kind == AST_STRUCT){ auto i = it.item[0];
genln("typedef struct %Q %Q;", it->name, it->name); if(i->kind == AST_STRUCT){
genln("typedef struct %Q %Q;", i->name, i->name);
} }
} }
@@ -801,20 +802,20 @@ typedef struct String{
Ast_Decl *win_main = 0; Ast_Decl *win_main = 0;
// Generate lambda forward decls // Generate lambda forward decls
For(pctx->ordered_decls){ Iter(&pctx->ordered_decls){
if(it->kind == AST_LAMBDA){ if(it.item[0]->kind == AST_LAMBDA){
if(it->name == intern_main){ if(it.item[0]->name == intern_main){
main = it; main = it.item[0];
it->unique_name = it->name; it.item[0]->unique_name = it.item[0]->name;
} }
if(it->name == intern_win_main){ if(it.item[0]->name == intern_win_main){
win_main = it; win_main = it.item[0];
it->unique_name = it->name; it.item[0]->unique_name = it.item[0]->name;
} }
genln(""); genln("");
gen_lambda(it->unique_name, it->lambda, false); gen_lambda(it.item[0]->unique_name, it.item[0]->lambda, false);
} }
} }
@@ -824,7 +825,7 @@ typedef struct String{
// Generate language.kl // Generate language.kl
for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){ for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){
Ast_Decl *it = pctx->ordered_decls[i]; Ast_Decl *it = get(&pctx->ordered_decls, i);
genln(""); genln("");
gen_ast(it); gen_ast(it);
} }
@@ -872,10 +873,11 @@ typedef struct String{
gen("};"); gen("};");
// Generate actual code // Generate actual code
for(S32 i = pctx->base_language_ordered_decl_len; i < pctx->ordered_decls.len; i++){ Iter(&pctx->ordered_decls){
Ast_Decl *it = pctx->ordered_decls[i]; if(it.index >= pctx->base_language_ordered_decl_len){
genln(""); genln("");
gen_ast(it); gen_ast(it.item[0]);
}
} }
String string_result = string_flatten(pctx->perm, &pctx->gen); String string_result = string_flatten(pctx->perm, &pctx->gen);

View File

@@ -82,15 +82,11 @@ function void
parse_init(Parse_Ctx *ctx, Arena *perm_allocator, Allocator *heap_allocator){ parse_init(Parse_Ctx *ctx, Arena *perm_allocator, Allocator *heap_allocator){
pctx = ctx; pctx = ctx;
ctx->perm = perm_allocator; ctx->perm = perm_allocator;
ctx->perm_arena = perm_allocator;
ctx->heap = heap_allocator; ctx->heap = heap_allocator;
ctx->gen = {ctx->heap}; ctx->gen = {ctx->heap};
ctx->ordered_decls = {ctx->heap};
ctx->type_map = {ctx->heap}; ctx->type_map = {ctx->heap};
ctx->modules = {ctx->heap};
ctx->all_types = {ctx->heap}; ctx->all_types = {ctx->heap};
ctx->helper_builder= {ctx->heap}; ctx->helper_builder= {ctx->heap};
ctx->files = {ctx->heap};
ctx->scope_ids = 1; ctx->scope_ids = 1;
bigint_allocator = ctx->perm; bigint_allocator = ctx->perm;
arena_init(&ctx->stage_arena, "Compiler stage arena"_s); arena_init(&ctx->stage_arena, "Compiler stage arena"_s);
@@ -102,9 +98,8 @@ parse_init(Parse_Ctx *ctx, Arena *perm_allocator, Allocator *heap_allocator){
ctx->exe_folder = os_get_exe_dir(ctx->perm); ctx->exe_folder = os_get_exe_dir(ctx->perm);
ctx->working_folder = os_get_working_dir(ctx->perm); ctx->working_folder = os_get_working_dir(ctx->perm);
ctx->module_folders = {ctx->heap};
String main_module = string_fmt(ctx->perm, "%Q/modules", ctx->exe_folder); String main_module = string_fmt(ctx->perm, "%Q/modules", ctx->exe_folder);
ctx->module_folders.add(main_module); add(ctx->perm, &ctx->module_folders, main_module);
} }
@@ -162,8 +157,9 @@ global F64 parsing_time_end;
function void function void
parse_all_modules(){ parse_all_modules(){
parsing_time_begin = os_time(); parsing_time_begin = os_time();
for(S64 i = 0; i < pctx->modules.len; i++){
Ast_Module *module = pctx->modules[i]; Iter_Named(&pctx->modules, mod_it){
Ast_Module *module = mod_it.item[0];
if(module->state != MODULE_REGISTERED) continue; if(module->state != MODULE_REGISTERED) continue;
Iter(&module->all_loaded_files){ Iter(&module->all_loaded_files){
@@ -200,8 +196,8 @@ add_module(Token *pos, Intern_String filename, B32 command_line_module){
// Find in module folder // Find in module folder
// //
else{ else{
For(pctx->module_folders){ Iter(&pctx->module_folders){
String path = string_fmt(scratch, "%Q/%Q", it, filename); String path = string_fmt(scratch, "%Q/%Q", it.item[0], filename);
if(os_does_file_exist(path)){ if(os_does_file_exist(path)){
absolute_file_path = path; absolute_file_path = path;
absolute_base_folder = string_chop_last_slash(path); absolute_base_folder = string_chop_last_slash(path);
@@ -214,10 +210,10 @@ add_module(Token *pos, Intern_String filename, B32 command_line_module){
compiler_error(pos, "Couldn't find the module with name %Q", filename); compiler_error(pos, "Couldn't find the module with name %Q", filename);
} }
For(pctx->modules){ Iter(&pctx->modules){
if(string_compare(it->absolute_file_path, absolute_file_path)){ if(string_compare(it.item[0]->absolute_file_path, absolute_file_path)){
log_trace("Returning registered module: %Q\n", absolute_file_path); log_trace("Returning registered module: %Q\n", absolute_file_path);
return it; return it.item[0];
} }
} }
@@ -234,7 +230,7 @@ add_module(Token *pos, Intern_String filename, B32 command_line_module){
result->scope_id = pctx->scope_ids++; result->scope_id = pctx->scope_ids++;
register_ast_file(pos, result->absolute_file_path, result, GLOBAL_IMPLICIT_LOAD); register_ast_file(pos, result->absolute_file_path, result, GLOBAL_IMPLICIT_LOAD);
pctx->modules.add(result); add(pctx->perm, &pctx->modules, result);
return result; return result;
} }
@@ -267,7 +263,7 @@ compile_file_to_string(String filename){
resolve_everything_in_module(module); resolve_everything_in_module(module);
// @note: language stuff needs to be declared before type_info data // @note: language stuff needs to be declared before type_info data
// so we mark where it ends // so we mark where it ends
pctx->base_language_ordered_decl_len = pctx->ordered_decls.len; pctx->base_language_ordered_decl_len = length(&pctx->ordered_decls);
Ast_Decl *any_decl = search_for_single_decl(module, pctx->intern("Any"_s)); Ast_Decl *any_decl = search_for_single_decl(module, pctx->intern("Any"_s));
assert(any_decl->type == type_type); assert(any_decl->type == type_type);
type_any = any_decl->type_val; type_any = any_decl->type_val;

View File

@@ -157,8 +157,7 @@ struct Lexer{
// //
struct Parse_Ctx:Lexer{ struct Parse_Ctx:Lexer{
Allocator *perm; // Stores: AST, tokens, interns Arena *perm; // Stores: AST, tokens, interns
Arena *perm_arena;
Allocator *heap; Allocator *heap;
Arena stage_arena; Arena stage_arena;
@@ -170,9 +169,9 @@ struct Parse_Ctx:Lexer{
Ast_Module *language_base_module; Ast_Module *language_base_module;
Array<Ast_File *> files; List<Ast_File *> files;
Array<Ast_Module *> modules; List<Ast_Module *> modules;
Array<Ast_Decl *> ordered_decls; List<Ast_Decl *> ordered_decls;
S32 base_language_ordered_decl_len; S32 base_language_ordered_decl_len;
Ast_Scope *currently_parsed_scope; Ast_Scope *currently_parsed_scope;
@@ -180,7 +179,7 @@ struct Parse_Ctx:Lexer{
U32 scope_ids; U32 scope_ids;
U32 scope_visit_id; U32 scope_visit_id;
Array<String> module_folders; List<String> module_folders;
String module_folder; String module_folder;
String exe_folder; String exe_folder;
String working_folder; String working_folder;

View File

@@ -726,15 +726,16 @@ function Ast_File *
register_ast_file(Token *pos, String absolute_file_path, Ast_Module *module, B32 global_implicit_load){ register_ast_file(Token *pos, String absolute_file_path, Ast_Module *module, B32 global_implicit_load){
Ast_File *file = 0; Ast_File *file = 0;
For(pctx->files){ Iter(&pctx->files){
if(string_compare(it->absolute_file_path, absolute_file_path)){ Ast_File *it_file = it.item[0];
if(module == it->module){ if(string_compare(it_file->absolute_file_path, absolute_file_path)){
if(module == it_file->module){
log_trace("%Q :: Returning registered file: %Q\n", module->absolute_file_path, absolute_file_path); log_trace("%Q :: Returning registered file: %Q\n", module->absolute_file_path, absolute_file_path);
file = it; file = it_file;
break; break;
} }
compiler_error(it->pos, pos, "This file is already loaded by module: %Q, try importing that module to get access to it", module->absolute_file_path); compiler_error(it_file->pos, pos, "This file is already loaded by module: %Q, try importing that module to get access to it", module->absolute_file_path);
} }
} }
@@ -750,9 +751,9 @@ register_ast_file(Token *pos, String absolute_file_path, Ast_Module *module, B32
file->implicit_imports = {pctx->heap}; file->implicit_imports = {pctx->heap};
file->pos = pos; file->pos = pos;
file->debug_name = string_skip_to_last_slash(absolute_file_path); file->debug_name = string_skip_to_last_slash(absolute_file_path);
add(pctx->perm_arena, &file->module->all_loaded_files, file); add(pctx->perm, &file->module->all_loaded_files, file);
file->scope_id = pctx->scope_ids++; file->scope_id = pctx->scope_ids++;
pctx->files.add(file); add(pctx->perm, &pctx->files, file);
} }
if(global_implicit_load) { if(global_implicit_load) {

View File

@@ -353,7 +353,7 @@ type_complete(Ast_Type *type){
} }
type_struct_complete(type, (Ast_Decl *)type->ast); type_struct_complete(type, (Ast_Decl *)type->ast);
pctx->ordered_decls.add((Ast_Decl *)type->ast); add(pctx->perm, &pctx->ordered_decls, (Ast_Decl *)type->ast);
} }
function void function void
@@ -2061,5 +2061,5 @@ resolve_decl(Ast_Decl *ast){
ast->state = DECL_RESOLVED; ast->state = DECL_RESOLVED;
if(is_flag_set(ast->flags, AST_GLOBAL)) if(is_flag_set(ast->flags, AST_GLOBAL))
pctx->ordered_decls.add(ast); add(pctx->perm, &pctx->ordered_decls, ast);
} }