Skip to content

Commit fccd7cd

Browse files
authored
cgen: simplify in infix_expr_and_or_op() (#21745)
1 parent d9a300c commit fccd7cd

File tree

2 files changed

+49
-127
lines changed

2 files changed

+49
-127
lines changed

vlib/v/gen/c/if.v

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -39,34 +39,21 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool {
3939
return true
4040
}
4141
match expr {
42-
ast.Ident {
43-
return expr.or_expr.kind != .absent
44-
}
45-
ast.StringInterLiteral {
46-
for e in expr.exprs {
47-
if g.need_tmp_var_in_expr(e) {
48-
return true
49-
}
50-
}
51-
}
52-
ast.IfExpr {
53-
if g.need_tmp_var_in_if(expr) {
42+
ast.ArrayInit {
43+
if g.need_tmp_var_in_expr(expr.len_expr) {
5444
return true
5545
}
56-
}
57-
ast.IfGuardExpr {
58-
return true
59-
}
60-
ast.InfixExpr {
61-
if g.need_tmp_var_in_expr(expr.left) {
46+
if g.need_tmp_var_in_expr(expr.cap_expr) {
6247
return true
6348
}
64-
if g.need_tmp_var_in_expr(expr.right) {
49+
if g.need_tmp_var_in_expr(expr.init_expr) {
6550
return true
6651
}
67-
}
68-
ast.MatchExpr {
69-
return true
52+
for elem_expr in expr.exprs {
53+
if g.need_tmp_var_in_expr(elem_expr) {
54+
return true
55+
}
56+
}
7057
}
7158
ast.CallExpr {
7259
if expr.is_method {
@@ -90,9 +77,6 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool {
9077
ast.CastExpr {
9178
return g.need_tmp_var_in_expr(expr.expr)
9279
}
93-
ast.ParExpr {
94-
return g.need_tmp_var_in_expr(expr.expr)
95-
}
9680
ast.ConcatExpr {
9781
for val in expr.vals {
9882
if val is ast.CallExpr {
@@ -102,6 +86,17 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool {
10286
}
10387
}
10488
}
89+
ast.Ident {
90+
return expr.or_expr.kind != .absent
91+
}
92+
ast.IfExpr {
93+
if g.need_tmp_var_in_if(expr) {
94+
return true
95+
}
96+
}
97+
ast.IfGuardExpr {
98+
return true
99+
}
105100
ast.IndexExpr {
106101
if expr.or_expr.kind != .absent {
107102
return true
@@ -110,21 +105,13 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool {
110105
return true
111106
}
112107
}
113-
ast.ArrayInit {
114-
if g.need_tmp_var_in_expr(expr.len_expr) {
115-
return true
116-
}
117-
if g.need_tmp_var_in_expr(expr.cap_expr) {
108+
ast.InfixExpr {
109+
if g.need_tmp_var_in_expr(expr.left) {
118110
return true
119111
}
120-
if g.need_tmp_var_in_expr(expr.init_expr) {
112+
if g.need_tmp_var_in_expr(expr.right) {
121113
return true
122114
}
123-
for elem_expr in expr.exprs {
124-
if g.need_tmp_var_in_expr(elem_expr) {
125-
return true
126-
}
127-
}
128115
}
129116
ast.MapInit {
130117
for key in expr.keys {
@@ -138,6 +125,28 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool {
138125
}
139126
}
140127
}
128+
ast.MatchExpr {
129+
return true
130+
}
131+
ast.ParExpr {
132+
return g.need_tmp_var_in_expr(expr.expr)
133+
}
134+
ast.PrefixExpr {
135+
return g.need_tmp_var_in_expr(expr.right)
136+
}
137+
ast.SelectorExpr {
138+
if g.need_tmp_var_in_expr(expr.expr) {
139+
return true
140+
}
141+
return expr.or_block.kind != .absent
142+
}
143+
ast.StringInterLiteral {
144+
for e in expr.exprs {
145+
if g.need_tmp_var_in_expr(e) {
146+
return true
147+
}
148+
}
149+
}
141150
ast.StructInit {
142151
if g.need_tmp_var_in_expr(expr.update_expr) {
143152
return true
@@ -148,12 +157,6 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool {
148157
}
149158
}
150159
}
151-
ast.SelectorExpr {
152-
if g.need_tmp_var_in_expr(expr.expr) {
153-
return true
154-
}
155-
return expr.or_block.kind != .absent
156-
}
157160
else {}
158161
}
159162
return false

vlib/v/gen/c/infix.v

Lines changed: 4 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -959,47 +959,7 @@ fn (mut g Gen) need_tmp_var_in_array_call(node ast.Expr) bool {
959959

960960
// infix_expr_and_or_op generates code for `&&` and `||`
961961
fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) {
962-
if node.right is ast.IfExpr {
963-
// `b := a && if true { a = false ...} else {...}`
964-
prev_inside_ternary := g.inside_ternary
965-
g.inside_ternary = 0
966-
if g.need_tmp_var_in_if(node.right) {
967-
tmp := g.new_tmp_var()
968-
cur_line := g.go_before_last_stmt().trim_space()
969-
g.empty_line = true
970-
g.write('bool ${tmp} = (')
971-
g.expr(node.left)
972-
g.writeln(');')
973-
g.set_current_pos_as_last_stmt_pos()
974-
g.write('${cur_line} ${tmp} ${node.op.str()} ')
975-
g.infix_left_var_name = if node.op == .and { tmp } else { '!${tmp}' }
976-
g.expr(node.right)
977-
g.infix_left_var_name = ''
978-
g.inside_ternary = prev_inside_ternary
979-
return
980-
}
981-
g.inside_ternary = prev_inside_ternary
982-
} else if node.right is ast.MatchExpr {
983-
// `b := a && match true { true { a = false ...} else {...}}`
984-
prev_inside_ternary := g.inside_ternary
985-
g.inside_ternary = 0
986-
if g.need_tmp_var_in_match(node.right) {
987-
tmp := g.new_tmp_var()
988-
cur_line := g.go_before_last_stmt().trim_space()
989-
g.empty_line = true
990-
g.write('bool ${tmp} = (')
991-
g.expr(node.left)
992-
g.writeln(');')
993-
g.set_current_pos_as_last_stmt_pos()
994-
g.write('${cur_line} ${tmp} ${node.op.str()} ')
995-
g.infix_left_var_name = if node.op == .and { tmp } else { '!${tmp}' }
996-
g.expr(node.right)
997-
g.infix_left_var_name = ''
998-
g.inside_ternary = prev_inside_ternary
999-
return
1000-
}
1001-
g.inside_ternary = prev_inside_ternary
1002-
} else if g.need_tmp_var_in_array_call(node.right) {
962+
if g.need_tmp_var_in_array_call(node.right) {
1003963
// `if a == 0 || arr.any(it.is_letter()) {...}`
1004964
tmp := g.new_tmp_var()
1005965
cur_line := g.go_before_last_stmt().trim_space()
@@ -1016,48 +976,7 @@ fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) {
1016976
g.infix_left_var_name = if node.op == .and { tmp } else { '!${tmp}' }
1017977
g.expr(node.right)
1018978
g.infix_left_var_name = ''
1019-
return
1020-
} else if node.right is ast.CallExpr {
1021-
if node.right.or_block.kind != .absent {
1022-
prev_inside_ternary := g.inside_ternary
1023-
g.inside_ternary = 0
1024-
tmp := g.new_tmp_var()
1025-
cur_line := g.go_before_last_stmt().trim_space()
1026-
g.empty_line = true
1027-
g.write('bool ${tmp} = (')
1028-
g.expr(node.left)
1029-
g.writeln(');')
1030-
g.set_current_pos_as_last_stmt_pos()
1031-
g.write('${cur_line} ${tmp} ${node.op.str()} ')
1032-
g.infix_left_var_name = if node.op == .and { tmp } else { '!${tmp}' }
1033-
g.expr(node.right)
1034-
g.infix_left_var_name = ''
1035-
g.inside_ternary = prev_inside_ternary
1036-
return
1037-
}
1038-
} else if node.right is ast.PrefixExpr && g.inside_ternary == 0 {
1039-
prefix := node.right
1040-
if prefix.op == .not && prefix.right is ast.CallExpr {
1041-
call_expr := prefix.right as ast.CallExpr
1042-
if call_expr.or_block.kind != .absent {
1043-
prev_inside_ternary := g.inside_ternary
1044-
g.inside_ternary = 0
1045-
tmp := g.new_tmp_var()
1046-
cur_line := g.go_before_last_stmt().trim_space()
1047-
g.empty_line = true
1048-
g.write('bool ${tmp} = (')
1049-
g.expr(node.left)
1050-
g.writeln(');')
1051-
g.set_current_pos_as_last_stmt_pos()
1052-
g.write('${cur_line} ${tmp} ${node.op.str()} ')
1053-
g.infix_left_var_name = '!${tmp}'
1054-
g.expr(node.right)
1055-
g.infix_left_var_name = ''
1056-
g.inside_ternary = prev_inside_ternary
1057-
return
1058-
}
1059-
}
1060-
} else if node.right is ast.InfixExpr && g.need_tmp_var_in_expr(node.right) {
979+
} else if g.need_tmp_var_in_expr(node.right) && g.inside_ternary == 0 {
1061980
prev_inside_ternary := g.inside_ternary
1062981
g.inside_ternary = 0
1063982
tmp := g.new_tmp_var()
@@ -1072,9 +991,9 @@ fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) {
1072991
g.expr(node.right)
1073992
g.infix_left_var_name = ''
1074993
g.inside_ternary = prev_inside_ternary
1075-
return
994+
} else {
995+
g.gen_plain_infix_expr(node)
1076996
}
1077-
g.gen_plain_infix_expr(node)
1078997
}
1079998

1080999
fn (mut g Gen) gen_is_none_check(node ast.InfixExpr) {

0 commit comments

Comments
 (0)