aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-04 15:35:24 +0000
committergingerBill <bill@gingerbill.org>2023-01-04 15:35:24 +0000
commit12e42d92d30b3a9cf4d7bb7bb17a2e031285073b (patch)
tree7f5f5e8684814fd24a2f98e70f4933cfde1a0aa9 /src/check_expr.cpp
parentfaa735d0c745ddc0b550e2a54f10588c873841b7 (diff)
Localize `GenProcsData` to the entity itself
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 5f28504a2..bce16f304 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -366,8 +366,6 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E
GB_ASSERT(dst == nullptr);
}
- // MUTEX_GUARD(&info->gen_procs_mutex);
-
if (!src->Proc.is_polymorphic || src->Proc.is_poly_specialized) {
return false;
}
@@ -434,20 +432,21 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E
GenProcsData *gen_procs = nullptr;
- // @@GPM //////////////////////////
- mutex_lock(&info->gen_procs_mutex);
- ///////////////////////////////////
- auto *found = map_get(&info->gen_procs, base_entity->identifier.load());
- if (found) {
- gen_procs = *found;
+ GB_ASSERT(base_entity->identifier.load()->kind == Ast_Ident);
+ GB_ASSERT(base_entity->kind == Entity_Procedure);
+
+
+ mutex_lock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex
+
+ gen_procs = base_entity->Procedure.gen_procs;
+ if (gen_procs) {
rw_mutex_shared_lock(&gen_procs->mutex); // @local-mutex
+
for (Entity *other : gen_procs->procs) {
Type *pt = base_type(other->type);
if (are_types_identical(pt, final_proc_type)) {
rw_mutex_shared_unlock(&gen_procs->mutex); // @local-mutex
- // @@GPM ////////////////////////////
- mutex_unlock(&info->gen_procs_mutex);
- /////////////////////////////////////
+ mutex_unlock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex
if (poly_proc_data) {
poly_proc_data->gen_entity = other;
@@ -455,15 +454,15 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E
return true;
}
}
+
rw_mutex_shared_unlock(&gen_procs->mutex); // @local-mutex
} else {
gen_procs = gb_alloc_item(permanent_allocator(), GenProcsData);
gen_procs->procs.allocator = heap_allocator();
- map_set(&info->gen_procs, base_entity->identifier.load(), gen_procs);
+ base_entity->Procedure.gen_procs = gen_procs;
}
- // @@GPM ////////////////////////////
- mutex_unlock(&info->gen_procs_mutex);
- /////////////////////////////////////
+
+ mutex_unlock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex
{
// LEAK TODO(bill): This is technically a memory leak as it has to generate the type twice