aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-03 17:07:53 +0000
committergingerBill <bill@gingerbill.org>2023-01-03 17:07:53 +0000
commitbb80c1b05922a1d1a76e96f0bc5edba09292b1e9 (patch)
tree96c8ecc89a7a4f022decbd3621add47f9eb5f825 /src
parent85e390deba48437eb8268e2a1067e2c377613352 (diff)
Add `type_and_value_mutex` to `DeclInfo`
Diffstat (limited to 'src')
-rw-r--r--src/checker.cpp8
-rw-r--r--src/checker.hpp2
2 files changed, 8 insertions, 2 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 3f5c2892f..11e0dfa47 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -1453,7 +1453,9 @@ gb_internal void add_type_and_value(CheckerContext *ctx, Ast *expr, AddressingMo
}
BlockingMutex *mutex = &ctx->info->type_and_value_mutex;
- if (ctx->pkg) {
+ if (ctx->decl) {
+ mutex = &ctx->decl->type_and_value_mutex;
+ } else if (ctx->pkg) {
// TODO(bill): is a per package mutex is a good idea here?
mutex = &ctx->pkg->type_and_value_mutex;
}
@@ -1749,7 +1751,7 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) {
if (is_type_untyped(t)) {
return; // Could be nil
}
- if (is_type_polymorphic(base_type(t))) {
+ if (is_type_polymorphic(t)) {
return;
}
@@ -1764,6 +1766,8 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) {
bool prev = false;
isize ti_index = -1;
+ // NOTE(bill): this is a linear lookup, and is most likely very costly
+ // as this map keeps growing linearly
for (auto const &e : c->info->type_info_map) {
if (are_types_identical_unique_tuples(t, e.key)) {
// Duplicate entry
diff --git a/src/checker.hpp b/src/checker.hpp
index d647cd67f..60800349b 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -185,6 +185,8 @@ struct DeclInfo {
RwMutex type_info_deps_mutex;
PtrSet<Type *> type_info_deps;
+ BlockingMutex type_and_value_mutex;
+
Array<BlockLabel> labels;
};