Make Entity.parent_proc_decl atomic

This commit is contained in:
gingerBill
2026-02-02 10:58:25 +00:00
parent 8a92ba74fc
commit acabae8644
3 changed files with 8 additions and 6 deletions

View File

@@ -170,7 +170,7 @@ struct Entity {
Type * type;
std::atomic<Ast *> identifier; // Can be nullptr
DeclInfo * decl_info;
DeclInfo * parent_proc_decl; // nullptr if in file/global scope
std::atomic<DeclInfo *> parent_proc_decl; // nullptr if in file/global scope
AstFile * file;
AstPackage *pkg;
@@ -370,7 +370,7 @@ gb_internal Entity *alloc_entity_using_variable(Entity *parent, Token token, Typ
token.pos = parent->token.pos;
Entity *entity = alloc_entity(Entity_Variable, parent->scope, token, type);
entity->using_parent = parent;
entity->parent_proc_decl = parent->parent_proc_decl;
entity->parent_proc_decl.store(parent->parent_proc_decl, std::memory_order_relaxed);
entity->using_expr = using_expr;
entity->flags |= EntityFlag_Using;
entity->flags |= EntityFlag_Used;

View File

@@ -2215,8 +2215,10 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
Entity *e = entity_of_node(ident);
GB_ASSERT(e != nullptr);
if (e->parent_proc_decl != nullptr && e->parent_proc_decl->entity != nullptr) {
procedure = e->parent_proc_decl->entity.load()->token.string;
DeclInfo *parent_proc_decl = e->parent_proc_decl.load(std::memory_order_relaxed);
if (parent_proc_decl != nullptr &&
parent_proc_decl->entity != nullptr) {
procedure = parent_proc_decl->entity.load()->token.string;
} else {
procedure = str_lit("");
}

View File

@@ -559,8 +559,8 @@ gb_internal void write_canonical_parent_prefix(TypeWriter *w, Entity *e) {
// no prefix
return;
}
if (e->parent_proc_decl) {
Entity *p = e->parent_proc_decl->entity;
if (e->parent_proc_decl.load(std::memory_order_relaxed)) {
Entity *p = e->parent_proc_decl.load(std::memory_order_relaxed)->entity;
write_canonical_parent_prefix(w, p);
type_writer_append(w, p->token.string.text, p->token.string.len);
if (is_type_polymorphic(p->type)) {