From 34a048f7daaf93b16ae4121bf5238f9008f3465b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 9 Dec 2022 11:29:28 +0000 Subject: Replace compiler for loops for the hash-table types to simplify code usage --- src/docs_writer.cpp | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 5246971ff..313d7b25a 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -480,11 +480,11 @@ OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { if (found) { return *found; } - for_array(i, w->type_cache.entries) { + for (auto const &entry : w->type_cache) { // NOTE(bill): THIS IS SLOW - Type *other = w->type_cache.entries[i].key; + Type *other = entry.key; if (are_types_identical_unique_tuples(type, other)) { - OdinDocTypeIndex index = w->type_cache.entries[i].value; + OdinDocTypeIndex index = entry.value; map_set(&w->type_cache, type, index); return index; } @@ -914,23 +914,21 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { void odin_doc_update_entities(OdinDocWriter *w) { { // NOTE(bill): Double pass, just in case entities are created on odin_doc_type - auto entities = array_make(heap_allocator(), w->entity_cache.entries.count); + auto entities = array_make(heap_allocator(), 0, w->entity_cache.entries.count); defer (array_free(&entities)); - for_array(i, w->entity_cache.entries) { - Entity *e = w->entity_cache.entries[i].key; - entities[i] = e; + for (auto const &entry : w->entity_cache) { + array_add(&entities, entry.key); } - for_array(i, entities) { - Entity *e = entities[i]; + for (Entity *e : entities) { OdinDocTypeIndex type_index = odin_doc_type(w, e->type); gb_unused(type_index); } } - for_array(i, w->entity_cache.entries) { - Entity *e = w->entity_cache.entries[i].key; - OdinDocEntityIndex entity_index = w->entity_cache.entries[i].value; + for (auto const &entry : w->entity_cache) { + Entity *e = entry.key; + OdinDocEntityIndex entity_index = entry.value; OdinDocTypeIndex type_index = odin_doc_type(w, e->type); OdinDocEntityIndex foreign_library = 0; @@ -948,8 +946,8 @@ void odin_doc_update_entities(OdinDocWriter *w) { auto pges = array_make(heap_allocator(), 0, e->ProcGroup.entities.count); defer (array_free(&pges)); - for_array(j, e->ProcGroup.entities) { - OdinDocEntityIndex index = odin_doc_add_entity(w, e->ProcGroup.entities[j]); + for (Entity *entity : e->ProcGroup.entities) { + OdinDocEntityIndex index = odin_doc_add_entity(w, entity); array_add(&pges, index); } grouped_entities = odin_write_slice(w, pges.data, pges.count); @@ -979,9 +977,9 @@ OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPa auto entries = array_make(heap_allocator(), 0, w->entity_cache.entries.count); defer (array_free(&entries)); - for_array(i, pkg->scope->elements.entries) { - String name = pkg->scope->elements.entries[i].key.string; - Entity *e = pkg->scope->elements.entries[i].value; + for (auto const &entry : pkg->scope->elements) { + String name = entry.key.string; + Entity *e = entry.value; switch (e->kind) { case Entity_Invalid: case Entity_Nil: @@ -1021,8 +1019,8 @@ OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPa void odin_doc_write_docs(OdinDocWriter *w) { auto pkgs = array_make(heap_allocator(), 0, w->info->packages.entries.count); defer (array_free(&pkgs)); - for_array(i, w->info->packages.entries) { - AstPackage *pkg = w->info->packages.entries[i].value; + for (auto const &entry : w->info->packages) { + AstPackage *pkg = entry.value; if (build_context.cmd_doc_flags & CmdDocFlag_AllPackages) { array_add(&pkgs, pkg); } else { -- cgit v1.2.3 From be22f0d1e1d5bb7c822dd31b1b60d7863fca6264 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 9 Dec 2022 11:32:52 +0000 Subject: Fix variable shadow in compiler --- src/docs_writer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 313d7b25a..b7b17cb1a 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -977,9 +977,9 @@ OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPa auto entries = array_make(heap_allocator(), 0, w->entity_cache.entries.count); defer (array_free(&entries)); - for (auto const &entry : pkg->scope->elements) { - String name = entry.key.string; - Entity *e = entry.value; + for (auto const &element : pkg->scope->elements) { + String name = element.key.string; + Entity *e = element.value; switch (e->kind) { case Entity_Invalid: case Entity_Nil: -- cgit v1.2.3 From 66ce990e0b9072a49943b37630c8597713a5c6ae Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Dec 2022 21:51:04 +0000 Subject: `gb_internal` to docs and other auxiliary files --- src/bug_report.cpp | 12 +++++----- src/docs.cpp | 21 ++++++++--------- src/docs_format.cpp | 4 ++-- src/docs_writer.cpp | 68 ++++++++++++++++++++++++++--------------------------- src/query_data.cpp | 46 ++++++++++++++++++------------------ 5 files changed, 75 insertions(+), 76 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/bug_report.cpp b/src/bug_report.cpp index f4f1b51be..fbf616efb 100644 --- a/src/bug_report.cpp +++ b/src/bug_report.cpp @@ -30,7 +30,7 @@ NOTE(Jeroen): This prints the Windows product edition only, to be called from `print_platform_details`. */ #if defined(GB_SYSTEM_WINDOWS) -void report_windows_product_type(DWORD ProductType) { +gb_internal void report_windows_product_type(DWORD ProductType) { switch (ProductType) { case PRODUCT_ULTIMATE: gb_printf("Ultimate"); @@ -154,7 +154,7 @@ void report_windows_product_type(DWORD ProductType) { } #endif -void odin_cpuid(int leaf, int result[]) { +gb_internal void odin_cpuid(int leaf, int result[]) { #if defined(GB_CPU_ARM) return; @@ -169,7 +169,7 @@ void odin_cpuid(int leaf, int result[]) { #endif } -void report_cpu_info() { +gb_internal void report_cpu_info() { gb_printf("\tCPU: "); #if defined(GB_CPU_X86) @@ -220,7 +220,7 @@ void report_cpu_info() { /* Report the amount of installed RAM. */ -void report_ram_info() { +gb_internal void report_ram_info() { gb_printf("\tRAM: "); #if defined(GB_SYSTEM_WINDOWS) @@ -271,7 +271,7 @@ void report_ram_info() { #endif } -void report_os_info() { +gb_internal void report_os_info() { gb_printf("\tOS: "); #if defined(GB_SYSTEM_WINDOWS) @@ -966,7 +966,7 @@ void report_os_info() { } // NOTE(Jeroen): `odin report` prints some system information for easier bug reporting. -void print_bug_report_help() { +gb_internal void print_bug_report_help() { gb_printf("Where to find more information and get into contact when you encounter a bug:\n\n"); gb_printf("\tWebsite: https://odin-lang.org\n"); gb_printf("\tGitHub: https://github.com/odin-lang/Odin/issues\n"); diff --git a/src/docs.cpp b/src/docs.cpp index b07181e28..33b1e8361 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -28,7 +28,7 @@ gb_global char const *print_entity_names[Entity_Count] = { }; -GB_COMPARE_PROC(cmp_entities_for_printing) { +gb_internal GB_COMPARE_PROC(cmp_entities_for_printing) { GB_ASSERT(a != nullptr); GB_ASSERT(b != nullptr); Entity *x = *cast(Entity **)a; @@ -56,7 +56,7 @@ GB_COMPARE_PROC(cmp_entities_for_printing) { return res; } -GB_COMPARE_PROC(cmp_ast_package_by_name) { +gb_internal GB_COMPARE_PROC(cmp_ast_package_by_name) { GB_ASSERT(a != nullptr); GB_ASSERT(b != nullptr); AstPackage *x = *cast(AstPackage **)a; @@ -67,7 +67,7 @@ GB_COMPARE_PROC(cmp_ast_package_by_name) { #include "docs_format.cpp" #include "docs_writer.cpp" -void print_doc_line(i32 indent, String const &data) { +gb_internal void print_doc_line(i32 indent, String const &data) { while (indent --> 0) { gb_printf("\t"); } @@ -75,7 +75,7 @@ void print_doc_line(i32 indent, String const &data) { gb_printf("\n"); } -void print_doc_line(i32 indent, char const *fmt, ...) { +gb_internal void print_doc_line(i32 indent, char const *fmt, ...) { while (indent --> 0) { gb_printf("\t"); } @@ -85,7 +85,7 @@ void print_doc_line(i32 indent, char const *fmt, ...) { va_end(va); gb_printf("\n"); } -void print_doc_line_no_newline(i32 indent, char const *fmt, ...) { +gb_internal void print_doc_line_no_newline(i32 indent, char const *fmt, ...) { while (indent --> 0) { gb_printf("\t"); } @@ -94,7 +94,7 @@ void print_doc_line_no_newline(i32 indent, char const *fmt, ...) { gb_printf_va(fmt, va); va_end(va); } -void print_doc_line_no_newline(i32 indent, String const &data) { +gb_internal void print_doc_line_no_newline(i32 indent, String const &data) { while (indent --> 0) { gb_printf("\t"); } @@ -102,7 +102,7 @@ void print_doc_line_no_newline(i32 indent, String const &data) { } -bool print_doc_comment_group_string(i32 indent, CommentGroup *g) { +gb_internal bool print_doc_comment_group_string(i32 indent, CommentGroup *g) { if (g == nullptr) { return false; } @@ -191,7 +191,7 @@ bool print_doc_comment_group_string(i32 indent, CommentGroup *g) { -void print_doc_expr(Ast *expr) { +gb_internal void print_doc_expr(Ast *expr) { gbString s = nullptr; if (build_context.cmd_doc_flags & CmdDocFlag_Short) { s = expr_to_string_shorthand(expr); @@ -202,8 +202,7 @@ void print_doc_expr(Ast *expr) { gb_string_free(s); } - -void print_doc_package(CheckerInfo *info, AstPackage *pkg) { +gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) { if (pkg == nullptr) { return; } @@ -320,7 +319,7 @@ void print_doc_package(CheckerInfo *info, AstPackage *pkg) { } -void generate_documentation(Checker *c) { +gb_internal void generate_documentation(Checker *c) { CheckerInfo *info = &c->info; if (build_context.cmd_doc_flags & CmdDocFlag_DocFormat) { diff --git a/src/docs_format.cpp b/src/docs_format.cpp index b13b8b364..34114f08e 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -27,14 +27,14 @@ struct OdinDocHeaderBase { }; template -Slice from_array(OdinDocHeaderBase *base, OdinDocArray const &a) { +gb_internal Slice from_array(OdinDocHeaderBase *base, OdinDocArray const &a) { Slice s = {}; s.data = cast(T *)(cast(uintptr)base + cast(uintptr)a.offset); s.count = cast(isize)a.length; return s; } -String from_string(OdinDocHeaderBase *base, OdinDocString const &s) { +gb_internal String from_string(OdinDocHeaderBase *base, OdinDocString const &s) { String str = {}; str.text = cast(u8 *)(cast(uintptr)base + cast(uintptr)s.offset); str.len = cast(isize)s.length; diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index b7b17cb1a..bab97158d 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -11,7 +11,7 @@ enum OdinDocWriterState { OdinDocWriterState_Writing, }; -char const* OdinDocWriterState_strings[] { +gb_global char const* OdinDocWriterState_strings[] { "preparing", "writing ", }; @@ -40,17 +40,17 @@ struct OdinDocWriter { OdinDocWriterItemTracker blob; }; -OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e); -OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type); +gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e); +gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type); template -void odin_doc_writer_item_tracker_init(OdinDocWriterItemTracker *t, isize size) { +gb_internal void odin_doc_writer_item_tracker_init(OdinDocWriterItemTracker *t, isize size) { t->len = size; t->cap = size; } -void odin_doc_writer_prepare(OdinDocWriter *w) { +gb_internal void odin_doc_writer_prepare(OdinDocWriter *w) { w->state = OdinDocWriterState_Preparing; gbAllocator a = heap_allocator(); @@ -70,7 +70,7 @@ void odin_doc_writer_prepare(OdinDocWriter *w) { } -void odin_doc_writer_destroy(OdinDocWriter *w) { +gb_internal void odin_doc_writer_destroy(OdinDocWriter *w) { gb_free(heap_allocator(), w->data); string_map_destroy(&w->string_cache); @@ -83,7 +83,7 @@ void odin_doc_writer_destroy(OdinDocWriter *w) { template -void odin_doc_writer_tracker_size(isize *offset, OdinDocWriterItemTracker *t, isize alignment=1) { +gb_internal void odin_doc_writer_tracker_size(isize *offset, OdinDocWriterItemTracker *t, isize alignment=1) { isize size = t->cap*gb_size_of(T); isize align = gb_max(gb_align_of(T), alignment); *offset = align_formula_isize(*offset, align); @@ -91,7 +91,7 @@ void odin_doc_writer_tracker_size(isize *offset, OdinDocWriterItemTracker *t, *offset += size; } -isize odin_doc_writer_calc_total_size(OdinDocWriter *w) { +gb_internal isize odin_doc_writer_calc_total_size(OdinDocWriter *w) { isize total_size = gb_size_of(OdinDocHeader); odin_doc_writer_tracker_size(&total_size, &w->files); odin_doc_writer_tracker_size(&total_size, &w->pkgs); @@ -102,7 +102,7 @@ isize odin_doc_writer_calc_total_size(OdinDocWriter *w) { return total_size; } -void odin_doc_writer_start_writing(OdinDocWriter *w) { +gb_internal void odin_doc_writer_start_writing(OdinDocWriter *w) { w->state = OdinDocWriterState_Writing; string_map_clear(&w->string_cache); @@ -118,7 +118,7 @@ void odin_doc_writer_start_writing(OdinDocWriter *w) { w->header = cast(OdinDocHeader *)w->data; } -u32 hash_data_after_header(OdinDocHeaderBase *base, void *data, isize data_len) { +gb_internal u32 hash_data_after_header(OdinDocHeaderBase *base, void *data, isize data_len) { u8 *start = cast(u8 *)data; u8 *end = start + base->total_size; start += base->header_size; @@ -132,13 +132,13 @@ u32 hash_data_after_header(OdinDocHeaderBase *base, void *data, isize data_len) template -void odin_doc_writer_assign_tracker(OdinDocArray *array, OdinDocWriterItemTracker const &t) { +gb_internal void odin_doc_writer_assign_tracker(OdinDocArray *array, OdinDocWriterItemTracker const &t) { array->offset = cast(u32)t.offset; array->length = cast(u32)t.len; } -void odin_doc_writer_end_writing(OdinDocWriter *w) { +gb_internal void odin_doc_writer_end_writing(OdinDocWriter *w) { OdinDocHeader *h = w->header; gb_memmove(h->base.magic, OdinDocHeader_MagicString, gb_strlen(OdinDocHeader_MagicString)); @@ -156,7 +156,7 @@ void odin_doc_writer_end_writing(OdinDocWriter *w) { } template -u32 odin_doc_write_item(OdinDocWriter *w, OdinDocWriterItemTracker *t, T const *item, T **dst=nullptr) { +gb_internal u32 odin_doc_write_item(OdinDocWriter *w, OdinDocWriterItemTracker *t, T const *item, T **dst=nullptr) { if (w->state == OdinDocWriterState_Preparing) { t->cap += 1; if (dst) *dst = nullptr; @@ -175,7 +175,7 @@ u32 odin_doc_write_item(OdinDocWriter *w, OdinDocWriterItemTracker *t, T cons } template -T *odin_doc_get_item(OdinDocWriter *w, OdinDocWriterItemTracker *t, u32 index) { +gb_internal T *odin_doc_get_item(OdinDocWriter *w, OdinDocWriterItemTracker *t, u32 index) { if (w->state != OdinDocWriterState_Writing) { return nullptr; } @@ -184,7 +184,7 @@ T *odin_doc_get_item(OdinDocWriter *w, OdinDocWriterItemTracker *t, u32 index return cast(T *)data; } -OdinDocString odin_doc_write_string_without_cache(OdinDocWriter *w, String const &str) { +gb_internal OdinDocString odin_doc_write_string_without_cache(OdinDocWriter *w, String const &str) { OdinDocString res = {}; if (w->state == OdinDocWriterState_Preparing) { @@ -204,7 +204,7 @@ OdinDocString odin_doc_write_string_without_cache(OdinDocWriter *w, String const return res; } -OdinDocString odin_doc_write_string(OdinDocWriter *w, String const &str) { +gb_internal OdinDocString odin_doc_write_string(OdinDocWriter *w, String const &str) { OdinDocString *c = string_map_get(&w->string_cache, str); if (c != nullptr) { if (w->state == OdinDocWriterState_Writing) { @@ -223,7 +223,7 @@ OdinDocString odin_doc_write_string(OdinDocWriter *w, String const &str) { template -OdinDocArray odin_write_slice(OdinDocWriter *w, T *data, isize len) { +gb_internal OdinDocArray odin_write_slice(OdinDocWriter *w, T *data, isize len) { GB_ASSERT(gb_align_of(T) <= 4); if (len <= 0) { return {0, 0}; @@ -249,12 +249,12 @@ OdinDocArray odin_write_slice(OdinDocWriter *w, T *data, isize len) { template -OdinDocArray odin_write_item_as_slice(OdinDocWriter *w, T data) { +gb_internal OdinDocArray odin_write_item_as_slice(OdinDocWriter *w, T data) { return odin_write_slice(w, &data, 1); } -OdinDocPosition odin_doc_token_pos_cast(OdinDocWriter *w, TokenPos const &pos) { +gb_internal OdinDocPosition odin_doc_token_pos_cast(OdinDocWriter *w, TokenPos const &pos) { OdinDocFileIndex file_index = 0; if (pos.file_id != 0) { AstFile *file = global_files[pos.file_id]; @@ -273,7 +273,7 @@ OdinDocPosition odin_doc_token_pos_cast(OdinDocWriter *w, TokenPos const &pos) { return doc_pos; } -bool odin_doc_append_comment_group_string(Array *buf, CommentGroup *g) { +gb_internal bool odin_doc_append_comment_group_string(Array *buf, CommentGroup *g) { if (g == nullptr) { return false; } @@ -361,7 +361,7 @@ bool odin_doc_append_comment_group_string(Array *buf, CommentGroup *g) { return false; } -OdinDocString odin_doc_pkg_doc_string(OdinDocWriter *w, AstPackage *pkg) { +gb_internal OdinDocString odin_doc_pkg_doc_string(OdinDocWriter *w, AstPackage *pkg) { if (pkg == nullptr) { return {}; } @@ -378,7 +378,7 @@ OdinDocString odin_doc_pkg_doc_string(OdinDocWriter *w, AstPackage *pkg) { return odin_doc_write_string_without_cache(w, make_string(buf.data, buf.count)); } -OdinDocString odin_doc_comment_group_string(OdinDocWriter *w, CommentGroup *g) { +gb_internal OdinDocString odin_doc_comment_group_string(OdinDocWriter *w, CommentGroup *g) { if (g == nullptr) { return {}; } @@ -389,7 +389,7 @@ OdinDocString odin_doc_comment_group_string(OdinDocWriter *w, CommentGroup *g) { return odin_doc_write_string_without_cache(w, make_string(buf.data, buf.count)); } -OdinDocString odin_doc_expr_string(OdinDocWriter *w, Ast *expr) { +gb_internal OdinDocString odin_doc_expr_string(OdinDocWriter *w, Ast *expr) { if (expr == nullptr) { return {}; } @@ -402,7 +402,7 @@ OdinDocString odin_doc_expr_string(OdinDocWriter *w, Ast *expr) { return odin_doc_write_string(w, make_string(cast(u8 *)s, gb_string_length(s))); } -OdinDocArray odin_doc_attributes(OdinDocWriter *w, Array const &attributes) { +gb_internal OdinDocArray odin_doc_attributes(OdinDocWriter *w, Array const &attributes) { isize count = 0; for_array(i, attributes) { Ast *attr = attributes[i]; @@ -448,7 +448,7 @@ OdinDocArray odin_doc_attributes(OdinDocWriter *w, Array odin_doc_where_clauses(OdinDocWriter *w, Slice const &where_clauses) { +gb_internal OdinDocArray odin_doc_where_clauses(OdinDocWriter *w, Slice const &where_clauses) { if (where_clauses.count == 0) { return {}; } @@ -462,17 +462,17 @@ OdinDocArray odin_doc_where_clauses(OdinDocWriter *w, Slice odin_doc_type_as_slice(OdinDocWriter *w, Type *type) { +gb_internal OdinDocArray odin_doc_type_as_slice(OdinDocWriter *w, Type *type) { OdinDocTypeIndex index = odin_doc_type(w, type); return odin_write_item_as_slice(w, index); } -OdinDocArray odin_doc_add_entity_as_slice(OdinDocWriter *w, Entity *e) { +gb_internal OdinDocArray odin_doc_add_entity_as_slice(OdinDocWriter *w, Entity *e) { OdinDocEntityIndex index = odin_doc_add_entity(w, e); return odin_write_item_as_slice(w, index); } -OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { +gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { if (type == nullptr) { return 0; } @@ -750,7 +750,7 @@ OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { } return type_index; } -OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { +gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { if (e == nullptr) { return 0; } @@ -911,7 +911,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { return doc_entity_index; } -void odin_doc_update_entities(OdinDocWriter *w) { +gb_internal void odin_doc_update_entities(OdinDocWriter *w) { { // NOTE(bill): Double pass, just in case entities are created on odin_doc_type auto entities = array_make(heap_allocator(), 0, w->entity_cache.entries.count); @@ -966,7 +966,7 @@ void odin_doc_update_entities(OdinDocWriter *w) { -OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPackage *pkg) { +gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPackage *pkg) { if (pkg->scope == nullptr) { return {}; } @@ -1016,7 +1016,7 @@ OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPa } -void odin_doc_write_docs(OdinDocWriter *w) { +gb_internal void odin_doc_write_docs(OdinDocWriter *w) { auto pkgs = array_make(heap_allocator(), 0, w->info->packages.entries.count); defer (array_free(&pkgs)); for (auto const &entry : w->info->packages) { @@ -1091,7 +1091,7 @@ void odin_doc_write_docs(OdinDocWriter *w) { } -void odin_doc_write_to_file(OdinDocWriter *w, char const *filename) { +gb_internal void odin_doc_write_to_file(OdinDocWriter *w, char const *filename) { gbFile f = {}; gbFileError err = gb_file_open_mode(&f, gbFileMode_Write, filename); if (err != gbFileError_None) { @@ -1106,7 +1106,7 @@ void odin_doc_write_to_file(OdinDocWriter *w, char const *filename) { } } -void odin_doc_write(CheckerInfo *info, char const *filename) { +gb_internal void odin_doc_write(CheckerInfo *info, char const *filename) { OdinDocWriter w_ = {}; OdinDocWriter *w = &w_; defer (odin_doc_writer_destroy(w)); diff --git a/src/query_data.cpp b/src/query_data.cpp index ebf955fd4..86487a058 100644 --- a/src/query_data.cpp +++ b/src/query_data.cpp @@ -1,7 +1,7 @@ struct QueryValue; struct QueryValuePair; -gbAllocator query_value_allocator = {}; +gb_global gbAllocator query_value_allocator = {}; enum QueryKind { Query_Invalid, @@ -189,16 +189,16 @@ struct QueryValueMap : QueryValue { return v; \ } -DEF_QUERY_PROC(QueryValueString, String const &, query_value_string); -DEF_QUERY_PROC(QueryValueBoolean, bool, query_value_boolean); -DEF_QUERY_PROC(QueryValueInteger, i64, query_value_integer); -DEF_QUERY_PROC(QueryValueFloat, f64, query_value_float); -DEF_QUERY_PROC(QueryValueArray, Array const &, query_value_array); -DEF_QUERY_PROC(QueryValueMap, Array const &, query_value_map); -DEF_QUERY_PROC0(QueryValueArray, query_value_array); -DEF_QUERY_PROC0(QueryValueMap, query_value_map); +gb_internal DEF_QUERY_PROC(QueryValueString, String const &, query_value_string); +gb_internal DEF_QUERY_PROC(QueryValueBoolean, bool, query_value_boolean); +gb_internal DEF_QUERY_PROC(QueryValueInteger, i64, query_value_integer); +gb_internal DEF_QUERY_PROC(QueryValueFloat, f64, query_value_float); +gb_internal DEF_QUERY_PROC(QueryValueArray, Array const &, query_value_array); +gb_internal DEF_QUERY_PROC(QueryValueMap, Array const &, query_value_map); +gb_internal DEF_QUERY_PROC0(QueryValueArray, query_value_array); +gb_internal DEF_QUERY_PROC0(QueryValueMap, query_value_map); -isize qprintf(bool format, isize indent, char const *fmt, ...) { +gb_internal isize qprintf(bool format, isize indent, char const *fmt, ...) { if (format) while (indent --> 0) { gb_printf("\t"); } @@ -209,7 +209,7 @@ isize qprintf(bool format, isize indent, char const *fmt, ...) { return res; } -bool qv_valid_char(u8 c) { +gb_internal bool qv_valid_char(u8 c) { if (c >= 0x80) { return false; } @@ -227,7 +227,7 @@ bool qv_valid_char(u8 c) { return true; } -void print_query_data_as_json(QueryValue *value, bool format = true, isize indent = 0) { +gb_internal void print_query_data_as_json(QueryValue *value, bool format = true, isize indent = 0) { if (value == nullptr) { gb_printf("null"); return; @@ -359,7 +359,7 @@ void print_query_data_as_json(QueryValue *value, bool format = true, isize inden -int query_data_package_compare(void const *a, void const *b) { +gb_internal int query_data_package_compare(void const *a, void const *b) { AstPackage *x = *cast(AstPackage *const *)a; AstPackage *y = *cast(AstPackage *const *)b; @@ -377,7 +377,7 @@ int query_data_package_compare(void const *a, void const *b) { return 0; } -int query_data_definition_compare(void const *a, void const *b) { +gb_internal int query_data_definition_compare(void const *a, void const *b) { Entity *x = *cast(Entity *const *)a; Entity *y = *cast(Entity *const *)b; @@ -399,7 +399,7 @@ int query_data_definition_compare(void const *a, void const *b) { return string_compare(x->token.string, y->token.string); } -int entity_name_compare(void const *a, void const *b) { +gb_internal int entity_name_compare(void const *a, void const *b) { Entity *x = *cast(Entity *const *)a; Entity *y = *cast(Entity *const *)b; if (x == y) { @@ -413,10 +413,10 @@ int entity_name_compare(void const *a, void const *b) { } -void generate_and_print_query_data_global_definitions(Checker *c, Timings *timings); -void generate_and_print_query_data_go_to_definitions(Checker *c); +gb_internal void generate_and_print_query_data_global_definitions(Checker *c, Timings *timings); +gb_internal void generate_and_print_query_data_go_to_definitions(Checker *c); -void generate_and_print_query_data(Checker *c, Timings *timings) { +gb_internal void generate_and_print_query_data(Checker *c, Timings *timings) { query_value_allocator = heap_allocator(); switch (build_context.query_data_set_settings.kind) { case QueryDataSet_GlobalDefinitions: @@ -429,7 +429,7 @@ void generate_and_print_query_data(Checker *c, Timings *timings) { } -void generate_and_print_query_data_global_definitions(Checker *c, Timings *timings) { +gb_internal void generate_and_print_query_data_global_definitions(Checker *c, Timings *timings) { auto *root = query_value_map(); if (global_error_collector.errors.count > 0) { @@ -805,7 +805,7 @@ struct BinaryArray { }; template -Array binary_array_from_data(BinaryArray ba, void *data) { +gb_internal Array binary_array_from_data(BinaryArray ba, void *data) { Array res = {}; res.data = cast(T *)(cast(u8 *)data + ba.offset); res.count = ba.length; @@ -841,7 +841,7 @@ struct GoToDefFileMap { }; -int go_to_def_file_map_compare(void const *a, void const *b) { +gb_internal int go_to_def_file_map_compare(void const *a, void const *b) { GoToDefFileMap const *x = cast(GoToDefFileMap const *)a; GoToDefFileMap const *y = cast(GoToDefFileMap const *)b; if (x == y) { @@ -859,7 +859,7 @@ int go_to_def_file_map_compare(void const *a, void const *b) { return 0; } -int quick_ident_compare(void const *a, void const *b) { +gb_internal int quick_ident_compare(void const *a, void const *b) { Ast *x = *cast(Ast **)a; Ast *y = *cast(Ast **)b; @@ -873,7 +873,7 @@ int quick_ident_compare(void const *a, void const *b) { } -void generate_and_print_query_data_go_to_definitions(Checker *c) { +gb_internal void generate_and_print_query_data_go_to_definitions(Checker *c) { GB_ASSERT(c->info.allow_identifier_uses); gbAllocator a = query_value_allocator; -- cgit v1.2.3 From 252be0fb417f9cdde5e9c4b348cd995a20433aea Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 3 Jan 2023 11:59:52 +0000 Subject: Make all maps use heap allocator implicitly --- src/check_builtin.cpp | 2 +- src/check_expr.cpp | 3 +-- src/check_stmt.cpp | 1 - src/checker.cpp | 33 +++++++++++++++------------------ src/common.cpp | 2 +- src/docs_writer.cpp | 11 +++++------ src/llvm_backend_general.cpp | 44 ++++++++++++++++++++++---------------------- src/llvm_backend_proc.cpp | 10 +++++----- src/main.cpp | 2 +- src/ptr_map.cpp | 18 ++++++++++++++---- src/string_map.cpp | 18 ++++++++++++++---- 11 files changed, 79 insertions(+), 65 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 36dc9b7a1..af196234e 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1110,7 +1110,7 @@ gb_internal bool cache_load_file_directive(CheckerContext *c, Ast *call, String new_cache->path = path; new_cache->data = data; new_cache->file_error = file_error; - string_map_init(&new_cache->hashes, heap_allocator(), 32); + string_map_init(&new_cache->hashes, 32); string_map_set(&c->info->load_file_cache, path, new_cache); if (cache_) *cache_ = new_cache; } else { diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 7a00b5353..030bfb8e6 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5753,7 +5753,7 @@ gb_internal CallArgumentData check_call_arguments(CheckerContext *c, Operand *op // in order to improve the type inference system StringMap type_hint_map = {}; // Key: String - string_map_init(&type_hint_map, heap_allocator(), 2*args.count); + string_map_init(&type_hint_map, 2*args.count); defer (string_map_destroy(&type_hint_map)); Type *ptype = nullptr; @@ -8283,7 +8283,6 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * bool is_partial = cl->tag && (cl->tag->BasicDirective.name.string == "partial"); SeenMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue - map_init(&seen, heap_allocator()); defer (map_destroy(&seen)); if (cl->elems.count > 0 && cl->elems[0]->kind == Ast_FieldValue) { diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 945ba8f02..7192b16b5 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -929,7 +929,6 @@ gb_internal void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags } SeenMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue - map_init(&seen, heap_allocator()); defer (map_destroy(&seen)); for_array(stmt_index, bs->stmts) { diff --git a/src/checker.cpp b/src/checker.cpp index 8da659461..8779d9d45 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -221,7 +221,7 @@ gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { gb_internal Scope *create_scope(CheckerInfo *info, Scope *parent, isize init_elements_capacity=DEFAULT_SCOPE_CAPACITY) { Scope *s = gb_alloc_item(permanent_allocator(), Scope); s->parent = parent; - string_map_init(&s->elements, heap_allocator(), init_elements_capacity); + string_map_init(&s->elements, init_elements_capacity); ptr_set_init(&s->imported, 0); if (parent != nullptr && parent != builtin_pkg->scope) { @@ -1135,14 +1135,14 @@ gb_internal void init_checker_info(CheckerInfo *i) { array_init(&i->definitions, a); array_init(&i->entities, a); - map_init(&i->global_untyped, a); - string_map_init(&i->foreigns, a); - map_init(&i->gen_procs, a); - map_init(&i->gen_types, a); + map_init(&i->global_untyped); + string_map_init(&i->foreigns); + map_init(&i->gen_procs); + map_init(&i->gen_types); array_init(&i->type_info_types, a); - map_init(&i->type_info_map, a); - string_map_init(&i->files, a); - string_map_init(&i->packages, a); + map_init(&i->type_info_map); + string_map_init(&i->files); + string_map_init(&i->packages); array_init(&i->variable_init_order, a); array_init(&i->testing_procedures, a, 0, 0); array_init(&i->init_procedures, a, 0, 0); @@ -1160,8 +1160,8 @@ gb_internal void init_checker_info(CheckerInfo *i) { mpmc_init(&i->intrinsics_entry_point_usage, a, 1<<10); // just waste some memory here, even if it probably never used - map_init(&i->objc_msgSend_types, a); - string_map_init(&i->load_file_cache, a); + map_init(&i->objc_msgSend_types); + string_map_init(&i->load_file_cache); array_init(&i->all_procedures, heap_allocator()); @@ -2490,7 +2490,7 @@ gb_internal bool is_entity_a_dependency(Entity *e) { gb_internal Array generate_entity_dependency_graph(CheckerInfo *info, gbAllocator allocator) { PtrMap M = {}; - map_init(&M, allocator, info->entities.count); + map_init(&M, info->entities.count); defer (map_destroy(&M)); for_array(i, info->entities) { Entity *e = info->entities[i]; @@ -4200,7 +4200,7 @@ gb_internal void add_import_dependency_node(Checker *c, Ast *decl, PtrMap generate_import_dependency_graph(Checker *c) { PtrMap M = {}; - map_init(&M, heap_allocator(), 2*c->parser->packages.count); + map_init(&M, 2*c->parser->packages.count); defer (map_destroy(&M)); for_array(i, c->parser->packages) { @@ -4688,7 +4688,7 @@ gb_internal void check_collect_entities_all(Checker *c) { auto *wd = &collect_entity_worker_data[i]; wd->c = c; wd->ctx = make_checker_context(c); - map_init(&wd->untyped, heap_allocator()); + map_init(&wd->untyped); } for (auto const &entry : c->info.files.entries) { @@ -4804,7 +4804,6 @@ gb_internal void check_import_entities(Checker *c) { CheckerContext ctx = make_checker_context(c); UntypedExprInfoMap untyped = {}; - map_init(&untyped, heap_allocator()); defer (map_destroy(&untyped)); isize min_pkg_index = 0; @@ -5159,7 +5158,6 @@ gb_internal void check_unchecked_bodies(Checker *c) { GB_ASSERT(c->procs_to_check.count == 0); UntypedExprInfoMap untyped = {}; - map_init(&untyped, heap_allocator()); defer (map_destroy(&untyped)); // use the `procs_to_check` array @@ -5212,7 +5210,6 @@ gb_internal void check_unchecked_bodies(Checker *c) { gb_internal void check_safety_all_procedures_for_unchecked(Checker *c) { GB_ASSERT(DEBUG_CHECK_ALL_PROCEDURES); UntypedExprInfoMap untyped = {}; - map_init(&untyped, heap_allocator()); defer (map_destroy(&untyped)); @@ -5345,7 +5342,7 @@ gb_internal void check_procedure_bodies(Checker *c) { for (isize i = 0; i < thread_count; i++) { check_procedure_bodies_worker_data[i].c = c; - map_init(&check_procedure_bodies_worker_data[i].untyped, heap_allocator()); + map_init(&check_procedure_bodies_worker_data[i].untyped); } defer (for (isize i = 0; i < thread_count; i++) { @@ -5545,7 +5542,7 @@ gb_internal void check_deferred_procedures(Checker *c) { gb_internal void check_unique_package_names(Checker *c) { StringMap pkgs = {}; // Key: package name - string_map_init(&pkgs, heap_allocator(), 2*c->info.packages.entries.count); + string_map_init(&pkgs, 2*c->info.packages.entries.count); defer (string_map_destroy(&pkgs)); for (auto const &entry : c->info.packages) { diff --git a/src/common.cpp b/src/common.cpp index 3b6ea59e8..199a263a1 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -373,7 +373,7 @@ gb_internal char const *string_intern(String const &string) { } gb_internal void init_string_interner(void) { - map_init(&string_intern_map, heap_allocator()); + map_init(&string_intern_map); } diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index bab97158d..2aefe29eb 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -53,13 +53,12 @@ gb_internal void odin_doc_writer_item_tracker_init(OdinDocWriterItemTracker * gb_internal void odin_doc_writer_prepare(OdinDocWriter *w) { w->state = OdinDocWriterState_Preparing; - gbAllocator a = heap_allocator(); - string_map_init(&w->string_cache, a); + string_map_init(&w->string_cache); - map_init(&w->file_cache, a); - map_init(&w->pkg_cache, a); - map_init(&w->entity_cache, a); - map_init(&w->type_cache, a); + map_init(&w->file_cache); + map_init(&w->pkg_cache); + map_init(&w->entity_cache); + map_init(&w->type_cache); odin_doc_writer_item_tracker_init(&w->files, 1); odin_doc_writer_item_tracker_init(&w->pkgs, 1); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 75675474a..a849929f0 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -55,30 +55,30 @@ gb_internal void lb_init_module(lbModule *m, Checker *c) { } gbAllocator a = heap_allocator(); - map_init(&m->types, a); - map_init(&m->func_raw_types, a); - map_init(&m->struct_field_remapping, a); - map_init(&m->values, a); - map_init(&m->soa_values, a); - string_map_init(&m->members, a); - map_init(&m->procedure_values, a); - string_map_init(&m->procedures, a); - string_map_init(&m->const_strings, a); - map_init(&m->function_type_map, a); - map_init(&m->equal_procs, a); - map_init(&m->hasher_procs, a); - map_init(&m->map_get_procs, a); - map_init(&m->map_set_procs, a); + map_init(&m->types); + map_init(&m->func_raw_types); + map_init(&m->struct_field_remapping); + map_init(&m->values); + map_init(&m->soa_values); + string_map_init(&m->members); + map_init(&m->procedure_values); + string_map_init(&m->procedures); + string_map_init(&m->const_strings); + map_init(&m->function_type_map); + map_init(&m->equal_procs); + map_init(&m->hasher_procs); + map_init(&m->map_get_procs); + map_init(&m->map_set_procs); array_init(&m->procedures_to_generate, a, 0, 1024); array_init(&m->missing_procedures_to_check, a, 0, 16); - map_init(&m->debug_values, a); + map_init(&m->debug_values); array_init(&m->debug_incomplete_types, a, 0, 1024); - string_map_init(&m->objc_classes, a); - string_map_init(&m->objc_selectors, a); + string_map_init(&m->objc_classes); + string_map_init(&m->objc_selectors); - map_init(&m->map_info_map, a, 0); - map_init(&m->map_cell_info_map, a, 0); + map_init(&m->map_info_map, 0); + map_init(&m->map_cell_info_map, 0); } @@ -127,9 +127,9 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { gen->info = &c->info; - map_init(&gen->modules, permanent_allocator(), gen->info->packages.entries.count*2); - map_init(&gen->modules_through_ctx, permanent_allocator(), gen->info->packages.entries.count*2); - map_init(&gen->anonymous_proc_lits, heap_allocator(), 1024); + map_init(&gen->modules, gen->info->packages.entries.count*2); + map_init(&gen->modules_through_ctx, gen->info->packages.entries.count*2); + map_init(&gen->anonymous_proc_lits, 1024); array_init(&gen->foreign_libraries, heap_allocator(), 0, 1024); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 7245bdd80..c66462bc1 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -119,9 +119,9 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i p->branch_blocks.allocator = a; p->context_stack.allocator = a; p->scope_stack.allocator = a; - map_init(&p->selector_values, a, 0); - map_init(&p->selector_addr, a, 0); - map_init(&p->tuple_fix_map, a, 0); + map_init(&p->selector_values, 0); + map_init(&p->selector_addr, 0); + map_init(&p->tuple_fix_map, 0); if (p->is_foreign) { lb_add_foreign_library_path(p->module, entity->Procedure.foreign_library); @@ -345,7 +345,7 @@ gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name p->blocks.allocator = a; p->branch_blocks.allocator = a; p->context_stack.allocator = a; - map_init(&p->tuple_fix_map, a, 0); + map_init(&p->tuple_fix_map, 0); char *c_link_name = alloc_cstring(permanent_allocator(), p->name); @@ -486,7 +486,7 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) { p->entry_block = lb_create_block(p, "entry", true); lb_start_block(p, p->entry_block); - map_init(&p->direct_parameters, heap_allocator()); + map_init(&p->direct_parameters); GB_ASSERT(p->type != nullptr); diff --git a/src/main.cpp b/src/main.cpp index 91dcbdb01..7ac78241e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2516,7 +2516,7 @@ int main(int arg_count, char const **arg_ptr) { add_library_collection(str_lit("core"), get_fullpath_relative(heap_allocator(), odin_root_dir(), str_lit("core"))); add_library_collection(str_lit("vendor"), get_fullpath_relative(heap_allocator(), odin_root_dir(), str_lit("vendor"))); - map_init(&build_context.defined_values, heap_allocator()); + map_init(&build_context.defined_values); build_context.extra_packages.allocator = heap_allocator(); string_set_init(&build_context.test_names); diff --git a/src/ptr_map.cpp b/src/ptr_map.cpp index 434680e91..083cd6697 100644 --- a/src/ptr_map.cpp +++ b/src/ptr_map.cpp @@ -46,7 +46,7 @@ gb_internal gb_inline u32 ptr_map_hash_key(void const *key) { } -template gb_internal void map_init (PtrMap *h, gbAllocator a, isize capacity = 16); +template gb_internal void map_init (PtrMap *h, isize capacity = 16); template gb_internal void map_destroy (PtrMap *h); template gb_internal V * map_get (PtrMap *h, K key); template gb_internal void map_set (PtrMap *h, K key, V const &value); @@ -68,11 +68,15 @@ template gb_internal void multi_map_remove (PtrMap< template gb_internal void multi_map_remove_all(PtrMap *h, K key); #endif +gb_internal gbAllocator map_allocator(void) { + return heap_allocator(); +} + template -gb_internal gb_inline void map_init(PtrMap *h, gbAllocator a, isize capacity) { +gb_internal gb_inline void map_init(PtrMap *h, isize capacity) { capacity = next_pow2_isize(capacity); - slice_init(&h->hashes, a, capacity); - array_init(&h->entries, a, 0, capacity); + slice_init(&h->hashes, map_allocator(), capacity); + array_init(&h->entries, map_allocator(), 0, capacity); for (isize i = 0; i < capacity; i++) { h->hashes.data[i] = MAP_SENTINEL; } @@ -80,6 +84,9 @@ gb_internal gb_inline void map_init(PtrMap *h, gbAllocator a, isize capaci template gb_internal gb_inline void map_destroy(PtrMap *h) { + if (h->entries.allocator.proc == nullptr) { + h->entries.allocator = map_allocator(); + } slice_free(&h->hashes, h->entries.allocator); array_free(&h->entries); } @@ -162,6 +169,9 @@ gb_internal void map_reset_entries(PtrMap *h) { template gb_internal void map_reserve(PtrMap *h, isize cap) { + if (h->entries.allocator.proc == nullptr) { + h->entries.allocator = map_allocator(); + } array_reserve(&h->entries, cap); if (h->entries.count*2 < h->hashes.count) { return; diff --git a/src/string_map.cpp b/src/string_map.cpp index 9f9374ece..b5db63e90 100644 --- a/src/string_map.cpp +++ b/src/string_map.cpp @@ -35,7 +35,7 @@ struct StringMap { }; -template gb_internal void string_map_init (StringMap *h, gbAllocator a, isize capacity = 16); +template gb_internal void string_map_init (StringMap *h, isize capacity = 16); template gb_internal void string_map_destroy (StringMap *h); template gb_internal T * string_map_get (StringMap *h, char const *key); @@ -56,11 +56,15 @@ template gb_internal void string_map_grow (StringMap template gb_internal void string_map_rehash (StringMap *h, isize new_count); template gb_internal void string_map_reserve (StringMap *h, isize cap); +gb_internal gbAllocator string_map_allocator(void) { + return heap_allocator(); +} + template -gb_internal gb_inline void string_map_init(StringMap *h, gbAllocator a, isize capacity) { +gb_internal gb_inline void string_map_init(StringMap *h, isize capacity) { capacity = next_pow2_isize(capacity); - slice_init(&h->hashes, a, capacity); - array_init(&h->entries, a, 0, capacity); + slice_init(&h->hashes, string_map_allocator(), capacity); + array_init(&h->entries, string_map_allocator(), 0, capacity); for (isize i = 0; i < capacity; i++) { h->hashes.data[i] = MAP_SENTINEL; } @@ -68,6 +72,9 @@ gb_internal gb_inline void string_map_init(StringMap *h, gbAllocator a, isize template gb_internal gb_inline void string_map_destroy(StringMap *h) { + if (h->entries.allocator.proc == nullptr) { + h->entries.allocator = string_map_allocator(); + } slice_free(&h->hashes, h->entries.allocator); array_free(&h->entries); } @@ -147,6 +154,9 @@ gb_internal void string_map_reset_entries(StringMap *h) { template gb_internal void string_map_reserve(StringMap *h, isize cap) { + if (h->entries.allocator.proc == nullptr) { + h->entries.allocator = string_map_allocator(); + } array_reserve(&h->entries, cap); if (h->entries.count*2 < h->hashes.count) { return; -- cgit v1.2.3 From 1ab90de4931f07ea61b1195de602f282a853568b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Jan 2023 12:33:42 +0000 Subject: Minimize `StringMap` structure usage --- src/check_expr.cpp | 2 +- src/check_stmt.cpp | 4 +- src/checker.cpp | 10 +- src/common_memory.cpp | 7 +- src/docs.cpp | 4 +- src/docs_writer.cpp | 4 +- src/llvm_backend.cpp | 4 +- src/llvm_backend_general.cpp | 4 +- src/string_map.cpp | 226 ++++++++++++++++++++++++------------------- 9 files changed, 146 insertions(+), 119 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 52efd9a66..ff74a2547 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -234,7 +234,7 @@ gb_internal void check_did_you_mean_type(String const &name, Slice con gb_internal void check_did_you_mean_scope(String const &name, Scope *scope, char const *prefix = "") { ERROR_BLOCK(); - DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), scope->elements.entries.count, name); + DidYouMeanAnswers d = did_you_mean_make(heap_allocator(), scope->elements.count, name); defer (did_you_mean_destroy(&d)); rw_mutex_shared_lock(&scope->mutex); diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index a2a688b13..21df1d0ea 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -626,7 +626,7 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, defer (rw_mutex_unlock(&scope->mutex)); for (auto const &entry : scope->elements) { - String name = entry.key.string; + String name = entry.key; Entity *decl = entry.value; if (!is_entity_exported(decl)) continue; @@ -1323,7 +1323,7 @@ gb_internal void check_block_stmt_for_errors(CheckerContext *ctx, Ast *body) { ast_node(bs, BlockStmt, body); // NOTE(bill, 2020-09-23): This logic is prevent common erros with block statements // e.g. if cond { x := 123; } // this is an error - if (bs->scope != nullptr && bs->scope->elements.entries.count > 0) { + if (bs->scope != nullptr && bs->scope->elements.count > 0) { if (bs->scope->parent->node != nullptr) { switch (bs->scope->parent->node->kind) { case Ast_IfStmt: diff --git a/src/checker.cpp b/src/checker.cpp index 770e0d473..39a132060 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -765,7 +765,7 @@ gb_internal AstPackage *get_core_package(CheckerInfo *info, String name) { gb_printf_err("Fullpath: %.*s\n", LIT(path)); for (auto const &entry : info->packages) { - gb_printf_err("%.*s\n", LIT(entry.key.string)); + gb_printf_err("%.*s\n", LIT(entry.key)); } GB_ASSERT_MSG(found != nullptr, "Missing core package %.*s", LIT(name)); } @@ -3891,16 +3891,16 @@ gb_internal bool correct_single_type_alias(CheckerContext *c, Entity *e) { } gb_internal bool correct_type_alias_in_scope_backwards(CheckerContext *c, Scope *s) { - isize n = s->elements.entries.count; bool correction = false; - for (isize i = n-1; i >= 0; i--) { + u32 n = s->elements.count; + for (u32 i = n-1; i < n; i--) { correction |= correct_single_type_alias(c, s->elements.entries[i].value); } return correction; } gb_internal bool correct_type_alias_in_scope_forwards(CheckerContext *c, Scope *s) { - isize n = s->elements.entries.count; bool correction = false; + u32 n = s->elements.count; for (isize i = 0; i < n; i++) { correction |= correct_single_type_alias(c, s->elements.entries[i].value); } @@ -5539,7 +5539,7 @@ gb_internal void check_deferred_procedures(Checker *c) { gb_internal void check_unique_package_names(Checker *c) { StringMap pkgs = {}; // Key: package name - string_map_init(&pkgs, 2*c->info.packages.entries.count); + string_map_init(&pkgs, 2*c->info.packages.count); defer (string_map_destroy(&pkgs)); for (auto const &entry : c->info.packages) { diff --git a/src/common_memory.cpp b/src/common_memory.cpp index 7d5d1f27a..22b91d8cb 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -509,15 +509,15 @@ gb_internal GB_ALLOCATOR_PROC(heap_allocator_proc) { template -gb_internal void resize_array_raw(T **array, gbAllocator const &a, isize old_count, isize new_count) { +gb_internal isize resize_array_raw(T **array, gbAllocator const &a, isize old_count, isize new_count) { GB_ASSERT(new_count >= 0); if (new_count == 0) { gb_free(a, *array); *array = nullptr; - return; + return 0; } if (new_count < old_count) { - return; + return old_count; } isize old_size = old_count * gb_size_of(T); isize new_size = new_count * gb_size_of(T); @@ -525,5 +525,6 @@ gb_internal void resize_array_raw(T **array, gbAllocator const &a, isize old_cou auto new_data = cast(T *)gb_resize_align(a, *array, old_size, new_size, alignment); GB_ASSERT(new_data != nullptr); *array = new_data; + return new_count; } diff --git a/src/docs.cpp b/src/docs.cpp index b1efa2b46..54bb0c7a2 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -210,7 +210,7 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) { } if (pkg->scope != nullptr) { - auto entities = array_make(heap_allocator(), 0, pkg->scope->elements.entries.count); + auto entities = array_make(heap_allocator(), 0, pkg->scope->elements.count); defer (array_free(&entities)); for (auto const &entry : pkg->scope->elements) { Entity *e = entry.value; @@ -348,7 +348,7 @@ gb_internal void generate_documentation(Checker *c) { odin_doc_write(info, output_file_path); } else { - auto pkgs = array_make(permanent_allocator(), 0, info->packages.entries.count); + auto pkgs = array_make(permanent_allocator(), 0, info->packages.count); for (auto const &entry : info->packages) { AstPackage *pkg = entry.value; if (build_context.cmd_doc_flags & CmdDocFlag_AllPackages) { diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 2aefe29eb..ea0946153 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -977,7 +977,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit defer (array_free(&entries)); for (auto const &element : pkg->scope->elements) { - String name = element.key.string; + String name = element.key; Entity *e = element.value; switch (e->kind) { case Entity_Invalid: @@ -1016,7 +1016,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit gb_internal void odin_doc_write_docs(OdinDocWriter *w) { - auto pkgs = array_make(heap_allocator(), 0, w->info->packages.entries.count); + auto pkgs = array_make(heap_allocator(), 0, w->info->packages.count); defer (array_free(&pkgs)); for (auto const &entry : w->info->packages) { AstPackage *pkg = entry.value; diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 148511028..6cd224324 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1035,14 +1035,14 @@ gb_internal void lb_finalize_objc_names(lbProcedure *p) { LLVMSetLinkage(p->value, LLVMInternalLinkage); lb_begin_procedure_body(p); for (auto const &entry : m->objc_classes) { - String name = entry.key.string; + String name = entry.key; args[0] = lb_const_value(m, t_cstring, exact_value_string(name)); lbValue ptr = lb_emit_runtime_call(p, "objc_lookUpClass", args); lb_addr_store(p, entry.value, ptr); } for (auto const &entry : m->objc_selectors) { - String name = entry.key.string; + String name = entry.key; args[0] = lb_const_value(m, t_cstring, exact_value_string(name)); lbValue ptr = lb_emit_runtime_call(p, "sel_registerName", args); lb_addr_store(p, entry.value, ptr); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index c4f6ccc91..e7c9a0985 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -130,8 +130,8 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { gen->info = &c->info; - map_init(&gen->modules, gen->info->packages.entries.count*2); - map_init(&gen->modules_through_ctx, gen->info->packages.entries.count*2); + map_init(&gen->modules, gen->info->packages.count*2); + map_init(&gen->modules_through_ctx, gen->info->packages.count*2); map_init(&gen->anonymous_proc_lits, 1024); diff --git a/src/string_map.cpp b/src/string_map.cpp index f7ecc4acc..3bd08d09f 100644 --- a/src/string_map.cpp +++ b/src/string_map.cpp @@ -1,3 +1,5 @@ +GB_STATIC_ASSERT(sizeof(MapIndex) == sizeof(u32)); + struct StringHashKey { u32 hash; String string; @@ -9,101 +11,108 @@ struct StringHashKey { return this->string; } }; +gb_internal gb_inline u32 string_hash(String const &s) { + return fnv32a(s.text, s.len) & 0x7fffffff; +} gb_internal gb_inline StringHashKey string_hash_string(String const &s) { StringHashKey hash_key = {}; - hash_key.hash = fnv32a(s.text, s.len); + hash_key.hash = string_hash(s); hash_key.string = s; return hash_key; } - -gb_internal gb_inline bool string_hash_key_equal(StringHashKey const &a, StringHashKey const &b) { - if (a.hash == b.hash) { - // NOTE(bill): If two string's hashes collide, compare the strings themselves - return a.string == b.string; - } - return false; -} - template struct StringMapEntry { - StringHashKey key; + String key; + u32 hash; MapIndex next; T value; }; template struct StringMap { - Slice hashes; - Array > entries; + MapIndex * hashes; + usize hashes_count; + StringMapEntry *entries; + u32 count; + u32 entries_capacity; }; -template gb_internal void string_map_init (StringMap *h, isize capacity = 16); -template gb_internal void string_map_destroy (StringMap *h); +template gb_internal void string_map_init (StringMap *h, usize capacity = 16); +template gb_internal void string_map_destroy (StringMap *h); -template gb_internal T * string_map_get (StringMap *h, char const *key); -template gb_internal T * string_map_get (StringMap *h, String const &key); -template gb_internal T * string_map_get (StringMap *h, StringHashKey const &key); +template gb_internal T * string_map_get (StringMap *h, char const *key); +template gb_internal T * string_map_get (StringMap *h, String const &key); +template gb_internal T * string_map_get (StringMap *h, StringHashKey const &key); -template gb_internal T & string_map_must_get (StringMap *h, char const *key); -template gb_internal T & string_map_must_get (StringMap *h, String const &key); -template gb_internal T & string_map_must_get (StringMap *h, StringHashKey const &key); +template gb_internal T & string_map_must_get(StringMap *h, char const *key); +template gb_internal T & string_map_must_get(StringMap *h, String const &key); +template gb_internal T & string_map_must_get(StringMap *h, StringHashKey const &key); -template gb_internal void string_map_set (StringMap *h, char const *key, T const &value); -template gb_internal void string_map_set (StringMap *h, String const &key, T const &value); -template gb_internal void string_map_set (StringMap *h, StringHashKey const &key, T const &value); +template gb_internal void string_map_set (StringMap *h, char const *key, T const &value); +template gb_internal void string_map_set (StringMap *h, String const &key, T const &value); +template gb_internal void string_map_set (StringMap *h, StringHashKey const &key, T const &value); -// template gb_internal void string_map_remove (StringMap *h, StringHashKey const &key); -template gb_internal void string_map_clear (StringMap *h); -template gb_internal void string_map_grow (StringMap *h); -template gb_internal void string_map_reserve (StringMap *h, isize new_count); +// template gb_internal void string_map_remove (StringMap *h, StringHashKey const &key); +template gb_internal void string_map_clear (StringMap *h); +template gb_internal void string_map_grow (StringMap *h); +template gb_internal void string_map_reserve (StringMap *h, usize new_count); gb_internal gbAllocator string_map_allocator(void) { return heap_allocator(); } template -gb_internal gb_inline void string_map_init(StringMap *h, isize capacity) { +gb_internal gb_inline void string_map_init(StringMap *h, usize capacity) { capacity = next_pow2_isize(capacity); - slice_init(&h->hashes, string_map_allocator(), capacity); - array_init(&h->entries, string_map_allocator(), 0, capacity); - for (isize i = 0; i < capacity; i++) { - h->hashes.data[i] = MAP_SENTINEL; - } + string_map_reserve(h, capacity); } template gb_internal gb_inline void string_map_destroy(StringMap *h) { - if (h->entries.allocator.proc == nullptr) { - h->entries.allocator = string_map_allocator(); - } - slice_free(&h->hashes, h->entries.allocator); - array_free(&h->entries); + gb_free(string_map_allocator(), h->hashes); + gb_free(string_map_allocator(), h->entries); } + +template +gb_internal void string_map__resize_hashes(StringMap *h, usize count) { + h->hashes_count = cast(u32)resize_array_raw(&h->hashes, string_map_allocator(), h->hashes_count, count); +} + + +template +gb_internal void string_map__reserve_entries(StringMap *h, usize capacity) { + h->entries_capacity = cast(u32)resize_array_raw(&h->entries, string_map_allocator(), h->entries_capacity, capacity); +} + + template -gb_internal MapIndex string_map__add_entry(StringMap *h, StringHashKey const &key) { +gb_internal MapIndex string_map__add_entry(StringMap *h, u32 hash, String const &key) { StringMapEntry e = {}; e.key = key; + e.hash = hash; e.next = MAP_SENTINEL; - array_add(&h->entries, e); - return cast(MapIndex)(h->entries.count-1); + string_map__reserve_entries(h, h->count+1); + h->entries[h->count++] = e; + return cast(MapIndex)(h->count-1); } template -gb_internal MapFindResult string_map__find(StringMap *h, StringHashKey const &key) { +gb_internal MapFindResult string_map__find(StringMap *h, u32 hash, String const &key) { MapFindResult fr = {MAP_SENTINEL, MAP_SENTINEL, MAP_SENTINEL}; - if (h->hashes.count != 0) { - fr.hash_index = cast(MapIndex)(key.hash & (h->hashes.count-1)); - fr.entry_index = h->hashes.data[fr.hash_index]; + if (h->hashes_count != 0) { + fr.hash_index = cast(MapIndex)(hash & (h->hashes_count-1)); + fr.entry_index = h->hashes[fr.hash_index]; while (fr.entry_index != MAP_SENTINEL) { - if (string_hash_key_equal(h->entries.data[fr.entry_index].key, key)) { + auto *entry = &h->entries[fr.entry_index]; + if (entry->hash == hash && entry->key == key) { return fr; } fr.entry_prev = fr.entry_index; - fr.entry_index = h->entries.data[fr.entry_index].next; + fr.entry_index = entry->next; } } return fr; @@ -112,15 +121,16 @@ gb_internal MapFindResult string_map__find(StringMap *h, StringHashKey const template gb_internal MapFindResult string_map__find_from_entry(StringMap *h, StringMapEntry *e) { MapFindResult fr = {MAP_SENTINEL, MAP_SENTINEL, MAP_SENTINEL}; - if (h->hashes.count != 0) { - fr.hash_index = cast(MapIndex)(e->key.hash & (h->hashes.count-1)); - fr.entry_index = h->hashes.data[fr.hash_index]; + if (h->hashes_count != 0) { + fr.hash_index = cast(MapIndex)(e->hash & (h->hashes_count-1)); + fr.entry_index = h->hashes[fr.hash_index]; while (fr.entry_index != MAP_SENTINEL) { - if (&h->entries.data[fr.entry_index] == e) { + auto *entry = &h->entries[fr.entry_index]; + if (entry == e) { return fr; } fr.entry_prev = fr.entry_index; - fr.entry_index = h->entries.data[fr.entry_index].next; + fr.entry_index = entry->next; } } return fr; @@ -128,24 +138,24 @@ gb_internal MapFindResult string_map__find_from_entry(StringMap *h, StringMap template gb_internal b32 string_map__full(StringMap *h) { - return 0.75f * h->hashes.count <= h->entries.count; + return 0.75f * h->hashes_count <= h->count; } template gb_inline void string_map_grow(StringMap *h) { - isize new_count = gb_max(h->hashes.count<<1, 16); + isize new_count = gb_max(h->hashes_count<<1, 16); string_map_reserve(h, new_count); } template gb_internal void string_map_reset_entries(StringMap *h) { - for (isize i = 0; i < h->hashes.count; i++) { - h->hashes.data[i] = MAP_SENTINEL; + for (u32 i = 0; i < h->hashes_count; i++) { + h->hashes[i] = MAP_SENTINEL; } - for (isize i = 0; i < h->entries.count; i++) { + for (isize i = 0; i < h->count; i++) { MapFindResult fr; - StringMapEntry *e = &h->entries.data[i]; + StringMapEntry *e = &h->entries[i]; e->next = MAP_SENTINEL; fr = string_map__find_from_entry(h, e); if (fr.entry_prev == MAP_SENTINEL) { @@ -157,27 +167,24 @@ gb_internal void string_map_reset_entries(StringMap *h) { } template -gb_internal void string_map_reserve(StringMap *h, isize cap) { - if (h->entries.allocator.proc == nullptr) { - h->entries.allocator = string_map_allocator(); - } - array_reserve(&h->entries, cap); - if (h->entries.count*2 < h->hashes.count) { +gb_internal void string_map_reserve(StringMap *h, usize cap) { + if (h->count*2 < h->hashes_count) { return; } - slice_resize(&h->hashes, h->entries.allocator, cap*2); + string_map__reserve_entries(h, cap); + string_map__resize_hashes(h, cap*2); string_map_reset_entries(h); } template -gb_internal T *string_map_get(StringMap *h, StringHashKey const &key) { +gb_internal T *string_map_get(StringMap *h, u32 hash, String const &key) { MapFindResult fr = {MAP_SENTINEL, MAP_SENTINEL, MAP_SENTINEL}; - if (h->hashes.count != 0) { - fr.hash_index = cast(MapIndex)(key.hash & (h->hashes.count-1)); - fr.entry_index = h->hashes.data[fr.hash_index]; + if (h->hashes_count != 0) { + fr.hash_index = cast(MapIndex)(hash & (h->hashes_count-1)); + fr.entry_index = h->hashes[fr.hash_index]; while (fr.entry_index != MAP_SENTINEL) { - auto *entry = &h->entries.data[fr.entry_index]; - if (string_hash_key_equal(entry->key, key)) { + auto *entry = &h->entries[fr.entry_index]; + if (entry->hash == hash && entry->key == key) { return &entry->value; } fr.entry_prev = fr.entry_index; @@ -187,52 +194,65 @@ gb_internal T *string_map_get(StringMap *h, StringHashKey const &key) { return nullptr; } + +template +gb_internal gb_inline T *string_map_get(StringMap *h, StringHashKey const &key) { + return string_map_get(h, key.hash, key.string); +} + template gb_internal gb_inline T *string_map_get(StringMap *h, String const &key) { - return string_map_get(h, string_hash_string(key)); + return string_map_get(h, string_hash(key), key); } template gb_internal gb_inline T *string_map_get(StringMap *h, char const *key) { - return string_map_get(h, string_hash_string(make_string_c(key))); + String k = make_string_c(key); + return string_map_get(h, string_hash(k), k); } template -gb_internal T &string_map_must_get(StringMap *h, StringHashKey const &key) { - isize index = string_map__find(h, key).entry_index; +gb_internal T &string_map_must_get(StringMap *h, u32 hash, String const &key) { + isize index = string_map__find(h, hash, key).entry_index; GB_ASSERT(index != MAP_SENTINEL); - return h->entries.data[index].value; + return h->entries[index].value; +} + +template +gb_internal T &string_map_must_get(StringMap *h, StringHashKey const &key) { + return string_map_must_get(h, key.hash, key.string); } template gb_internal gb_inline T &string_map_must_get(StringMap *h, String const &key) { - return string_map_must_get(h, string_hash_string(key)); + return string_map_must_get(h, string_hash(key), key); } template gb_internal gb_inline T &string_map_must_get(StringMap *h, char const *key) { - return string_map_must_get(h, string_hash_string(make_string_c(key))); + String k = make_string_c(key); + return string_map_must_get(h, string_hash(k), k); } template -gb_internal void string_map_set(StringMap *h, StringHashKey const &key, T const &value) { +gb_internal void string_map_set(StringMap *h, u32 hash, String const &key, T const &value) { MapIndex index; MapFindResult fr; - if (h->hashes.count == 0) { + if (h->hashes_count == 0) { string_map_grow(h); } - fr = string_map__find(h, key); + fr = string_map__find(h, hash, key); if (fr.entry_index != MAP_SENTINEL) { index = fr.entry_index; } else { - index = string_map__add_entry(h, key); + index = string_map__add_entry(h, hash, key); if (fr.entry_prev != MAP_SENTINEL) { - h->entries.data[fr.entry_prev].next = index; + h->entries[fr.entry_prev].next = index; } else { - h->hashes.data[fr.hash_index] = index; + h->hashes[fr.hash_index] = index; } } - h->entries.data[index].value = value; + h->entries[index].value = value; if (string_map__full(h)) { string_map_grow(h); @@ -249,25 +269,31 @@ gb_internal gb_inline void string_map_set(StringMap *h, char const *key, T co string_map_set(h, string_hash_string(make_string_c(key)), value); } +template +gb_internal gb_inline void string_map_set(StringMap *h, StringHashKey const &key, T const &value) { + string_map_set(h, key.hash, key.string, value); +} + + // template // gb_internal void string_map__erase(StringMap *h, MapFindResult const &fr) { // MapFindResult last; // if (fr.entry_prev == MAP_SENTINEL) { -// h->hashes.data[fr.hash_index] = h->entries.data[fr.entry_index].next; +// h->hashes[fr.hash_index] = h->entries[fr.entry_index].next; // } else { -// h->entries.data[fr.entry_prev].next = h->entries.data[fr.entry_index].next; +// h->entries[fr.entry_prev].next = h->entries[fr.entry_index].next; // } -// if (fr.entry_index == h->entries.count-1) { +// if (fr.entry_index == h->count-1) { // array_pop(&h->entries); // return; // } -// h->entries.data[fr.entry_index] = h->entries.data[h->entries.count-1]; -// last = string_map__find(h, h->entries.data[fr.entry_index].key); +// h->entries[fr.entry_index] = h->entries[h->count-1]; +// last = string_map__find(h, h->entries[fr.entry_index].key); // if (last.entry_prev != MAP_SENTINEL) { -// h->entries.data[last.entry_prev].next = fr.entry_index; +// h->entries[last.entry_prev].next = fr.entry_index; // } else { -// h->hashes.data[last.hash_index] = fr.entry_index; +// h->hashes[last.hash_index] = fr.entry_index; // } // } @@ -281,9 +307,9 @@ gb_internal gb_inline void string_map_set(StringMap *h, char const *key, T co template gb_internal gb_inline void string_map_clear(StringMap *h) { - array_clear(&h->entries); - for (isize i = 0; i < h->hashes.count; i++) { - h->hashes.data[i] = MAP_SENTINEL; + h->count = 0; + for (u32 i = 0; i < h->hashes_count; i++) { + h->hashes[i] = MAP_SENTINEL; } } @@ -291,20 +317,20 @@ gb_internal gb_inline void string_map_clear(StringMap *h) { template gb_internal StringMapEntry *begin(StringMap &m) noexcept { - return m.entries.data; + return m.entries; } template gb_internal StringMapEntry const *begin(StringMap const &m) noexcept { - return m.entries.data; + return m.entries; } template gb_internal StringMapEntry *end(StringMap &m) { - return m.entries.data + m.entries.count; + return m.entries + m.count; } template gb_internal StringMapEntry const *end(StringMap const &m) noexcept { - return m.entries.data + m.entries.count; + return m.entries + m.count; } \ No newline at end of file -- cgit v1.2.3 From 518f30e52307e12fe184c34f0da8f197b976ced5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Jan 2023 13:23:17 +0000 Subject: Bring `PtrMap` inline with `StringMap` --- src/check_type.cpp | 12 ++-- src/checker.cpp | 8 +-- src/docs_writer.cpp | 4 +- src/llvm_backend.cpp | 10 +-- src/ptr_map.cpp | 175 +++++++++++++++++++++++++++------------------------ src/queue.cpp | 25 ++++---- src/string_map.cpp | 9 +-- 7 files changed, 126 insertions(+), 117 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/check_type.cpp b/src/check_type.cpp index 9ce6585f2..0bd9af15f 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2201,18 +2201,18 @@ gb_internal Type *make_optional_ok_type(Type *value, bool typed) { // IMPORTANT NOTE(bill): This must match the definition in dynamic_map_internal.odin enum : i64 { - MAP_CACHE_LINE_LOG2 = 6, - MAP_CACHE_LINE_SIZE = 1 << MAP_CACHE_LINE_LOG2 + MAP_CELL_CACHE_LINE_LOG2 = 6, + MAP_CELL_CACHE_LINE_SIZE = 1 << MAP_CELL_CACHE_LINE_LOG2, }; -GB_STATIC_ASSERT(MAP_CACHE_LINE_SIZE >= 64); +GB_STATIC_ASSERT(MAP_CELL_CACHE_LINE_SIZE >= 64); gb_internal void map_cell_size_and_len(Type *type, i64 *size_, i64 *len_) { i64 elem_sz = type_size_of(type); i64 len = 1; - if (0 < elem_sz && elem_sz < MAP_CACHE_LINE_SIZE) { - len = MAP_CACHE_LINE_SIZE / elem_sz; + if (0 < elem_sz && elem_sz < MAP_CELL_CACHE_LINE_SIZE) { + len = MAP_CELL_CACHE_LINE_SIZE / elem_sz; } - i64 size = align_formula(elem_sz * len, MAP_CACHE_LINE_SIZE); + i64 size = align_formula(elem_sz * len, MAP_CELL_CACHE_LINE_SIZE); if (size_) *size_ = size; if (len_) *len_ = len; } diff --git a/src/checker.cpp b/src/checker.cpp index 39a132060..01c232bff 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2030,7 +2030,7 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { GB_ASSERT(ti_index >= 0); // IMPORTANT NOTE(bill): this must be copied as `map_set` takes a const ref // and effectively assigns the `+1` of the value - isize const count = set->entries.count; + isize const count = set->count; if (map_set_if_not_previously_exists(set, ti_index, count)) { // Type already exists; return; @@ -2536,7 +2536,7 @@ gb_internal Array generate_entity_dependency_graph(CheckerInf // This means that the entity graph node set will have to be thread safe TIME_SECTION("generate_entity_dependency_graph: Calculate edges for graph M - Part 2"); - auto G = array_make(allocator, 0, M.entries.count); + auto G = array_make(allocator, 0, M.count); for (auto const &m_entry : M) { auto *e = m_entry.key; @@ -4227,7 +4227,7 @@ gb_internal Array generate_import_dependency_graph(Checker *c } Array G = {}; - array_init(&G, heap_allocator(), 0, M.entries.count); + array_init(&G, heap_allocator(), 0, M.count); isize i = 0; for (auto const &entry : M) { @@ -4655,7 +4655,7 @@ gb_internal void check_create_file_scopes(Checker *c) { total_pkg_decl_count += f->total_file_decl_count; } - mpmc_init(&pkg->exported_entity_queue, heap_allocator(), total_pkg_decl_count); + mpmc_init(&pkg->exported_entity_queue, total_pkg_decl_count); } } diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index ea0946153..cb7fa0e1e 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -913,7 +913,7 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) gb_internal void odin_doc_update_entities(OdinDocWriter *w) { { // NOTE(bill): Double pass, just in case entities are created on odin_doc_type - auto entities = array_make(heap_allocator(), 0, w->entity_cache.entries.count); + auto entities = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entities)); for (auto const &entry : w->entity_cache) { @@ -973,7 +973,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit return {}; } - auto entries = array_make(heap_allocator(), 0, w->entity_cache.entries.count); + auto entries = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entries)); for (auto const &element : pkg->scope->elements) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 6cd224324..0df32329b 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -743,7 +743,7 @@ gb_internal lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &pr // parent$count isize name_len = prefix_name.len + 1 + 8 + 1; char *name_text = gb_alloc_array(permanent_allocator(), char, name_len); - i32 name_id = cast(i32)m->gen->anonymous_proc_lits.entries.count; + i32 name_id = cast(i32)m->gen->anonymous_proc_lits.count; name_len = gb_snprintf(name_text, name_len, "%.*s$anon-%d", LIT(prefix_name), name_id); String name = make_string((u8 *)name_text, name_len-1); @@ -1625,7 +1625,7 @@ gb_internal bool lb_llvm_object_generation(lbGenerator *gen, bool do_threading) String filepath_ll = lb_filepath_ll_for_module(m); String filepath_obj = lb_filepath_obj_for_module(m); - gb_printf_err("%.*s\n", LIT(filepath_obj)); + // gb_printf_err("%.*s\n", LIT(filepath_obj)); array_add(&gen->output_object_paths, filepath_obj); array_add(&gen->output_temp_paths, filepath_ll); @@ -1977,7 +1977,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { // NOTE(bill): Target Machine Creation // NOTE(bill, 2021-05-04): Target machines must be unique to each module because they are not thread safe - auto target_machines = array_make(permanent_allocator(), 0, gen->modules.entries.count); + auto target_machines = array_make(permanent_allocator(), 0, gen->modules.count); // NOTE(dweiler): Dynamic libraries require position-independent code. LLVMRelocMode reloc_mode = LLVMRelocDefault; @@ -2073,7 +2073,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { lbModule *m = default_module; { // Add type info data - isize max_type_info_count = info->minimum_dependency_type_info_set.entries.count+1; + isize max_type_info_count = info->minimum_dependency_type_info_set.count+1; // gb_printf_err("max_type_info_count: %td\n", max_type_info_count); Type *t = alloc_type_array(t_type_info, max_type_info_count); LLVMValueRef g = LLVMAddGlobal(m->mod, lb_type(m, t), LB_TYPE_INFO_DATA_NAME); @@ -2330,7 +2330,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { } } - if (gen->modules.entries.count <= 1) { + if (gen->modules.count <= 1) { do_threading = false; } diff --git a/src/ptr_map.cpp b/src/ptr_map.cpp index 598904906..0a5c1e492 100644 --- a/src/ptr_map.cpp +++ b/src/ptr_map.cpp @@ -2,6 +2,13 @@ typedef u32 MapIndex; +enum { + MAP_CACHE_LINE_SIZE_POW = 6, + MAP_CACHE_LINE_SIZE = 1< struct PtrMap { - Slice hashes; - Array > entries; + MapIndex * hashes; + usize hashes_count; + PtrMapEntry *entries; + u32 count; + u32 entries_capacity; }; @@ -78,42 +88,48 @@ gb_internal gbAllocator map_allocator(void) { template gb_internal gb_inline void map_init(PtrMap *h, isize capacity) { capacity = next_pow2_isize(capacity); - slice_init(&h->hashes, map_allocator(), capacity); - array_init(&h->entries, map_allocator(), 0, capacity); - for (isize i = 0; i < capacity; i++) { - h->hashes.data[i] = MAP_SENTINEL; - } + map_reserve(h, capacity); } template gb_internal gb_inline void map_destroy(PtrMap *h) { - if (h->entries.allocator.proc == nullptr) { - h->entries.allocator = map_allocator(); - } - slice_free(&h->hashes, h->entries.allocator); - array_free(&h->entries); + gbAllocator a = map_allocator(); + gb_free(a, h->hashes); + gb_free(a, h->entries); } +template +gb_internal void map__resize_hashes(PtrMap *h, usize count) { + h->hashes_count = cast(u32)resize_array_raw(&h->hashes, string_map_allocator(), h->hashes_count, count, MAP_CACHE_LINE_SIZE); +} + +template +gb_internal void map__reserve_entries(PtrMap *h, usize capacity) { + h->entries_capacity = cast(u32)resize_array_raw(&h->entries, string_map_allocator(), h->entries_capacity, capacity, MAP_CACHE_LINE_SIZE); +} + + template gb_internal MapIndex map__add_entry(PtrMap *h, K key) { PtrMapEntry e = {}; e.key = key; e.next = MAP_SENTINEL; - array_add(&h->entries, e); - return cast(MapIndex)(h->entries.count-1); + map__reserve_entries(h, h->count+1); + h->entries[h->count++] = e; + return cast(MapIndex)(h->count-1); } template gb_internal MapFindResult map__find(PtrMap *h, K key) { MapFindResult fr = {MAP_SENTINEL, MAP_SENTINEL, MAP_SENTINEL}; - if (h->hashes.count == 0) { + if (h->hashes_count == 0) { return fr; } u32 hash = ptr_map_hash_key(key); - fr.hash_index = cast(MapIndex)(hash & (h->hashes.count-1)); - fr.entry_index = h->hashes.data[fr.hash_index]; + fr.hash_index = cast(MapIndex)(hash & (h->hashes_count-1)); + fr.entry_index = h->hashes[fr.hash_index]; while (fr.entry_index != MAP_SENTINEL) { - auto *entry = &h->entries.data[fr.entry_index]; + auto *entry = &h->entries[fr.entry_index]; if (entry->key == key) { return fr; } @@ -126,41 +142,41 @@ gb_internal MapFindResult map__find(PtrMap *h, K key) { template gb_internal MapFindResult map__find_from_entry(PtrMap *h, PtrMapEntry *e) { MapFindResult fr = {MAP_SENTINEL, MAP_SENTINEL, MAP_SENTINEL}; - if (h->hashes.count == 0) { + if (h->hashes_count == 0) { return fr; } u32 hash = ptr_map_hash_key(e->key); - fr.hash_index = cast(MapIndex)(hash & (h->hashes.count-1)); - fr.entry_index = h->hashes.data[fr.hash_index]; + fr.hash_index = cast(MapIndex)(hash & (h->hashes_count-1)); + fr.entry_index = h->hashes[fr.hash_index]; while (fr.entry_index != MAP_SENTINEL) { - if (&h->entries.data[fr.entry_index] == e) { + if (&h->entries[fr.entry_index] == e) { return fr; } fr.entry_prev = fr.entry_index; - fr.entry_index = h->entries.data[fr.entry_index].next; + fr.entry_index = h->entries[fr.entry_index].next; } return fr; } template gb_internal b32 map__full(PtrMap *h) { - return 0.75f * h->hashes.count <= h->entries.count; + return 0.75f * h->hashes_count <= h->count; } template gb_internal gb_inline void map_grow(PtrMap *h) { - isize new_count = gb_max(h->hashes.count<<1, 16); + isize new_count = gb_max(h->hashes_count<<1, 16); map_rehash(h, new_count); } template gb_internal void map_reset_entries(PtrMap *h) { - for (isize i = 0; i < h->hashes.count; i++) { - h->hashes.data[i] = MAP_SENTINEL; + for (usize i = 0; i < h->hashes_count; i++) { + h->hashes[i] = MAP_SENTINEL; } - for (isize i = 0; i < h->entries.count; i++) { + for (usize i = 0; i < h->count; i++) { MapFindResult fr; - PtrMapEntry *e = &h->entries.data[i]; + PtrMapEntry *e = &h->entries[i]; e->next = MAP_SENTINEL; fr = map__find_from_entry(h, e); if (fr.entry_prev == MAP_SENTINEL) { @@ -173,14 +189,11 @@ gb_internal void map_reset_entries(PtrMap *h) { template gb_internal void map_reserve(PtrMap *h, isize cap) { - if (h->entries.allocator.proc == nullptr) { - h->entries.allocator = map_allocator(); - } - array_reserve(&h->entries, cap); - if (h->entries.count*2 < h->hashes.count) { + if (h->count*2 < h->hashes_count) { return; } - slice_resize(&h->hashes, h->entries.allocator, cap*2); + map__reserve_entries(h, cap); + map__resize_hashes(h, cap*2); map_reset_entries(h); } @@ -195,12 +208,12 @@ gb_internal V *map_get(PtrMap *h, K key) { MapIndex hash_index = MAP_SENTINEL; MapIndex entry_prev = MAP_SENTINEL; MapIndex entry_index = MAP_SENTINEL; - if (h->hashes.count != 0) { + if (h->hashes_count != 0) { u32 hash = ptr_map_hash_key(key); - hash_index = cast(MapIndex)(hash & (h->hashes.count-1)); - entry_index = h->hashes.data[hash_index]; + hash_index = cast(MapIndex)(hash & (h->hashes_count-1)); + entry_index = h->hashes[hash_index]; while (entry_index != MAP_SENTINEL) { - auto *entry = &h->entries.data[entry_index]; + auto *entry = &h->entries[entry_index]; if (entry->key == key) { return &entry->value; } @@ -213,12 +226,12 @@ gb_internal V *map_get(PtrMap *h, K key) { template gb_internal V *map_try_get(PtrMap *h, K key, MapFindResult *fr_) { MapFindResult fr = {MAP_SENTINEL, MAP_SENTINEL, MAP_SENTINEL}; - if (h->hashes.count != 0) { + if (h->hashes_count != 0) { u32 hash = ptr_map_hash_key(key); - fr.hash_index = cast(MapIndex)(hash & (h->hashes.count-1)); - fr.entry_index = h->hashes.data[fr.hash_index]; + fr.hash_index = cast(MapIndex)(hash & (h->hashes_count-1)); + fr.entry_index = h->hashes[fr.hash_index]; while (fr.entry_index != MAP_SENTINEL) { - auto *entry = &h->entries.data[fr.entry_index]; + auto *entry = &h->entries[fr.entry_index]; if (entry->key == key) { return &entry->value; } @@ -226,7 +239,7 @@ gb_internal V *map_try_get(PtrMap *h, K key, MapFindResult *fr_) { fr.entry_index = entry->next; } } - if (h->hashes.count == 0 || map__full(h)) { + if (h->hashes_count == 0 || map__full(h)) { map_grow(h); } if (fr_) *fr_ = fr; @@ -238,11 +251,11 @@ template gb_internal void map_set_internal_from_try_get(PtrMap *h, K key, V const &value, MapFindResult const &fr) { MapIndex index = map__add_entry(h, key); if (fr.entry_prev != MAP_SENTINEL) { - h->entries.data[fr.entry_prev].next = index; + h->entries[fr.entry_prev].next = index; } else { - h->hashes.data[fr.hash_index] = index; + h->hashes[fr.hash_index] = index; } - h->entries.data[index].value = value; + h->entries[index].value = value; } template @@ -256,7 +269,7 @@ template gb_internal void map_set(PtrMap *h, K key, V const &value) { MapIndex index; MapFindResult fr; - if (h->hashes.count == 0) { + if (h->hashes_count == 0) { map_grow(h); } fr = map__find(h, key); @@ -265,12 +278,12 @@ gb_internal void map_set(PtrMap *h, K key, V const &value) { } else { index = map__add_entry(h, key); if (fr.entry_prev != MAP_SENTINEL) { - h->entries.data[fr.entry_prev].next = index; + h->entries[fr.entry_prev].next = index; } else { - h->hashes.data[fr.hash_index] = index; + h->hashes[fr.hash_index] = index; } } - h->entries.data[index].value = value; + h->entries[index].value = value; if (map__full(h)) { map_grow(h); @@ -282,7 +295,7 @@ template gb_internal bool map_set_if_not_previously_exists(PtrMap *h, K key, V const &value) { MapIndex index; MapFindResult fr; - if (h->hashes.count == 0) { + if (h->hashes_count == 0) { map_grow(h); } fr = map__find(h, key); @@ -291,12 +304,12 @@ gb_internal bool map_set_if_not_previously_exists(PtrMap *h, K key, V cons } else { index = map__add_entry(h, key); if (fr.entry_prev != MAP_SENTINEL) { - h->entries.data[fr.entry_prev].next = index; + h->entries[fr.entry_prev].next = index; } else { - h->hashes.data[fr.hash_index] = index; + h->hashes[fr.hash_index] = index; } } - h->entries.data[index].value = value; + h->entries[index].value = value; if (map__full(h)) { map_grow(h); @@ -309,22 +322,22 @@ template gb_internal void map__erase(PtrMap *h, MapFindResult const &fr) { MapFindResult last; if (fr.entry_prev == MAP_SENTINEL) { - h->hashes.data[fr.hash_index] = h->entries.data[fr.entry_index].next; + h->hashes[fr.hash_index] = h->entries[fr.entry_index].next; } else { - h->entries.data[fr.entry_prev].next = h->entries.data[fr.entry_index].next; + h->entries[fr.entry_prev].next = h->entries[fr.entry_index].next; } - if (fr.entry_index == h->entries.count-1) { - array_pop(&h->entries); + if (fr.entry_index == h->count-1) { + h->count--; return; } - h->entries.data[fr.entry_index] = h->entries.data[h->entries.count-1]; - array_pop(&h->entries); + h->entries[fr.entry_index] = h->entries[h->count-1]; + h->count--; - last = map__find(h, h->entries.data[fr.entry_index].key); + last = map__find(h, h->entries[fr.entry_index].key); if (last.entry_prev != MAP_SENTINEL) { - h->entries.data[last.entry_prev].next = fr.entry_index; + h->entries[last.entry_prev].next = fr.entry_index; } else { - h->hashes.data[last.hash_index] = fr.entry_index; + h->hashes[last.hash_index] = fr.entry_index; } } @@ -338,9 +351,9 @@ gb_internal void map_remove(PtrMap *h, K key) { template gb_internal gb_inline void map_clear(PtrMap *h) { - array_clear(&h->entries); - for (isize i = 0; i < h->hashes.count; i++) { - h->hashes.data[i] = MAP_SENTINEL; + h->count = 0; + for (usize i = 0; i < h->hashes_count; i++) { + h->hashes[i] = MAP_SENTINEL; } } @@ -352,17 +365,17 @@ gb_internal PtrMapEntry *multi_map_find_first(PtrMap *h, K key) { if (i == MAP_SENTINEL) { return nullptr; } - return &h->entries.data[i]; + return &h->entries[i]; } template gb_internal PtrMapEntry *multi_map_find_next(PtrMap *h, PtrMapEntry *e) { MapIndex i = e->next; while (i != MAP_SENTINEL) { - if (h->entries.data[i].key == e->key) { - return &h->entries.data[i]; + if (h->entries[i].key == e->key) { + return &h->entries[i]; } - i = h->entries.data[i].next; + i = h->entries[i].next; } return nullptr; } @@ -380,7 +393,7 @@ gb_internal isize multi_map_count(PtrMap *h, K key) { template gb_internal void multi_map_get_all(PtrMap *h, K key, V *items) { - isize i = 0; + usize i = 0; PtrMapEntry *e = multi_map_find_first(h, key); while (e != nullptr) { items[i++] = e->value; @@ -392,19 +405,19 @@ template gb_internal void multi_map_insert(PtrMap *h, K key, V const &value) { MapFindResult fr; MapIndex i; - if (h->hashes.count == 0) { + if (h->hashes_count == 0) { map_grow(h); } // Make fr = map__find(h, key); i = map__add_entry(h, key); if (fr.entry_prev == MAP_SENTINEL) { - h->hashes.data[fr.hash_index] = i; + h->hashes[fr.hash_index] = i; } else { - h->entries.data[fr.entry_prev].next = i; + h->entries[fr.entry_prev].next = i; } - h->entries.data[i].next = fr.entry_index; - h->entries.data[i].value = value; + h->entries[i].next = fr.entry_index; + h->entries[i].value = value; // Grow if needed if (map__full(h)) { map_grow(h); @@ -430,20 +443,20 @@ gb_internal void multi_map_remove_all(PtrMap *h, K key) { template gb_internal PtrMapEntry *begin(PtrMap &m) { - return m.entries.data; + return m.entries; } template gb_internal PtrMapEntry const *begin(PtrMap const &m) { - return m.entries.data; + return m.entries; } template gb_internal PtrMapEntry *end(PtrMap &m) { - return m.entries.data + m.entries.count; + return m.entries + m.count; } template gb_internal PtrMapEntry const *end(PtrMap const &m) { - return m.entries.data + m.entries.count; + return m.entries + m.count; } diff --git a/src/queue.cpp b/src/queue.cpp index 05076cfbd..2ad9cb29f 100644 --- a/src/queue.cpp +++ b/src/queue.cpp @@ -10,22 +10,19 @@ struct MPSCNode { // template struct MPSCQueue { - gbAllocator allocator; - MPSCNode sentinel; std::atomic *> head; std::atomic *> tail; std::atomic count; }; -template gb_internal void mpsc_init (MPSCQueue *q, gbAllocator const &allocator); +template gb_internal void mpsc_init (MPSCQueue *q); template gb_internal void mpsc_destroy(MPSCQueue *q); template gb_internal isize mpsc_enqueue(MPSCQueue *q, T const &value); template gb_internal bool mpsc_dequeue(MPSCQueue *q, T *value_); template gb_internal void mpsc_init(MPSCQueue *q, gbAllocator const &allocator) { - q->allocator = allocator; q->sentinel.next.store(nullptr, std::memory_order_relaxed); q->head.store(&q->sentinel, std::memory_order_relaxed); q->tail.store(&q->sentinel, std::memory_order_relaxed); @@ -39,7 +36,7 @@ gb_internal void mpsc_destroy(MPSCQueue *q) { template gb_internal MPSCNode *mpsc_alloc_node(MPSCQueue *q, T const &value) { - auto new_node = gb_alloc_item(q->allocator, MPSCNode); + auto new_node = gb_alloc_item(heap_allocator(), MPSCNode); new_node->value = value; return new_node; } @@ -95,7 +92,6 @@ struct MPMCQueue { T * nodes; MPMCQueueAtomicIdx *indices; - gbAllocator allocator; BlockingMutex mutex; MPMCQueueAtomicIdx count; i32 mask; // capacity-1, because capacity must be a power of 2 @@ -108,6 +104,9 @@ struct MPMCQueue { }; +gb_internal gbAllocator mpmc_allocator(void) { + return heap_allocator(); +} gb_internal void mpmc_internal_init_indices(MPMCQueueAtomicIdx *indices, i32 offset, i32 size) { GB_ASSERT(offset % 8 == 0); @@ -129,7 +128,7 @@ gb_internal void mpmc_internal_init_indices(MPMCQueueAtomicIdx *indices, i32 off template -gb_internal void mpmc_init(MPMCQueue *q, gbAllocator a, isize size_i) { +gb_internal void mpmc_init(MPMCQueue *q, isize size_i) { if (size_i < 8) { size_i = 8; } @@ -139,7 +138,7 @@ gb_internal void mpmc_init(MPMCQueue *q, gbAllocator a, isize size_i) { GB_ASSERT(gb_is_power_of_two(size)); q->mask = size-1; - q->allocator = a; + gbAllocator a = mpmc_allocator(); q->nodes = gb_alloc_array(a, T, size); q->indices = gb_alloc_array(a, MPMCQueueAtomicIdx, size); @@ -150,23 +149,25 @@ gb_internal void mpmc_init(MPMCQueue *q, gbAllocator a, isize size_i) { template gb_internal void mpmc_destroy(MPMCQueue *q) { - gb_free(q->allocator, q->nodes); - gb_free(q->allocator, q->indices); + gbAllocator a = mpmc_allocator(); + gb_free(a, q->nodes); + gb_free(a, q->indices); } template gb_internal bool mpmc_internal_grow(MPMCQueue *q) { + gbAllocator a = mpmc_allocator(); mutex_lock(&q->mutex); i32 old_size = q->mask+1; i32 new_size = old_size*2; - resize_array_raw(&q->nodes, q->allocator, old_size, new_size); + resize_array_raw(&q->nodes, a, old_size, new_size); if (q->nodes == nullptr) { GB_PANIC("Unable to resize enqueue: %td -> %td", old_size, new_size); mutex_unlock(&q->mutex); return false; } - resize_array_raw(&q->indices, q->allocator, old_size, new_size); + resize_array_raw(&q->indices, a, old_size, new_size); if (q->indices == nullptr) { GB_PANIC("Unable to resize enqueue: %td -> %td", old_size, new_size); mutex_unlock(&q->mutex); diff --git a/src/string_map.cpp b/src/string_map.cpp index 067adef28..bf1bbf6ca 100644 --- a/src/string_map.cpp +++ b/src/string_map.cpp @@ -1,10 +1,5 @@ GB_STATIC_ASSERT(sizeof(MapIndex) == sizeof(u32)); -enum { - STRING_MAP_CACHE_LINE_SIZE_POW = 6, - STRING_MAP_CACHE_LINE_SIZE = 1< *h) { template gb_internal void string_map__resize_hashes(StringMap *h, usize count) { - h->hashes_count = cast(u32)resize_array_raw(&h->hashes, string_map_allocator(), h->hashes_count, count, STRING_MAP_CACHE_LINE_SIZE); + h->hashes_count = cast(u32)resize_array_raw(&h->hashes, string_map_allocator(), h->hashes_count, count, MAP_CACHE_LINE_SIZE); } template gb_internal void string_map__reserve_entries(StringMap *h, usize capacity) { - h->entries_capacity = cast(u32)resize_array_raw(&h->entries, string_map_allocator(), h->entries_capacity, capacity, STRING_MAP_CACHE_LINE_SIZE); + h->entries_capacity = cast(u32)resize_array_raw(&h->entries, string_map_allocator(), h->entries_capacity, capacity, MAP_CACHE_LINE_SIZE); } -- cgit v1.2.3 From 2dca39b55716d84e760d3a33b9754c18d7f6f1cc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Jan 2023 12:06:03 +0000 Subject: Remove `auto_cast` procedure field flag Fixes #2285 --- core/runtime/core_builtin_soa.odin | 4 ++-- src/check_expr.cpp | 10 +--------- src/check_type.cpp | 17 +---------------- src/docs_writer.cpp | 1 - src/entity.cpp | 2 +- src/parser.cpp | 4 ---- src/parser.hpp | 4 ++-- 7 files changed, 7 insertions(+), 35 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/core/runtime/core_builtin_soa.odin b/core/runtime/core_builtin_soa.odin index a6b356642..2b7fd3681 100644 --- a/core/runtime/core_builtin_soa.odin +++ b/core/runtime/core_builtin_soa.odin @@ -150,14 +150,14 @@ make_soa_dynamic_array :: proc($T: typeid/#soa[dynamic]$E, allocator := context. } @builtin -make_soa_dynamic_array_len :: proc($T: typeid/#soa[dynamic]$E, auto_cast length: int, allocator := context.allocator, loc := #caller_location) -> (array: T) { +make_soa_dynamic_array_len :: proc($T: typeid/#soa[dynamic]$E, #any_int length: int, allocator := context.allocator, loc := #caller_location) -> (array: T) { context.allocator = allocator resize_soa(&array, length, loc) return } @builtin -make_soa_dynamic_array_len_cap :: proc($T: typeid/#soa[dynamic]$E, auto_cast length, capacity: int, allocator := context.allocator, loc := #caller_location) -> (array: T) { +make_soa_dynamic_array_len_cap :: proc($T: typeid/#soa[dynamic]$E, #any_int length, capacity: int, allocator := context.allocator, loc := #caller_location) -> (array: T) { context.allocator = allocator if reserve_soa(&array, capacity, loc) { resize_soa(&array, length, loc) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 6c3e731f8..608eb879b 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5321,9 +5321,7 @@ gb_internal CALL_ARGUMENT_CHECKER(check_call_arguments_internal) { i64 s = 0; if (!check_is_assignable_to_with_score(c, &o, t, &s, param_is_variadic)) { bool ok = false; - if (e->flags & EntityFlag_AutoCast) { - ok = check_is_castable_to(c, &o, t); - } else if (e->flags & EntityFlag_AnyInt) { + if (e->flags & EntityFlag_AnyInt) { if (is_type_integer(t)) { ok = check_is_castable_to(c, &o, t); } @@ -5592,9 +5590,6 @@ gb_internal CALL_ARGUMENT_CHECKER(check_named_call_arguments) { i64 s = 0; if (!check_is_assignable_to_with_score(c, o, e->type, &s, param_is_variadic)) { bool ok = false; - if (e->flags & EntityFlag_AutoCast) { - ok = check_is_castable_to(c, o, e->type); - } if (ok) { s = assign_score_function(MAXIMUM_TYPE_DISTANCE); } else { @@ -10243,9 +10238,6 @@ gb_internal gbString write_expr_to_string(gbString str, Ast *node, bool shorthan if (f->flags&FieldFlag_c_vararg) { str = gb_string_appendc(str, "#c_vararg "); } - if (f->flags&FieldFlag_auto_cast) { - str = gb_string_appendc(str, "auto_cast "); - } if (f->flags&FieldFlag_any_int) { str = gb_string_appendc(str, "#any_int "); } diff --git a/src/check_type.cpp b/src/check_type.cpp index 0bd9af15f..ad746514e 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1619,10 +1619,6 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para } } - if (p->flags&FieldFlag_auto_cast) { - error(name, "'auto_cast' can only be applied to variable fields"); - p->flags &= ~FieldFlag_auto_cast; - } if (p->flags&FieldFlag_const) { error(name, "'#const' can only be applied to variable fields"); p->flags &= ~FieldFlag_const; @@ -1681,11 +1677,7 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para } if (type != t_invalid && !check_is_assignable_to(ctx, &op, type)) { bool ok = true; - if (p->flags&FieldFlag_auto_cast) { - if (!check_is_castable_to(ctx, &op, type)) { - ok = false; - } - } else if (p->flags&FieldFlag_any_int) { + if (p->flags&FieldFlag_any_int) { if ((!is_type_integer(op.type) && !is_type_enum(op.type)) || (!is_type_integer(type) && !is_type_enum(type))) { ok = false; } else if (!check_is_castable_to(ctx, &op, type)) { @@ -1731,10 +1723,6 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para error(name, "'#no_alias' can only be applied to non constant values"); p->flags &= ~FieldFlag_no_alias; // Remove the flag } - if (p->flags&FieldFlag_auto_cast) { - error(name, "'auto_cast' can only be applied to variable fields"); - p->flags &= ~FieldFlag_auto_cast; - } if (p->flags&FieldFlag_any_int) { error(name, "'#any_int' can only be applied to variable fields"); p->flags &= ~FieldFlag_any_int; @@ -1765,9 +1753,6 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para if (p->flags&FieldFlag_no_alias) { param->flags |= EntityFlag_NoAlias; } - if (p->flags&FieldFlag_auto_cast) { - param->flags |= EntityFlag_AutoCast; - } if (p->flags&FieldFlag_any_int) { if (!is_type_integer(param->type) && !is_type_enum(param->type)) { gbString str = type_to_string(param->type); diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index cb7fa0e1e..814769f57 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -859,7 +859,6 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) if (e->flags & EntityFlag_Param) { if (e->flags & EntityFlag_Using) { flags |= OdinDocEntityFlag_Param_Using; } if (e->flags & EntityFlag_ConstInput) { flags |= OdinDocEntityFlag_Param_Const; } - if (e->flags & EntityFlag_AutoCast) { flags |= OdinDocEntityFlag_Param_AutoCast; } if (e->flags & EntityFlag_Ellipsis) { flags |= OdinDocEntityFlag_Param_Ellipsis; } if (e->flags & EntityFlag_NoAlias) { flags |= OdinDocEntityFlag_Param_NoAlias; } if (e->flags & EntityFlag_AnyInt) { flags |= OdinDocEntityFlag_Param_AnyInt; } diff --git a/src/entity.cpp b/src/entity.cpp index b92ba825f..4b0a6a3c8 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -61,7 +61,7 @@ enum EntityFlag : u64 { EntityFlag_ProcBodyChecked = 1ull<<21, EntityFlag_CVarArg = 1ull<<22, - EntityFlag_AutoCast = 1ull<<23, + EntityFlag_AnyInt = 1ull<<24, EntityFlag_Disabled = 1ull<<25, diff --git a/src/parser.cpp b/src/parser.cpp index c26ca3dcb..b364d01cf 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3524,7 +3524,6 @@ struct ParseFieldPrefixMapping { gb_global ParseFieldPrefixMapping parse_field_prefix_mappings[] = { {str_lit("using"), Token_using, FieldFlag_using}, - {str_lit("auto_cast"), Token_auto_cast, FieldFlag_auto_cast}, {str_lit("no_alias"), Token_Hash, FieldFlag_no_alias}, {str_lit("c_vararg"), Token_Hash, FieldFlag_c_vararg}, {str_lit("const"), Token_Hash, FieldFlag_const}, @@ -3542,9 +3541,6 @@ gb_internal FieldFlag is_token_field_prefix(AstFile *f) { case Token_using: return FieldFlag_using; - case Token_auto_cast: - return FieldFlag_auto_cast; - case Token_Hash: advance_token(f); switch (f->curr_token.kind) { diff --git a/src/parser.hpp b/src/parser.hpp index 6782a9248..552e9bfb5 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -312,7 +312,7 @@ enum FieldFlag : u32 { FieldFlag_using = 1<<1, FieldFlag_no_alias = 1<<2, FieldFlag_c_vararg = 1<<3, - FieldFlag_auto_cast = 1<<4, + FieldFlag_const = 1<<5, FieldFlag_any_int = 1<<6, FieldFlag_subtype = 1<<7, @@ -327,7 +327,7 @@ enum FieldFlag : u32 { FieldFlag_Invalid = 1u<<31, // Parameter List Restrictions - FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_c_vararg|FieldFlag_auto_cast|FieldFlag_const|FieldFlag_any_int|FieldFlag_by_ptr, + FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_c_vararg|FieldFlag_const|FieldFlag_any_int|FieldFlag_by_ptr, FieldFlag_Struct = FieldFlag_using|FieldFlag_subtype|FieldFlag_Tags, }; -- cgit v1.2.3 From b3e712e0b80afcf0396a94d46f5083f429ece557 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 21 Mar 2023 15:22:11 +0000 Subject: Correctly handle end comment for doc generation --- src/docs_writer.cpp | 12 +++++++----- src/parser.cpp | 13 ++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 814769f57..3c60145c9 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -915,18 +915,20 @@ gb_internal void odin_doc_update_entities(OdinDocWriter *w) { auto entities = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entities)); - for (auto const &entry : w->entity_cache) { - array_add(&entities, entry.key); + ffor (u32 i = 0; i < w->entity_cache.count; i++) { + Entity *e = w->entity_cache.entries[i].key; + array_add(&entities, e); } for (Entity *e : entities) { + GB_ASSERT(e != nullptr); OdinDocTypeIndex type_index = odin_doc_type(w, e->type); gb_unused(type_index); } } - for (auto const &entry : w->entity_cache) { - Entity *e = entry.key; - OdinDocEntityIndex entity_index = entry.value; + for (u32 i = 0; i < w->entity_cache.count; i++) { + Entity *e = w->entity_cache.entries[i].key; + OdinDocEntityIndex entity_index = w->entity_cache.entries[i].value; OdinDocTypeIndex type_index = odin_doc_type(w, e->type); OdinDocEntityIndex foreign_library = 0; diff --git a/src/parser.cpp b/src/parser.cpp index 437d6300e..07afc56d6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3191,6 +3191,15 @@ gb_internal Ast *parse_foreign_block(AstFile *f, Token token) { return decl; } +gb_internal void print_comment_group(CommentGroup *group) { + if (group) { + for (Token const &token : group->list) { + gb_printf_err("%.*s\n", LIT(token.string)); + } + gb_printf_err("\n"); + } +} + gb_internal Ast *parse_value_decl(AstFile *f, Array names, CommentGroup *docs) { bool is_mutable = true; @@ -3232,6 +3241,8 @@ gb_internal Ast *parse_value_decl(AstFile *f, Array names, CommentGroup * values.allocator = heap_allocator(); } + CommentGroup *end_comment = f->lead_comment; + if (f->expr_level >= 0) { if (f->curr_token.kind == Token_CloseBrace && f->curr_token.pos.line == f->prev_token.pos.line) { @@ -3252,7 +3263,7 @@ gb_internal Ast *parse_value_decl(AstFile *f, Array names, CommentGroup * } } - return ast_value_decl(f, names, type, values, is_mutable, docs, f->line_comment); + return ast_value_decl(f, names, type, values, is_mutable, docs, end_comment); } gb_internal Ast *parse_simple_stmt(AstFile *f, u32 flags) { -- cgit v1.2.3 From d986eee36be683c06421a6fe362defb6e65bf9c9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 21 Mar 2023 15:28:52 +0000 Subject: Fix typo --- src/docs_writer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 3c60145c9..7488e955a 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -915,7 +915,7 @@ gb_internal void odin_doc_update_entities(OdinDocWriter *w) { auto entities = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entities)); - ffor (u32 i = 0; i < w->entity_cache.count; i++) { + for (u32 i = 0; i < w->entity_cache.count; i++) { Entity *e = w->entity_cache.entries[i].key; array_add(&entities, e); } -- cgit v1.2.3 From b76fc585431e7d10338bb175334945294b4a57ac Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 May 2023 15:23:24 +0100 Subject: Inline `are_types_identical_unique_tuples` to improve `odin_doc_type` performance --- src/docs_writer.cpp | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 7488e955a..3c27552f5 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -471,6 +471,8 @@ gb_internal OdinDocArray odin_doc_add_entity_as_slice(OdinDo return odin_write_item_as_slice(w, index); } + + gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { if (type == nullptr) { return 0; @@ -481,12 +483,41 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { } for (auto const &entry : w->type_cache) { // NOTE(bill): THIS IS SLOW - Type *other = entry.key; - if (are_types_identical_unique_tuples(type, other)) { - OdinDocTypeIndex index = entry.value; - map_set(&w->type_cache, type, index); - return index; + Type *x = type; + Type *y = entry.key; + + if (x == y) { + goto do_set; + } + + if (!x | !y) { + continue; + } + + if (x->kind == Type_Named) { + Entity *e = x->Named.type_name; + if (e->TypeName.is_type_alias) { + x = x->Named.base; + } } + if (y->kind == Type_Named) { + Entity *e = y->Named.type_name; + if (e->TypeName.is_type_alias) { + y = y->Named.base; + } + } + if (x->kind != y->kind) { + continue; + } + + if (!are_types_identical_internal(x, y, true)) { + continue; + } + + do_set: + OdinDocTypeIndex index = entry.value; + map_set(&w->type_cache, type, index); + return index; } -- cgit v1.2.3 From 248f14a1efe95294fe20b4f930be4a948396ff44 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 May 2023 15:29:01 +0100 Subject: Correct entity flag generation --- src/docs_writer.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 3c27552f5..1e34faa8b 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -887,13 +887,12 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) break; } - if (e->flags & EntityFlag_Param) { - if (e->flags & EntityFlag_Using) { flags |= OdinDocEntityFlag_Param_Using; } - if (e->flags & EntityFlag_ConstInput) { flags |= OdinDocEntityFlag_Param_Const; } - if (e->flags & EntityFlag_Ellipsis) { flags |= OdinDocEntityFlag_Param_Ellipsis; } - if (e->flags & EntityFlag_NoAlias) { flags |= OdinDocEntityFlag_Param_NoAlias; } - if (e->flags & EntityFlag_AnyInt) { flags |= OdinDocEntityFlag_Param_AnyInt; } - } + if (e->flags & EntityFlag_Using) { flags |= OdinDocEntityFlag_Param_Using; } + if (e->flags & EntityFlag_ConstInput) { flags |= OdinDocEntityFlag_Param_Const; } + if (e->flags & EntityFlag_Ellipsis) { flags |= OdinDocEntityFlag_Param_Ellipsis; } + if (e->flags & EntityFlag_NoAlias) { flags |= OdinDocEntityFlag_Param_NoAlias; } + if (e->flags & EntityFlag_AnyInt) { flags |= OdinDocEntityFlag_Param_AnyInt; } + if (e->scope && (e->scope->flags & (ScopeFlag_File|ScopeFlag_Pkg)) && !is_entity_exported(e)) { flags |= OdinDocEntityFlag_Private; } -- cgit v1.2.3 From 38b64dc5dfeb141cb7e9cca790f897e762374ead Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 May 2023 20:48:13 +0100 Subject: Improve doc_writer.cpp performance --- src/docs_writer.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 1e34faa8b..7dab5a8b1 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -30,6 +30,7 @@ struct OdinDocWriter { PtrMap pkg_cache; PtrMap entity_cache; PtrMap type_cache; + PtrMap stable_type_cache; OdinDocWriterItemTracker files; OdinDocWriterItemTracker pkgs; @@ -59,6 +60,7 @@ gb_internal void odin_doc_writer_prepare(OdinDocWriter *w) { map_init(&w->pkg_cache); map_init(&w->entity_cache); map_init(&w->type_cache); + map_init(&w->stable_type_cache); odin_doc_writer_item_tracker_init(&w->files, 1); odin_doc_writer_item_tracker_init(&w->pkgs, 1); @@ -77,6 +79,7 @@ gb_internal void odin_doc_writer_destroy(OdinDocWriter *w) { map_destroy(&w->pkg_cache); map_destroy(&w->entity_cache); map_destroy(&w->type_cache); + map_destroy(&w->stable_type_cache); } @@ -477,6 +480,12 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { if (type == nullptr) { return 0; } + + Type **mapped_type = map_get(&w->stable_type_cache, type); // may map to itself + if (mapped_type && *mapped_type) { + type = *mapped_type; + } + OdinDocTypeIndex *found = map_get(&w->type_cache, type); if (found) { return *found; @@ -517,6 +526,7 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { do_set: OdinDocTypeIndex index = entry.value; map_set(&w->type_cache, type, index); + map_set(&w->stable_type_cache, type, entry.key); return index; } @@ -526,6 +536,7 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { OdinDocTypeIndex type_index = 0; type_index = odin_doc_write_item(w, &w->types, &doc_type, &dst); map_set(&w->type_cache, type, type_index); + map_set(&w->stable_type_cache, type, type); switch (type->kind) { case Type_Basic: -- cgit v1.2.3 From bdbbaf6c880c1ac481859160cb632b49ecbe6b46 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 May 2023 21:34:20 +0100 Subject: Disable stable_type_cache for the time being --- src/docs_writer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 7dab5a8b1..18178dd51 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -481,10 +481,10 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { return 0; } - Type **mapped_type = map_get(&w->stable_type_cache, type); // may map to itself - if (mapped_type && *mapped_type) { - type = *mapped_type; - } + // Type **mapped_type = map_get(&w->stable_type_cache, type); // may map to itself + // if (mapped_type && *mapped_type) { + // type = *mapped_type; + // } OdinDocTypeIndex *found = map_get(&w->type_cache, type); if (found) { -- cgit v1.2.3 From 3a61350f4b362ae9d3cd03940588f83b035ba33d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 May 2023 21:48:32 +0100 Subject: Add debug messages to docs_writer.cpp --- src/docs_writer.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/docs_writer.cpp') diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 18178dd51..2dd2f338b 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -52,6 +52,7 @@ gb_internal void odin_doc_writer_item_tracker_init(OdinDocWriterItemTracker * gb_internal void odin_doc_writer_prepare(OdinDocWriter *w) { + debugf("odin_doc_writer_prepare\n"); w->state = OdinDocWriterState_Preparing; string_map_init(&w->string_cache); @@ -72,6 +73,7 @@ gb_internal void odin_doc_writer_prepare(OdinDocWriter *w) { gb_internal void odin_doc_writer_destroy(OdinDocWriter *w) { + debugf("odin_doc_writer_destroy\n"); gb_free(heap_allocator(), w->data); string_map_destroy(&w->string_cache); @@ -105,6 +107,7 @@ gb_internal isize odin_doc_writer_calc_total_size(OdinDocWriter *w) { } gb_internal void odin_doc_writer_start_writing(OdinDocWriter *w) { + debugf("odin_doc_writer_start_writing\n"); w->state = OdinDocWriterState_Writing; string_map_clear(&w->string_cache); @@ -141,6 +144,7 @@ gb_internal void odin_doc_writer_assign_tracker(OdinDocArray *array, OdinDocW gb_internal void odin_doc_writer_end_writing(OdinDocWriter *w) { + debugf("odin_doc_writer_end_writing\n"); OdinDocHeader *h = w->header; gb_memmove(h->base.magic, OdinDocHeader_MagicString, gb_strlen(OdinDocHeader_MagicString)); @@ -951,6 +955,8 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) } gb_internal void odin_doc_update_entities(OdinDocWriter *w) { + debugf("odin_doc_update_entities %s\n", w->state ? "preparing" : "writing"); + { // NOTE(bill): Double pass, just in case entities are created on odin_doc_type auto entities = array_make(heap_allocator(), 0, w->entity_cache.count); @@ -1015,6 +1021,8 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit return {}; } + debugf("odin_doc_add_pkg_entries %s -> package %.*s\n", w->state ? "preparing" : "writing", LIT(pkg->name)); + auto entries = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entries)); @@ -1058,6 +1066,8 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit gb_internal void odin_doc_write_docs(OdinDocWriter *w) { + debugf("odin_doc_write_docs %s", w->state ? "preparing" : "writing"); + auto pkgs = array_make(heap_allocator(), 0, w->info->packages.count); defer (array_free(&pkgs)); for (auto const &entry : w->info->packages) { @@ -1073,6 +1083,7 @@ gb_internal void odin_doc_write_docs(OdinDocWriter *w) { } } + debugf("odin_doc_update_entities sort pkgs %s\n", w->state ? "preparing" : "writing"); gb_sort_array(pkgs.data, pkgs.count, cmp_ast_package_by_name); for_array(i, pkgs) { @@ -1133,6 +1144,7 @@ gb_internal void odin_doc_write_docs(OdinDocWriter *w) { gb_internal void odin_doc_write_to_file(OdinDocWriter *w, char const *filename) { + debugf("odin_doc_write_to_file %s\n", filename); gbFile f = {}; gbFileError err = gb_file_open_mode(&f, gbFileMode_Write, filename); if (err != gbFileError_None) { @@ -1143,6 +1155,7 @@ gb_internal void odin_doc_write_to_file(OdinDocWriter *w, char const *filename) defer (gb_file_close(&f)); if (gb_file_write(&f, w->data, w->data_len)) { err = gb_file_truncate(&f, w->data_len); + debugf("Wrote .odin-doc file to: %s\n", filename); gb_printf("Wrote .odin-doc file to: %s\n", filename); } } @@ -1153,6 +1166,8 @@ gb_internal void odin_doc_write(CheckerInfo *info, char const *filename) { defer (odin_doc_writer_destroy(w)); w->info = info; + debugf("odin_doc_write %s\n", filename); + odin_doc_writer_prepare(w); odin_doc_write_docs(w); -- cgit v1.2.3