mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Improve default scope size
This commit is contained in:
@@ -1638,7 +1638,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
StringSet name_set = {};
|
StringSet name_set = {};
|
||||||
string_set_init(&name_set, temporary_allocator(), 2*ce->args.count);
|
string_set_init(&name_set, heap_allocator(), 2*ce->args.count);
|
||||||
|
|
||||||
for_array(i, ce->args) {
|
for_array(i, ce->args) {
|
||||||
String name = {};
|
String name = {};
|
||||||
|
|||||||
+1
-1
@@ -2228,7 +2228,7 @@ Type *make_soa_struct_internal(CheckerContext *ctx, Ast *array_typ_expr, Ast *el
|
|||||||
soa_struct->Struct.soa_elem = elem;
|
soa_struct->Struct.soa_elem = elem;
|
||||||
soa_struct->Struct.soa_count = count;
|
soa_struct->Struct.soa_count = count;
|
||||||
|
|
||||||
scope = create_scope(ctx->info, ctx->scope);
|
scope = create_scope(ctx->info, ctx->scope, 8);
|
||||||
soa_struct->Struct.scope = scope;
|
soa_struct->Struct.scope = scope;
|
||||||
|
|
||||||
String params_xyzw[4] = {
|
String params_xyzw[4] = {
|
||||||
|
|||||||
+22
-5
@@ -250,7 +250,8 @@ Scope *create_scope_from_file(CheckerInfo *info, AstFile *f) {
|
|||||||
GB_ASSERT(f->pkg != nullptr);
|
GB_ASSERT(f->pkg != nullptr);
|
||||||
GB_ASSERT(f->pkg->scope != nullptr);
|
GB_ASSERT(f->pkg->scope != nullptr);
|
||||||
|
|
||||||
Scope *s = create_scope(info, f->pkg->scope);
|
isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*f->total_file_decl_count);
|
||||||
|
Scope *s = create_scope(info, f->pkg->scope, init_elements_capacity);
|
||||||
|
|
||||||
array_reserve(&s->delayed_imports, f->imports.count);
|
array_reserve(&s->delayed_imports, f->imports.count);
|
||||||
array_reserve(&s->delayed_directives, f->directive_count);
|
array_reserve(&s->delayed_directives, f->directive_count);
|
||||||
@@ -265,11 +266,12 @@ Scope *create_scope_from_file(CheckerInfo *info, AstFile *f) {
|
|||||||
Scope *create_scope_from_package(CheckerContext *c, AstPackage *pkg) {
|
Scope *create_scope_from_package(CheckerContext *c, AstPackage *pkg) {
|
||||||
GB_ASSERT(pkg != nullptr);
|
GB_ASSERT(pkg != nullptr);
|
||||||
|
|
||||||
isize decl_count = 0;
|
isize total_pkg_decl_count = 0;
|
||||||
for_array(i, pkg->files) {
|
for_array(j, pkg->files) {
|
||||||
decl_count += pkg->files[i]->decls.count;
|
total_pkg_decl_count += pkg->files.data[j]->total_file_decl_count;
|
||||||
}
|
}
|
||||||
isize init_elements_capacity = 2*decl_count;
|
|
||||||
|
isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*total_pkg_decl_count);
|
||||||
Scope *s = create_scope(c->info, builtin_pkg->scope, init_elements_capacity);
|
Scope *s = create_scope(c->info, builtin_pkg->scope, init_elements_capacity);
|
||||||
|
|
||||||
s->flags |= ScopeFlag_Pkg;
|
s->flags |= ScopeFlag_Pkg;
|
||||||
@@ -3993,6 +3995,10 @@ bool collect_file_decls(CheckerContext *ctx, Slice<Ast *> const &decls) {
|
|||||||
|
|
||||||
for_array(i, decls) {
|
for_array(i, decls) {
|
||||||
Ast *decl = decls[i];
|
Ast *decl = decls[i];
|
||||||
|
if (decl->state_flags & StateFlag_BeenHandled) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (decl->kind) {
|
switch (decl->kind) {
|
||||||
case_ast_node(vd, ValueDecl, decl);
|
case_ast_node(vd, ValueDecl, decl);
|
||||||
check_collect_value_decl(ctx, decl);
|
check_collect_value_decl(ctx, decl);
|
||||||
@@ -4051,6 +4057,7 @@ bool collect_file_decls(CheckerContext *ctx, Slice<Ast *> const &decls) {
|
|||||||
void check_create_file_scopes(Checker *c) {
|
void check_create_file_scopes(Checker *c) {
|
||||||
for_array(i, c->parser->packages) {
|
for_array(i, c->parser->packages) {
|
||||||
AstPackage *pkg = c->parser->packages[i];
|
AstPackage *pkg = c->parser->packages[i];
|
||||||
|
isize total_pkg_decl_count = 0;
|
||||||
|
|
||||||
for_array(j, pkg->files) {
|
for_array(j, pkg->files) {
|
||||||
AstFile *f = pkg->files[j];
|
AstFile *f = pkg->files[j];
|
||||||
@@ -4149,6 +4156,8 @@ void check_collect_entities_all(Checker *c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void check_import_entities(Checker *c) {
|
void check_import_entities(Checker *c) {
|
||||||
|
#define TIME_SECTION(str) do { debugf("[Section] %s\n", str); if (build_context.show_more_timings) timings_start_section(&global_timings, str_lit(str)); } while (0)
|
||||||
|
|
||||||
Array<ImportGraphNode *> dep_graph = generate_import_dependency_graph(c);
|
Array<ImportGraphNode *> dep_graph = generate_import_dependency_graph(c);
|
||||||
defer ({
|
defer ({
|
||||||
for_array(i, dep_graph) {
|
for_array(i, dep_graph) {
|
||||||
@@ -4157,6 +4166,8 @@ void check_import_entities(Checker *c) {
|
|||||||
array_free(&dep_graph);
|
array_free(&dep_graph);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TIME_SECTION("check_import_entities - cycles");
|
||||||
// NOTE(bill): Priority queue
|
// NOTE(bill): Priority queue
|
||||||
auto pq = priority_queue_create(dep_graph, import_graph_node_cmp, import_graph_node_swap);
|
auto pq = priority_queue_create(dep_graph, import_graph_node_cmp, import_graph_node_swap);
|
||||||
|
|
||||||
@@ -4210,6 +4221,7 @@ void check_import_entities(Checker *c) {
|
|||||||
array_add(&package_order, n);
|
array_add(&package_order, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TIME_SECTION("check_import_entities - used");
|
||||||
for_array(i, c->parser->packages) {
|
for_array(i, c->parser->packages) {
|
||||||
AstPackage *pkg = c->parser->packages[i];
|
AstPackage *pkg = c->parser->packages[i];
|
||||||
switch (pkg->kind) {
|
switch (pkg->kind) {
|
||||||
@@ -4220,6 +4232,7 @@ void check_import_entities(Checker *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TIME_SECTION("check_import_entities - collect checked packages from decl list");
|
||||||
CheckerContext ctx = make_checker_context(c);
|
CheckerContext ctx = make_checker_context(c);
|
||||||
|
|
||||||
for (isize loop_count = 0; ; loop_count++) {
|
for (isize loop_count = 0; ; loop_count++) {
|
||||||
@@ -4244,6 +4257,7 @@ void check_import_entities(Checker *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TIME_SECTION("check_import_entities - collect file decls");
|
||||||
for (isize pkg_index = 0; pkg_index < package_order.count; pkg_index++) {
|
for (isize pkg_index = 0; pkg_index < package_order.count; pkg_index++) {
|
||||||
ImportGraphNode *node = package_order[pkg_index];
|
ImportGraphNode *node = package_order[pkg_index];
|
||||||
AstPackage *pkg = node->pkg;
|
AstPackage *pkg = node->pkg;
|
||||||
@@ -4272,6 +4286,7 @@ void check_import_entities(Checker *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TIME_SECTION("check_import_entities - check delayed entities");
|
||||||
for_array(i, package_order) {
|
for_array(i, package_order) {
|
||||||
ImportGraphNode *node = package_order[i];
|
ImportGraphNode *node = package_order[i];
|
||||||
GB_ASSERT(node->scope->flags&ScopeFlag_Pkg);
|
GB_ASSERT(node->scope->flags&ScopeFlag_Pkg);
|
||||||
@@ -4297,6 +4312,8 @@ void check_import_entities(Checker *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef TIME_SECTION
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -605,7 +605,8 @@ GB_ALLOCATOR_PROC(temp_allocator_proc) {
|
|||||||
|
|
||||||
|
|
||||||
gbAllocator temporary_allocator() {
|
gbAllocator temporary_allocator() {
|
||||||
return {temp_allocator_proc, &temporary_allocator_data};
|
return permanent_allocator();
|
||||||
|
// return {temp_allocator_proc, &temporary_allocator_data};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5261,6 +5261,28 @@ String dir_from_path(String path) {
|
|||||||
return base_dir;
|
return base_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isize calc_decl_count(Ast *decl) {
|
||||||
|
isize count = 0;
|
||||||
|
switch (decl->kind) {
|
||||||
|
case Ast_BlockStmt:
|
||||||
|
for_array(i, decl->BlockStmt.stmts) {
|
||||||
|
count += calc_decl_count(decl->BlockStmt.stmts.data[i]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Ast_ValueDecl:
|
||||||
|
count = decl->ValueDecl.names.count;
|
||||||
|
break;
|
||||||
|
case Ast_ForeignBlockDecl:
|
||||||
|
count = calc_decl_count(decl->ForeignBlockDecl.body);
|
||||||
|
break;
|
||||||
|
case Ast_ImportDecl:
|
||||||
|
case Ast_ForeignImportDecl:
|
||||||
|
count = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
bool parse_file(Parser *p, AstFile *f) {
|
bool parse_file(Parser *p, AstFile *f) {
|
||||||
if (f->tokens.count == 0) {
|
if (f->tokens.count == 0) {
|
||||||
return true;
|
return true;
|
||||||
@@ -5346,6 +5368,8 @@ bool parse_file(Parser *p, AstFile *f) {
|
|||||||
stmt->ExprStmt.expr->kind == Ast_ProcLit) {
|
stmt->ExprStmt.expr->kind == Ast_ProcLit) {
|
||||||
syntax_error(stmt, "Procedure literal evaluated but not used");
|
syntax_error(stmt, "Procedure literal evaluated but not used");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
f->total_file_decl_count += calc_decl_count(stmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ struct AstFile {
|
|||||||
bool in_foreign_block;
|
bool in_foreign_block;
|
||||||
bool allow_type;
|
bool allow_type;
|
||||||
|
|
||||||
|
isize total_file_decl_count;
|
||||||
Slice<Ast *> decls;
|
Slice<Ast *> decls;
|
||||||
Array<Ast *> imports; // 'import'
|
Array<Ast *> imports; // 'import'
|
||||||
isize directive_count;
|
isize directive_count;
|
||||||
|
|||||||
Reference in New Issue
Block a user