aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-08-16 22:16:03 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2021-08-16 22:16:03 +0200
commit3af078e9417274ce7b6fdfa76ebd72ac26f87668 (patch)
tree1a3b58ce02044bb1cfdfdcea03ed70c1e135f7d4 /src
parent48c1f0ab590d5f120548a212fff2c762f8818f34 (diff)
parent19386814b3ff02914d59ecf20e40191f151d8dbe (diff)
Merge branch 'master' into bigint
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp11
-rw-r--r--src/check_type.cpp7
-rw-r--r--src/checker.cpp10
-rw-r--r--src/checker.hpp3
-rw-r--r--src/entity.cpp4
-rw-r--r--src/parser.cpp3
-rw-r--r--src/types.cpp6
7 files changed, 27 insertions, 17 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 30f44a59f..581021ac7 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -923,7 +923,7 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source,
poly->kind = Type_EnumeratedArray;
poly->cached_size = -1;
poly->cached_align = -1;
- poly->flags = source->flags;
+ poly->flags.exchange(source->flags);
poly->failure = false;
poly->EnumeratedArray.elem = source->EnumeratedArray.elem;
poly->EnumeratedArray.index = source->EnumeratedArray.index;
@@ -4117,20 +4117,23 @@ bool check_identifier_exists(Scope *s, Ast *node, bool nested = false, Scope **o
}
isize add_dependencies_from_unpacking(CheckerContext *c, Entity **lhs, isize lhs_count, isize tuple_index, isize tuple_count) {
- if (lhs != nullptr) {
+ if (lhs != nullptr && c->decl != nullptr) {
+ mutex_lock(&c->info->deps_mutex);
+
for (isize j = 0; (tuple_index + j) < lhs_count && j < tuple_count; j++) {
Entity *e = lhs[tuple_index + j];
if (e != nullptr) {
DeclInfo *decl = decl_info_of_entity(e);
if (decl != nullptr) {
- c->decl = decl; // will be reset by the 'defer' any way
for_array(k, decl->deps.entries) {
Entity *dep = decl->deps.entries[k].ptr;
- add_declaration_dependency(c, dep); // TODO(bill): Should this be here?
+ ptr_set_add(&c->decl->deps, dep);
}
}
}
}
+
+ mutex_unlock(&c->info->deps_mutex);
}
return tuple_count;
}
diff --git a/src/check_type.cpp b/src/check_type.cpp
index d2a216c93..7dbd72612 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -159,7 +159,12 @@ void check_struct_fields(CheckerContext *ctx, Ast *node, Array<Entity *> *fields
Entity *field = alloc_entity_field(ctx->scope, name_token, type, is_using, field_src_index);
add_entity(ctx, ctx->scope, name, field);
array_add(fields, field);
- array_add(tags, p->tag.string);
+ String tag = p->tag.string;
+ if (tag.len != 0 && !unquote_string(permanent_allocator(), &tag, 0, tag.text[0] == '`')) {
+ error(p->tag, "Invalid string literal");
+ tag = {};
+ }
+ array_add(tags, tag);
field_src_index += 1;
}
diff --git a/src/checker.cpp b/src/checker.cpp
index 79a60f896..11d706403 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -629,14 +629,16 @@ void check_scope_usage(Checker *c, Scope *scope) {
}
-void add_dependency(DeclInfo *d, Entity *e) {
+void add_dependency(CheckerInfo *info, DeclInfo *d, Entity *e) {
+ mutex_lock(&info->deps_mutex);
ptr_set_add(&d->deps, e);
+ mutex_unlock(&info->deps_mutex);
}
void add_type_info_dependency(DeclInfo *d, Type *type) {
if (d == nullptr) {
- // GB_ASSERT(type == t_invalid);
return;
}
+ // NOTE(bill): no mutex is required here because the only procedure calling it is wrapped in a mutex already
ptr_set_add(&d->type_info_deps, type);
}
@@ -657,7 +659,7 @@ void add_package_dependency(CheckerContext *c, char const *package_name, char co
e->flags |= EntityFlag_Used;
GB_ASSERT_MSG(e != nullptr, "%s", name);
GB_ASSERT(c->decl != nullptr);
- ptr_set_add(&c->decl->deps, e);
+ add_dependency(c->info, c->decl, e);
}
void add_declaration_dependency(CheckerContext *c, Entity *e) {
@@ -665,7 +667,7 @@ void add_declaration_dependency(CheckerContext *c, Entity *e) {
return;
}
if (c->decl != nullptr) {
- add_dependency(c->decl, e);
+ add_dependency(c->info, c->decl, e);
}
}
diff --git a/src/checker.hpp b/src/checker.hpp
index bf462de71..dea24ae53 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -300,7 +300,8 @@ struct CheckerInfo {
BlockingMutex global_untyped_mutex;
BlockingMutex builtin_mutex;
- // NOT recursive & Only used at the end of `check_proc_body`
+ // NOT recursive & only used at the end of `check_proc_body`
+ // and in `add_dependency`.
// This is a possible source of contention but probably not
// too much of a problem in practice
BlockingMutex deps_mutex;
diff --git a/src/entity.cpp b/src/entity.cpp
index e7b888365..fb65bc3a8 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -115,8 +115,8 @@ enum ProcedureOptimizationMode : u32 {
struct Entity {
EntityKind kind;
u64 id;
- u64 flags;
- EntityState state;
+ std::atomic<u64> flags;
+ std::atomic<EntityState> state;
Token token;
Scope * scope;
Type * type;
diff --git a/src/parser.cpp b/src/parser.cpp
index 8f3ffb8cc..2db8384a7 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -5018,10 +5018,9 @@ AstPackage *try_add_import_path(Parser *p, String const &path, String const &rel
gb_global Rune illegal_import_runes[] = {
'"', '\'', '`',
- // ' ',
'\t', '\r', '\n', '\v', '\f',
'\\', // NOTE(bill): Disallow windows style filepaths
- '!', '$', '%', '^', '&', '*', '(', ')', '=', '+',
+ '!', '$', '%', '^', '&', '*', '(', ')', '=',
'[', ']', '{', '}',
';',
':', // NOTE(bill): Disallow windows style absolute filepaths
diff --git a/src/types.cpp b/src/types.cpp
index f497e9509..fd5bdbc6d 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -306,9 +306,9 @@ struct Type {
};
// NOTE(bill): These need to be at the end to not affect the unionized data
- i64 cached_size;
- i64 cached_align;
- u32 flags; // TypeFlag
+ std::atomic<i64> cached_size;
+ std::atomic<i64> cached_align;
+ std::atomic<u32> flags; // TypeFlag
bool failure;
};