diff --git a/base.cpp b/base.cpp index 786deac..5a41468 100644 --- a/base.cpp +++ b/base.cpp @@ -555,8 +555,10 @@ arena_clear(Arena *arena){ arena_pop_pos(arena, 0); } +#define arena_push_array(a, T, size,...) (T *)arena_push_size(a, sizeof(T)*(size),##__VA_ARGS__) +#define arena_push_type(a, T, ...) arena_push_array(a, T, 1,##__VA_ARGS__) function void * -arena_push_size(Arena *a, size_t size){ +arena_push_size(Arena *a, size_t size, Alloc_Flag flags = AF_None){ size_t generous_size = size + a->alignment; if(a->len+generous_size>a->memory.commit){ if(a->memory.reserve == 0){ @@ -570,6 +572,11 @@ arena_push_size(Arena *a, size_t size){ assert(a->memory.reserve > a->len + size); void *result = (U8*)a->memory.data + a->len; a->len += size; + + if(flags & AF_ZeroMemory){ + memory_zero(result, size); + } + return result; } @@ -911,7 +918,7 @@ struct Map_Key_Value{ }; struct Map{ - Allocator *allocator; + Arena *allocator; Map_Key_Value *data; S64 len; S64 cap; @@ -923,10 +930,10 @@ map_grow(Map *map, S64 new_size){ new_size = max((S64)16, new_size); assert(new_size > map->cap); assert(is_pow2(new_size)); - if(map->cap == 0 && map->allocator == 0) map->allocator = imp_get(); + assert(map->allocator); Map new_map = {}; - new_map.data = exp_alloc_array(map->allocator, Map_Key_Value, new_size, AF_ZeroMemory); + new_map.data = arena_push_array(map->allocator, Map_Key_Value, new_size, AF_ZeroMemory); new_map.cap = new_size; new_map.allocator = map->allocator; @@ -935,12 +942,12 @@ map_grow(Map *map, S64 new_size){ map_insert(&new_map, map->data[i].key, map->data[i].value); } } - if(map->data) exp_free(map->allocator, map->data); + // if(map->data) exp_free(map->allocator, map->data); *map = new_map; } function Map -map_make(Allocator *a, S64 size){ +map_make(Arena *a, S64 size){ Map result = {a}; map_grow(&result, size); return result; @@ -1057,14 +1064,14 @@ map_test(){ // String intern //----------------------------------------------------------------------------- struct Intern_Table{ - Allocator *string_allocator; + Arena *string_allocator; Map map; U8 *first_keyword; U8 *last_keyword; }; function Intern_Table -intern_table_make(Allocator *string_allocator, Allocator *map_allocator, S64 initial_size = 32){ +intern_table_make(Arena *string_allocator, Arena *map_allocator, S64 initial_size = 32){ Intern_Table result = {}; result.map = map_make(map_allocator, initial_size); result.string_allocator = string_allocator; @@ -1341,7 +1348,7 @@ T pop(List *list){ template T *merge(Arena *arena, List *list){ int len = length(list); - T *result = exp_alloc_array(arena, T, len); + T *result = arena_push_array(arena, T, len); int i = 0; For_Linked_List(list->first){ diff --git a/base_string.cpp b/base_string.cpp index f36986c..5afda66 100644 --- a/base_string.cpp +++ b/base_string.cpp @@ -76,8 +76,8 @@ operator==(String a, String b){ } function String -string_copy(Allocator *a, String string){ - U8 *copy = exp_alloc_array(a, U8, string.len+1); +string_copy(Arena *a, String string){ + U8 *copy = arena_push_array(a, U8, string.len+1); memory_copy(copy, string.str, string.len); copy[string.len] = 0; return String{copy, string.len}; @@ -368,7 +368,7 @@ string_trim_end(String string) { } function String -string_to_lower_case(Allocator *arena, String s) { +string_to_lower_case(Arena *arena, String s) { String copy = string_copy(arena, s); for (U64 i = 0; i < copy.len; i++) { copy.str[i] = to_lower_case(copy.str[i]); @@ -377,7 +377,7 @@ string_to_lower_case(Allocator *arena, String s) { } function String -string_to_upper_case(Allocator *arena, String s) { +string_to_upper_case(Arena *arena, String s) { String copy = string_copy(arena, s); for (U64 i = 0; i < copy.len; i++) { copy.str[i] = to_upper_case(copy.str[i]); diff --git a/core_ast.cpp b/core_ast.cpp index cd74d2f..15c9527 100644 --- a/core_ast.cpp +++ b/core_ast.cpp @@ -293,7 +293,7 @@ struct Ast_Decl: Ast{ // AST Constructors beginning with expressions //----------------------------------------------------------------------------- #define AST_NEW(T,ikind,ipos,iflags) \ - Ast_##T *result = exp_alloc_type(pctx->perm, Ast_##T, AF_ZeroMemory);\ + Ast_##T *result = arena_push_type(pctx->perm, Ast_##T, AF_ZeroMemory);\ result->flags = iflags; \ result->kind = AST_##ikind; \ result->parent_scope = pctx->currently_parsed_scope; \ @@ -303,7 +303,7 @@ struct Ast_Decl: Ast{ #define ast_new(T,kind,pos,flags) (T *)_ast_new(sizeof(T), kind, pos, flags) function Ast * _ast_new(size_t size, Ast_Kind kind, Token *pos, Ast_Flag flags = 0){ - Ast *result = (Ast *)exp_alloc(pctx->perm, size, AF_ZeroMemory); + Ast *result = (Ast *)arena_push_size(pctx->perm, size, AF_ZeroMemory); result->flags = flags; result->kind = kind; result->parent_scope = pctx->currently_parsed_scope; @@ -487,7 +487,7 @@ finalize_decl_scope(Ast_Scope *scope){ } function Ast_Scope * -begin_stmt_scope(Allocator *scratch, Token *pos){ +begin_stmt_scope(Arena *scratch, Token *pos){ AST_NEW(Scope, SCOPE, pos, AST_STMT); result->stmts = {scratch}; result->file = pctx->currently_parsed_file; diff --git a/core_codegen_c_language.cpp b/core_codegen_c_language.cpp index fa83ef2..4694544 100644 --- a/core_codegen_c_language.cpp +++ b/core_codegen_c_language.cpp @@ -34,7 +34,7 @@ gen_last_line(){ } function String -string_scope_name(Allocator *a, Ast_Scope *scope){ +string_scope_name(Arena *a, Ast_Scope *scope){ String string = {}; if(scope->parent_scope) string = string_scope_name(a, scope->parent_scope); assert_message(scope->scope_id != 0, "Scope id is equal to 0 which is invalid, scope didn't initialize id"); @@ -50,8 +50,8 @@ gen_scope_name(Ast_Scope *scope){ } function String -unique_name(Allocator *allocator, Ast *ast){ - Scratch scratch; +unique_name(Arena *allocator, Ast *ast){ + Scratch scratch(allocator); String result = string_scope_name(scratch, ast->parent_scope); assert(result.len); result = string_fmt(allocator, "%Q%d", result, ast->pos->line); @@ -85,7 +85,7 @@ get_ctype_name_for_type(Ast_Type *type){ } function String -string_simple_decl_prefix(Allocator *a, Ast_Type *ast){ +string_simple_decl_prefix(Arena *a, Ast_Type *ast){ switch(ast->kind){ case TYPE_POINTER:{ String string = string_simple_decl_prefix(a, ast->base); @@ -122,7 +122,7 @@ string_simple_decl_prefix(Allocator *a, Ast_Type *ast){ } function String -string_simple_decl_postfix(Allocator *a, Ast_Type *ast){ +string_simple_decl_postfix(Arena *a, Ast_Type *ast){ switch(ast->kind){ case TYPE_POINTER: return string_simple_decl_postfix(a, ast->base); @@ -141,7 +141,7 @@ string_simple_decl_postfix(Allocator *a, Ast_Type *ast){ } function String -string_simple_decl(Allocator *a, Ast_Type *ast, Intern_String name = {}){ +string_simple_decl(Arena *a, Ast_Type *ast, Intern_String name = {}){ if(ast->kind == TYPE_LAMBDA) { String prefix = string_simple_decl_prefix(a, ast->func.ret); String string = string_fmt(a, "%Q(*%Q)(", prefix, name); @@ -173,7 +173,7 @@ gen_simple_decl(Ast_Type *ast, Intern_String name = {}){ } function String -gen_string_simple_decl(Allocator *a, Ast_Type *ast, String name){ +gen_string_simple_decl(Arena *a, Ast_Type *ast, String name){ Scratch scratch; String string = string_simple_decl(scratch, ast, pctx->intern(name)); String result = string_copy(a, string); diff --git a/core_compiler.cpp b/core_compiler.cpp index 66514f6..06c0338 100644 --- a/core_compiler.cpp +++ b/core_compiler.cpp @@ -1,6 +1,6 @@ function void -lex_init(Allocator *token_string_arena, Allocator *map_allocator, Lexer *l){ +lex_init(Arena *token_string_arena, Arena *map_allocator, Lexer *l){ l->arena = token_string_arena; l->tokens = array_make(token_string_arena, 4096*4); l->interns= intern_table_make(token_string_arena, map_allocator, 2048); @@ -106,8 +106,8 @@ begin_compilation(){ function void destroy_compiler(){ - exp_free_all(pctx->perm); - exp_free_all(&pctx->stage_arena); + arena_clear(pctx->perm); + arena_clear(&pctx->stage_arena); } function void diff --git a/core_compiler.h b/core_compiler.h index 7985260..ff8078f 100644 --- a/core_compiler.h +++ b/core_compiler.h @@ -187,7 +187,7 @@ struct Parse_Ctx:Lexer{ }; function void init_type(); -function void lex_init(Allocator *token_string_arena, Allocator *map_allocator, Lexer *l); +function void lex_init(Arena *token_string_arena, Arena *map_allocator, Lexer *l); function String compile_to_c_code(); function Ast_Module *ast_module(Token *pos, Intern_String filename); function void insert_builtin_types_into_scope(Ast_Scope *p); diff --git a/core_lexing.cpp b/core_lexing.cpp index c772b7e..e867a4a 100644 --- a/core_lexing.cpp +++ b/core_lexing.cpp @@ -586,7 +586,7 @@ lex__stream(Lexer *lexer){ } function Lexer -lex_make(Allocator *token_string_arena, Allocator *map_allocator){ +lex_make(Arena *token_string_arena, Arena *map_allocator){ Lexer result = {}; lex_init(token_string_arena, map_allocator, &result); return result; @@ -606,7 +606,7 @@ lex_restream(Lexer *lexer, String istream, String file){ } function Lexer -lex_stream(Allocator *token_string_arena, Allocator *map_allocator, String istream, String file){ +lex_stream(Arena *token_string_arena, Arena *map_allocator, String istream, String file){ Lexer result = lex_make(token_string_arena, map_allocator); lex_restream(&result, istream, file); return result; diff --git a/core_typechecking.cpp b/core_typechecking.cpp index f55a118..a987443 100644 --- a/core_typechecking.cpp +++ b/core_typechecking.cpp @@ -20,13 +20,13 @@ operand(Ast_Decl *decl){ return result; } -function Operand -operand_type(Ast_Type *type){ - Operand result = {}; - result.type = type_type; - result.is_const = true; +static Operand +operand_type(Ast_Type *type) { + Operand result = {}; + result.type = type_type; + result.is_const = true; result.is_lvalue = false; - result.type_val = type; + result.type_val = type; return result; } diff --git a/os_windows.cpp b/os_windows.cpp index 02a7791..a854053 100644 --- a/os_windows.cpp +++ b/os_windows.cpp @@ -182,7 +182,7 @@ os_does_file_exist(String path){ } function Array -os_list_dir(Allocator *a, String dir, U32 flags = LIST_NO_FLAGS){ +os_list_dir(Arena *a, String dir, U32 flags = LIST_NO_FLAGS){ Scratch scratch(a); Array dirs_to_read = {scratch}; dirs_to_read.add(dir);