Allocator cleanup + '_' skips tests
This commit is contained in:
@@ -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(";");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user