Allocator cleanup + '_' skips tests

This commit is contained in:
Krzosa Karol
2023-03-29 08:32:24 +02:00
parent 7da3e27c05
commit b0633c84f4
6 changed files with 31 additions and 33 deletions

View File

@@ -49,9 +49,8 @@ string_scope_name(Allocator *a, Ast_Scope *scope) {
CORE_Static void CORE_Static void
gen_scope_name(Ast_Scope *scope) { gen_scope_name(Ast_Scope *scope) {
Arena *scratch = pctx->scratch; Scratch_Scope scratch(pctx->scratch);
Scratch_Scope _scope(scratch); String string = string_scope_name(scratch.arena, scope);
String string = string_scope_name(scratch, scope);
gen("%.*s", (int)string.len, string.str); gen("%.*s", (int)string.len, string.str);
} }
@@ -99,20 +98,21 @@ get_ctype_name_for_type(Ast_Type *type) {
} }
CORE_Static String 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) { switch (ast->kind) {
case TYPE_POINTER: { 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); string = string_fmt(a, "%Q*", string);
return string; return string;
} break; } break;
case TYPE_LAMBDA: return {}; break; case TYPE_LAMBDA: return {}; break;
case TYPE_ENUM: case TYPE_ENUM:
case TYPE_ARRAY: { case TYPE_ARRAY: {
return string_simple_decl_prefix(a, ast->base); return string_simple_decl_prefix(ast->base);
} break; } break;
case TYPE_SLICE: { 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); string = string_fmt(a, "Slice%llu ", ast->type_id);
return string; return string;
} break; } break;
@@ -136,13 +136,14 @@ string_simple_decl_prefix(Allocator *a, Ast_Type *ast) {
} }
CORE_Static String 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) { switch (ast->kind) {
case TYPE_POINTER: case TYPE_POINTER:
return string_simple_decl_postfix(a, ast->base); return string_simple_decl_postfix(ast->base);
break; break;
case TYPE_ARRAY: { 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); String string = string_fmt(a, "[%d]%Q", ast->arr.size, result);
return string; return string;
} break; } break;
@@ -158,12 +159,13 @@ string_simple_decl_postfix(Allocator *a, Ast_Type *ast) {
} }
CORE_Static String 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) { 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); String string = string_fmt(a, "%Q(*%Q)(", prefix, name);
For(ast->func.args) { 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); string = string_fmt(a, "%Q%Q", string, prefix_arg);
if (&it != ast->func.args.end() - 1) if (&it != ast->func.args.end() - 1)
string = string_fmt(a, "%Q, ", string); string = string_fmt(a, "%Q, ", string);
@@ -172,11 +174,11 @@ string_simple_decl(Allocator *a, Ast_Type *ast, Intern_String name = {}) {
return string; return string;
} }
else { else {
String string = string_simple_decl_prefix(a, ast); String string = string_simple_decl_prefix(ast);
if (name.len) { if (name.len) {
string = string_fmt(a, "%Q%Q", string, name); 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); string = string_fmt(a, "%Q%Q", string, postfix);
return string; return string;
} }
@@ -184,11 +186,8 @@ string_simple_decl(Allocator *a, Ast_Type *ast, Intern_String name = {}) {
CORE_Static void CORE_Static void
gen_simple_decl(Ast_Type *ast, Intern_String name = {}) { gen_simple_decl(Ast_Type *ast, Intern_String name = {}) {
Arena *scratch = pctx->scratch; String string = string_simple_decl(ast, name);
Scratch_Scope _scope(scratch); gen("%Q", string);
String string = string_simple_decl(scratch, ast, name);
gen("%.*s", (int)string.len, string.str);
} }
CORE_Static String CORE_Static String
@@ -226,11 +225,9 @@ gen_value(Token *pos, Value a) {
switch (type->kind) { switch (type->kind) {
CASE_INT : { CASE_INT : {
Arena *scratch = pctx->scratch; Scratch_Scope scratch(pctx->scratch);
Scratch_Scope _scope(scratch);
String postfix = get_type_postfix(type); 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); gen("%s%Q", string, postfix);
} break; } break;
case TYPE_POINTER: { case TYPE_POINTER: {
@@ -569,8 +566,7 @@ gen_ast(Ast *ast) {
CASE(RETURN, Return) { CASE(RETURN, Return) {
if (is_tuple(node->resolved_type)) { if (is_tuple(node->resolved_type)) {
Arena *scratch = pctx->scratch; Scratch_Scope scratch(pctx->scratch);
Scratch_Scope _scope(scratch);
Intern_String tuple_name = get_unique_name(node); Intern_String tuple_name = get_unique_name(node);
gen_simple_decl(node->resolved_type, tuple_name); gen_simple_decl(node->resolved_type, tuple_name);
@@ -808,8 +804,7 @@ gen_ast(Ast *ast) {
For(node->vars) For(node->vars)
gen_ast(it); gen_ast(it);
Arena *scratch = pctx->scratch; Scratch_Scope scratch(pctx->scratch);
Scratch_Scope _scope(scratch);
Intern_String var_name = get_unique_name(node); Intern_String var_name = get_unique_name(node);
gen_simple_decl(node->resolved_type, var_name); gen_simple_decl(node->resolved_type, var_name);
@@ -905,8 +900,7 @@ compile_to_c_code() {
// Generate slice and tuple types // Generate slice and tuple types
For_Named(pctx->all_types, type) { For_Named(pctx->all_types, type) {
Arena *scratch = pctx->scratch; Scratch_Scope scratch(pctx->scratch);
Scratch_Scope _scope(scratch);
if (type->kind == TYPE_SLICE) { if (type->kind == TYPE_SLICE) {
genln("typedef struct Slice%llu{", type->type_id); genln("typedef struct Slice%llu{", type->type_id);
@@ -925,7 +919,7 @@ compile_to_c_code() {
For(type->agg.members) { For(type->agg.members) {
genln(""); genln("");
// @todo remove intern from gen // @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_simple_decl(it.type, name);
gen(";"); gen(";");
} }

View File

@@ -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->perm_push_only, "Perm Push Only"_s);
arena_init(&ctx->scratch_, "Scratch"_s); arena_init(&ctx->scratch_, "Scratch"_s);
arena_init(&ctx->stage_arena_, "Stage Arena"_s); arena_init(&ctx->stage_arena_, "Stage Arena"_s);
arena_init(&ctx->token_arena, "Token Arena"_s);
ctx->scratch = &ctx->scratch_; ctx->scratch = &ctx->scratch_;
ctx->stage_arena = &ctx->stage_arena_; ctx->stage_arena = &ctx->stage_arena_;
ctx->perm = &ctx->perm_push_only; ctx->perm = &ctx->perm_push_only;

View File

@@ -20,6 +20,7 @@ struct Core_Ctx {
Arena scratch_; Arena scratch_;
Arena stage_arena_; Arena stage_arena_;
Arena *stage_arena; Arena *stage_arena;
Arena token_arena;
String_Builder helper_builder; String_Builder helper_builder;
int errors_occured; int errors_occured;

View File

@@ -209,11 +209,11 @@ lex_is_scope(Token *t) {
CORE_Static void CORE_Static void
lex_add_token(Core_Ctx *ctx, Token *token) { 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; *top = *token;
ctx->tokens.len += 1; ctx->tokens.len += 1;
ctx->tokens.cap += 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 CORE_Static void

View File

@@ -180,6 +180,8 @@ int main(int argument_count, char **arguments) {
Array<OS_File_Info> tests = os_list_dir(&scratch, &scratch, "tests"_s); Array<OS_File_Info> tests = os_list_dir(&scratch, &scratch, "tests"_s);
For(examples) { For(examples) {
if (it.is_directory) continue; 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); compile_file(&arena, it.absolute_path, COMPILE_AND_RUN | COMPILE_TESTING);
} }
For(tests) { For(tests) {