aboutsummaryrefslogtreecommitdiff
path: root/src/check_decl.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-07-25 13:06:09 +0100
committergingerBill <bill@gingerbill.org>2021-07-25 13:06:09 +0100
commit99080d41f3c02dbc179db8ebb0f215d199f49c89 (patch)
tree85b97e030cda198d83681d20a6710c53494376cf /src/check_decl.cpp
parent92f3567ee6e28ac07f237e9dbe7287436954877b (diff)
INTERNAL USE ONLY: `//+lazy` build flag
Diffstat (limited to 'src/check_decl.cpp')
-rw-r--r--src/check_decl.cpp101
1 files changed, 48 insertions, 53 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index fb3ef8038..cc3ec6e5b 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -1115,71 +1115,66 @@ void check_entity_decl(CheckerContext *ctx, Entity *e, DeclInfo *d, Type *named_
if (e->state == EntityState_Resolved) {
return;
}
+ if (e->flags & EntityFlag_Lazy) {
+ gb_mutex_lock(&ctx->info->lazy_mutex);
+ }
+
String name = e->token.string;
if (e->type != nullptr || e->state != EntityState_Unresolved) {
error(e->token, "Illegal declaration cycle of `%.*s`", LIT(name));
- return;
- }
-
- GB_ASSERT(e->state == EntityState_Unresolved);
-
-#if 0
- char buf[256] = {};
- isize n = gb_snprintf(buf, 256, "%.*s %d", LIT(name), e->kind);
- Timings timings = {};
- timings_init(&timings, make_string(cast(u8 *)buf, n-1), 16);
- defer ({
- timings_print_all(&timings);
- timings_destroy(&timings);
- });
-#define TIME_SECTION(str) timings_start_section(&timings, str_lit(str))
-#else
-#define TIME_SECTION(str)
-#endif
-
- if (d == nullptr) {
- d = decl_info_of_entity(e);
+ } else {
+ GB_ASSERT(e->state == EntityState_Unresolved);
if (d == nullptr) {
- // TODO(bill): Err here?
- e->type = t_invalid;
- e->state = EntityState_Resolved;
- set_base_type(named_type, t_invalid);
- return;
- // GB_PANIC("'%.*s' should been declared!", LIT(name));
+ d = decl_info_of_entity(e);
+ if (d == nullptr) {
+ // TODO(bill): Err here?
+ e->type = t_invalid;
+ e->state = EntityState_Resolved;
+ set_base_type(named_type, t_invalid);
+ goto end;
+ }
}
- }
- CheckerContext c = *ctx;
- c.scope = d->scope;
- c.decl = d;
- c.type_level = 0;
+ CheckerContext c = *ctx;
+ c.scope = d->scope;
+ c.decl = d;
+ c.type_level = 0;
- e->parent_proc_decl = c.curr_proc_decl;
- e->state = EntityState_InProgress;
+ e->parent_proc_decl = c.curr_proc_decl;
+ e->state = EntityState_InProgress;
+
+ switch (e->kind) {
+ case Entity_Variable:
+ check_global_variable_decl(&c, e, d->type_expr, d->init_expr);
+ break;
+ case Entity_Constant:
+ check_const_decl(&c, e, d->type_expr, d->init_expr, named_type);
+ break;
+ case Entity_TypeName: {
+ check_type_decl(&c, e, d->init_expr, named_type);
+ break;
+ }
+ case Entity_Procedure:
+ check_proc_decl(&c, e, d);
+ break;
+ case Entity_ProcGroup:
+ check_proc_group_decl(&c, e, d);
+ break;
+ }
+
+ e->state = EntityState_Resolved;
- switch (e->kind) {
- case Entity_Variable:
- check_global_variable_decl(&c, e, d->type_expr, d->init_expr);
- break;
- case Entity_Constant:
- check_const_decl(&c, e, d->type_expr, d->init_expr, named_type);
- break;
- case Entity_TypeName: {
- check_type_decl(&c, e, d->init_expr, named_type);
- break;
}
- case Entity_Procedure:
- check_proc_decl(&c, e, d);
- break;
- case Entity_ProcGroup:
- check_proc_group_decl(&c, e, d);
- break;
+end:;
+ // NOTE(bill): Add it to the list of checked entities
+ if (e->flags & EntityFlag_Lazy) {
+ array_add(&ctx->info->entities, e);
}
- e->state = EntityState_Resolved;
-
-#undef TIME_SECTION
+ if (e->flags & EntityFlag_Lazy) {
+ gb_mutex_unlock(&ctx->info->lazy_mutex);
+ }
}