From b0633c84f420d4718e1030687296225ba9561fcd Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Wed, 29 Mar 2023 08:32:24 +0200 Subject: [PATCH] Allocator cleanup + '_' skips tests --- core_codegen_c_language.cpp | 56 +++++++++++++--------------- core_compiler.cpp | 1 + core_compiler.h | 1 + core_lexing.cpp | 4 +- core_main.cpp | 2 + examples/{demo1.core => _demo1.core} | 0 6 files changed, 31 insertions(+), 33 deletions(-) rename examples/{demo1.core => _demo1.core} (100%) diff --git a/core_codegen_c_language.cpp b/core_codegen_c_language.cpp index 778ce5c..10a698c 100644 --- a/core_codegen_c_language.cpp +++ b/core_codegen_c_language.cpp @@ -49,9 +49,8 @@ string_scope_name(Allocator *a, Ast_Scope *scope) { CORE_Static void gen_scope_name(Ast_Scope *scope) { - Arena *scratch = pctx->scratch; - Scratch_Scope _scope(scratch); - String string = string_scope_name(scratch, scope); + Scratch_Scope scratch(pctx->scratch); + String string = string_scope_name(scratch.arena, scope); gen("%.*s", (int)string.len, string.str); } @@ -99,20 +98,21 @@ get_ctype_name_for_type(Ast_Type *type) { } CORE_Static String -string_simple_decl_prefix(Allocator *a, Ast_Type *ast) { +string_simple_decl_prefix(Ast_Type *ast) { + Allocator *a = pctx->stage_arena; switch (ast->kind) { case TYPE_POINTER: { - String string = string_simple_decl_prefix(a, ast->base); + String string = string_simple_decl_prefix(ast->base); string = string_fmt(a, "%Q*", string); return string; } break; case TYPE_LAMBDA: return {}; break; case TYPE_ENUM: case TYPE_ARRAY: { - return string_simple_decl_prefix(a, ast->base); + return string_simple_decl_prefix(ast->base); } break; case TYPE_SLICE: { - String string = string_simple_decl_prefix(a, ast->base); + String string = string_simple_decl_prefix(ast->base); string = string_fmt(a, "Slice%llu ", ast->type_id); return string; } break; @@ -136,13 +136,14 @@ string_simple_decl_prefix(Allocator *a, Ast_Type *ast) { } CORE_Static String -string_simple_decl_postfix(Allocator *a, Ast_Type *ast) { +string_simple_decl_postfix(Ast_Type *ast) { + Allocator *a = pctx->stage_arena; switch (ast->kind) { case TYPE_POINTER: - return string_simple_decl_postfix(a, ast->base); + return string_simple_decl_postfix(ast->base); break; case TYPE_ARRAY: { - String result = string_simple_decl_postfix(a, ast->arr.base); + String result = string_simple_decl_postfix(ast->arr.base); String string = string_fmt(a, "[%d]%Q", ast->arr.size, result); return string; } break; @@ -158,12 +159,13 @@ string_simple_decl_postfix(Allocator *a, Ast_Type *ast) { } CORE_Static String -string_simple_decl(Allocator *a, Ast_Type *ast, Intern_String name = {}) { +string_simple_decl(Ast_Type *ast, Intern_String name = {}) { + Allocator *a = pctx->stage_arena; if (ast->kind == TYPE_LAMBDA) { - String prefix = string_simple_decl_prefix(a, ast->func.ret); + String prefix = string_simple_decl_prefix(ast->func.ret); String string = string_fmt(a, "%Q(*%Q)(", prefix, name); For(ast->func.args) { - String prefix_arg = string_simple_decl_prefix(a, it); + String prefix_arg = string_simple_decl_prefix(it); string = string_fmt(a, "%Q%Q", string, prefix_arg); if (&it != ast->func.args.end() - 1) string = string_fmt(a, "%Q, ", string); @@ -172,11 +174,11 @@ string_simple_decl(Allocator *a, Ast_Type *ast, Intern_String name = {}) { return string; } else { - String string = string_simple_decl_prefix(a, ast); + String string = string_simple_decl_prefix(ast); if (name.len) { string = string_fmt(a, "%Q%Q", string, name); } - String postfix = string_simple_decl_postfix(a, ast); + String postfix = string_simple_decl_postfix(ast); string = string_fmt(a, "%Q%Q", string, postfix); return string; } @@ -184,11 +186,8 @@ string_simple_decl(Allocator *a, Ast_Type *ast, Intern_String name = {}) { CORE_Static void gen_simple_decl(Ast_Type *ast, Intern_String name = {}) { - Arena *scratch = pctx->scratch; - Scratch_Scope _scope(scratch); - - String string = string_simple_decl(scratch, ast, name); - gen("%.*s", (int)string.len, string.str); + String string = string_simple_decl(ast, name); + gen("%Q", string); } CORE_Static String @@ -226,11 +225,9 @@ gen_value(Token *pos, Value a) { switch (type->kind) { CASE_INT : { - Arena *scratch = pctx->scratch; - Scratch_Scope _scope(scratch); - + Scratch_Scope scratch(pctx->scratch); String postfix = get_type_postfix(type); - const char *string = bigint_to_error_string(scratch, &a.big_int_val, 10); + const char *string = bigint_to_error_string(scratch.arena, &a.big_int_val, 10); gen("%s%Q", string, postfix); } break; case TYPE_POINTER: { @@ -569,8 +566,7 @@ gen_ast(Ast *ast) { CASE(RETURN, Return) { if (is_tuple(node->resolved_type)) { - Arena *scratch = pctx->scratch; - Scratch_Scope _scope(scratch); + Scratch_Scope scratch(pctx->scratch); Intern_String tuple_name = get_unique_name(node); gen_simple_decl(node->resolved_type, tuple_name); @@ -808,8 +804,7 @@ gen_ast(Ast *ast) { For(node->vars) gen_ast(it); - Arena *scratch = pctx->scratch; - Scratch_Scope _scope(scratch); + Scratch_Scope scratch(pctx->scratch); Intern_String var_name = get_unique_name(node); gen_simple_decl(node->resolved_type, var_name); @@ -905,8 +900,7 @@ compile_to_c_code() { // Generate slice and tuple types For_Named(pctx->all_types, type) { - Arena *scratch = pctx->scratch; - Scratch_Scope _scope(scratch); + Scratch_Scope scratch(pctx->scratch); if (type->kind == TYPE_SLICE) { genln("typedef struct Slice%llu{", type->type_id); @@ -925,7 +919,7 @@ compile_to_c_code() { For(type->agg.members) { genln(""); // @todo remove intern from gen - Intern_String name = pctx->intern(string_fmt(scratch, "m%llu", type->agg.members.get_index(&it))); + Intern_String name = pctx->intern(string_fmt(scratch.arena, "m%llu", type->agg.members.get_index(&it))); gen_simple_decl(it.type, name); gen(";"); } diff --git a/core_compiler.cpp b/core_compiler.cpp index f51412e..7950942 100644 --- a/core_compiler.cpp +++ b/core_compiler.cpp @@ -22,6 +22,7 @@ static void core_init_compiler(Core_Ctx *ctx, Allocator *allocator) { arena_init(&ctx->perm_push_only, "Perm Push Only"_s); arena_init(&ctx->scratch_, "Scratch"_s); arena_init(&ctx->stage_arena_, "Stage Arena"_s); + arena_init(&ctx->token_arena, "Token Arena"_s); ctx->scratch = &ctx->scratch_; ctx->stage_arena = &ctx->stage_arena_; ctx->perm = &ctx->perm_push_only; diff --git a/core_compiler.h b/core_compiler.h index 23cd428..aab9b12 100644 --- a/core_compiler.h +++ b/core_compiler.h @@ -20,6 +20,7 @@ struct Core_Ctx { Arena scratch_; Arena stage_arena_; Arena *stage_arena; + Arena token_arena; String_Builder helper_builder; int errors_occured; diff --git a/core_lexing.cpp b/core_lexing.cpp index b44c8fa..491c03a 100644 --- a/core_lexing.cpp +++ b/core_lexing.cpp @@ -209,11 +209,11 @@ lex_is_scope(Token *t) { CORE_Static void lex_add_token(Core_Ctx *ctx, Token *token) { - Token *top = (Token *)arena_push_size(ctx->stage_arena, sizeof(Token)); + Token *top = (Token *)arena_push_size(&ctx->token_arena, sizeof(Token)); *top = *token; ctx->tokens.len += 1; ctx->tokens.cap += 1; - ctx->tokens.data = (Token *)ctx->stage_arena->memory.data; + ctx->tokens.data = (Token *)ctx->token_arena.memory.data; } CORE_Static void diff --git a/core_main.cpp b/core_main.cpp index 776c428..16f1313 100644 --- a/core_main.cpp +++ b/core_main.cpp @@ -180,6 +180,8 @@ int main(int argument_count, char **arguments) { Array tests = os_list_dir(&scratch, &scratch, "tests"_s); For(examples) { if (it.is_directory) continue; + String filename = string_skip_to_last_slash(it.relative_path); + if (filename.len && filename.str[0] == '_') continue; compile_file(&arena, it.absolute_path, COMPILE_AND_RUN | COMPILE_TESTING); } For(tests) { diff --git a/examples/demo1.core b/examples/_demo1.core similarity index 100% rename from examples/demo1.core rename to examples/_demo1.core