diff options
| author | gingerBill <bill@gingerbill.org> | 2021-07-11 00:21:31 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-07-11 00:21:31 +0100 |
| commit | 257b749e9d5016d3dd583fa3d1ed7537a5104b6e (patch) | |
| tree | c45562174fafa94a0e3d9a69a3b4ca6641e61525 /src/check_expr.cpp | |
| parent | d9e6ade03007f4ede6471a6ada23b2469e2f052d (diff) | |
Minimize mutex usage in `update_expr_type`
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 455fed21a..04da20ea5 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2929,7 +2929,6 @@ void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Type *type_hint void update_expr_type(CheckerContext *c, Ast *e, Type *type, bool final) { GB_ASSERT(e != nullptr); gb_mutex_lock(&c->info->untyped_mutex); - defer (gb_mutex_unlock(&c->info->untyped_mutex)); ExprInfo *old = check_get_expr_info(c->info, e); if (old == nullptr) { if (type != nullptr && type != t_invalid) { @@ -2940,6 +2939,26 @@ void update_expr_type(CheckerContext *c, Ast *e, Type *type, bool final) { return; } + if (!final && is_type_untyped(type)) { + old->type = base_type(type); + } else { + + // We need to remove it and then give it a new one + map_remove(&c->info->untyped, hash_node(e)); + + if (old->is_lhs && !is_type_integer(type)) { + gbString expr_str = expr_to_string(e); + gbString type_str = type_to_string(type); + error(e, "Shifted operand %s must be an integer, got %s", expr_str, type_str); + gb_string_free(type_str); + gb_string_free(expr_str); + return; + } + + add_type_and_value(c->info, e, old->mode, type, old->value); + } + gb_mutex_unlock(&c->info->untyped_mutex); + switch (e->kind) { case_ast_node(ue, UnaryExpr, e); if (old->value.kind != ExactValue_Invalid) { @@ -2990,25 +3009,6 @@ void update_expr_type(CheckerContext *c, Ast *e, Type *type, bool final) { update_expr_type(c, pe->expr, type, final); case_end; } - - if (!final && is_type_untyped(type)) { - old->type = base_type(type); - return; - } - - // We need to remove it and then give it a new one - map_remove(&c->info->untyped, hash_node(e)); - - if (old->is_lhs && !is_type_integer(type)) { - gbString expr_str = expr_to_string(e); - gbString type_str = type_to_string(type); - error(e, "Shifted operand %s must be an integer, got %s", expr_str, type_str); - gb_string_free(type_str); - gb_string_free(expr_str); - return; - } - - add_type_and_value(c->info, e, old->mode, type, old->value); } void update_expr_value(CheckerContext *c, Ast *e, ExactValue value) { |