Browse Source

Minimize mutex usage in `update_expr_type`

gingerBill 4 years ago
parent
commit
257b749e9d
1 changed files with 20 additions and 20 deletions
  1. 20 20
      src/check_expr.cpp

+ 20 - 20
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) {