Skip to content

Commit 8774f77

Browse files
authored
v.type_resolver: optimize infix ct checking (#23362)
1 parent 3ed799e commit 8774f77

File tree

5 files changed

+16
-7
lines changed

5 files changed

+16
-7
lines changed

vlib/v/ast/ast.v

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,8 +1134,10 @@ pub mut:
11341134

11351135
ct_left_value_evaled bool
11361136
ct_left_value ComptTimeConstValue = empty_comptime_const_value
1137+
left_ct_expr bool // true when left is comptime/generic expr
11371138
ct_right_value_evaled bool
11381139
ct_right_value ComptTimeConstValue = empty_comptime_const_value
1140+
right_ct_expr bool // true when right is comptime/generic expr
11391141

11401142
before_op_comments []Comment
11411143
after_op_comments []Comment

vlib/v/checker/infix.v

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
1818
c.expected_type = chan_info.elem_type
1919
}
2020

21+
if !node.left_ct_expr && !node.left.is_literal() {
22+
node.left_ct_expr = c.comptime.is_comptime(node.left)
23+
}
24+
if !node.right_ct_expr && !node.right.is_literal() {
25+
node.right_ct_expr = c.comptime.is_comptime(node.right)
26+
}
27+
2128
// `if n is ast.Ident && n.is_mut { ... }`
2229
if !c.inside_sql && node.op == .and {
2330
mut left_node := node.left

vlib/v/gen/c/infix.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,9 +1188,9 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) {
11881188
&& node.op in [.plus, .minus, .mul, .div, .mod] && !(g.pref.translated
11891189
|| g.file.is_translated)
11901190
if needs_cast {
1191-
typ_str := if !node.left.is_literal() && g.comptime.is_comptime(node.left) {
1191+
typ_str := if node.left_ct_expr {
11921192
g.styp(g.type_resolver.get_type_or_default(node.left, node.promoted_type))
1193-
} else if !node.right.is_literal() && g.comptime.is_comptime(node.right) {
1193+
} else if node.right_ct_expr {
11941194
g.styp(g.type_resolver.get_type_or_default(node.right, node.promoted_type))
11951195
} else {
11961196
g.styp(node.promoted_type)

vlib/v/type_resolver/comptime_resolver.v

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,7 @@ pub fn (t &ResolverInfo) is_comptime(node ast.Expr) bool {
5050
return node.expr is ast.Ident && node.expr.ct_expr
5151
}
5252
ast.InfixExpr {
53-
if node.op in [.plus, .minus, .mul, .div, .mod] {
54-
t.is_comptime(node.left) || t.is_comptime(node.right)
55-
} else {
56-
false
57-
}
53+
return node.left_ct_expr || node.right_ct_expr
5854
}
5955
ast.ParExpr {
6056
return t.is_comptime(node.expr)

vlib/v/type_resolver/type_resolver.v

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ pub fn (mut t TypeResolver) get_type_or_default(node ast.Expr, default_typ ast.T
130130
}
131131
}
132132
}
133+
ast.ComptimeSelector {
134+
// val.$(field.name)
135+
return t.get_comptime_selector_type(node, ast.void_type)
136+
}
133137
ast.CastExpr {
134138
if node.typ.has_flag(.generic) {
135139
return t.resolver.unwrap_generic(node.typ)

0 commit comments

Comments
 (0)