Skip to content

Commit 14072ce

Browse files
authored
cgen: minimize code generated for asserts (generate the common parts for the pass/fail case once) (#25642)
1 parent 2d856e7 commit 14072ce

File tree

1 file changed

+54
-44
lines changed

1 file changed

+54
-44
lines changed

vlib/v/gen/c/assert.v

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ fn (mut g Gen) assert_stmt(original_assert_statement ast.AssertStmt) {
3131
node.expr.right = subst_expr
3232
}
3333
}
34+
metaname := g.gen_assert_metainfo_common(node)
3435
g.inside_ternary++
3536
if g.pref.is_test {
3637
g.write('if (')
@@ -41,11 +42,11 @@ fn (mut g Gen) assert_stmt(original_assert_statement ast.AssertStmt) {
4142
g.write(')')
4243
g.decrement_inside_ternary()
4344
g.writeln(' {')
44-
metaname_ok := g.gen_assert_metainfo(node, .pass)
45-
g.writeln('\tmain__TestRunner_name_table[test_runner._typ]._method_assert_pass(test_runner._object, &${metaname_ok});')
45+
g.gen_assert_metainfo(node, .pass, metaname)
46+
g.writeln('\tmain__TestRunner_name_table[test_runner._typ]._method_assert_pass(test_runner._object, &${metaname});')
4647
g.writeln('} else {')
47-
metaname_fail := g.gen_assert_metainfo(node, .fail)
48-
g.writeln('\tmain__TestRunner_name_table[test_runner._typ]._method_assert_fail(test_runner._object, &${metaname_fail});')
48+
g.gen_assert_metainfo(node, .fail, metaname)
49+
g.writeln('\tmain__TestRunner_name_table[test_runner._typ]._method_assert_fail(test_runner._object, &${metaname});')
4950
g.gen_assert_postfailure_mode(node)
5051
g.writeln('}')
5152
} else {
@@ -57,8 +58,8 @@ fn (mut g Gen) assert_stmt(original_assert_statement ast.AssertStmt) {
5758
g.write('))')
5859
g.decrement_inside_ternary()
5960
g.writeln(' {')
60-
metaname_panic := g.gen_assert_metainfo(node, .panic)
61-
g.writeln('\tbuiltin____print_assert_failure(&${metaname_panic});')
61+
g.gen_assert_metainfo(node, .panic, metaname)
62+
g.writeln('\tbuiltin____print_assert_failure(&${metaname});')
6263
g.gen_assert_postfailure_mode(node)
6364
g.writeln('}')
6465
}
@@ -126,13 +127,48 @@ fn (mut g Gen) gen_assert_postfailure_mode(node ast.AssertStmt) {
126127
if g.pref.is_test {
127128
g.writeln('\tlongjmp(g_jump_buffer, 1);')
128129
}
129-
g.writeln2('\t// TODO', '\t// Maybe print all vars in a test function if it fails?')
130130
if g.pref.assert_failure_mode != .continues {
131131
g.writeln('\tbuiltin___v_panic(_S("Assertion failed..."));')
132132
}
133133
}
134134

135-
fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt, kind AssertMetainfoKind) string {
135+
fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt, kind AssertMetainfoKind, metaname string) {
136+
if kind == .pass {
137+
return
138+
}
139+
if node.extra is ast.EmptyExpr {
140+
g.writeln('\t${metaname}.has_msg = false;')
141+
g.writeln('\t${metaname}.message = _SLIT0;')
142+
} else {
143+
g.writeln('\t${metaname}.has_msg = true;')
144+
g.write('\t${metaname}.message = ')
145+
g.gen_assert_single_expr(node.extra, ast.string_type)
146+
g.writeln(';')
147+
}
148+
match node.expr {
149+
ast.InfixExpr {
150+
left_type := if node.expr.left_ct_expr {
151+
g.type_resolver.get_type_or_default(node.expr.left, node.expr.left_type)
152+
} else {
153+
node.expr.left_type
154+
}
155+
right_type := if node.expr.right_ct_expr {
156+
g.type_resolver.get_type(node.expr.right)
157+
} else {
158+
node.expr.right_type
159+
}
160+
g.write('\t${metaname}.lvalue = ')
161+
g.gen_assert_single_expr(node.expr.left, left_type)
162+
g.writeln(';')
163+
g.write('\t${metaname}.rvalue = ')
164+
g.gen_assert_single_expr(node.expr.right, right_type)
165+
g.writeln(';')
166+
}
167+
else {}
168+
}
169+
}
170+
171+
fn (mut g Gen) gen_assert_metainfo_common(node ast.AssertStmt) string {
136172
mod_path := cestring(g.file.path)
137173
fn_name := g.fn_decl.name
138174
line_nr := node.pos.line_nr
@@ -142,53 +178,27 @@ fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt, kind AssertMetainfoKind)
142178
}
143179
src = cestring(src)
144180
metaname := 'v_assert_meta_info_${g.new_tmp_var()}'
145-
g.writeln('\tVAssertMetaInfo ${metaname} = {0};')
146-
g.writeln('\t${metaname}.fpath = ${ctoslit(mod_path)};')
147-
g.writeln('\t${metaname}.line_nr = ${line_nr};')
148-
g.writeln('\t${metaname}.fn_name = ${ctoslit(fn_name)};')
181+
g.writeln('VAssertMetaInfo ${metaname} = {0};')
182+
g.writeln('${metaname}.fpath = ${ctoslit(mod_path)};')
183+
g.writeln('${metaname}.line_nr = ${line_nr};')
184+
g.writeln('${metaname}.fn_name = ${ctoslit(fn_name)};')
149185
metasrc := cnewlines(ctoslit(src))
150-
g.writeln('\t${metaname}.src = ${metasrc};')
186+
g.writeln('${metaname}.src = ${metasrc};')
187+
g.writeln('${metaname}.has_msg = false;')
151188
match node.expr {
152189
ast.InfixExpr {
153190
expr_op_str := ctoslit(node.expr.op.str())
154191
expr_left_str := cnewlines(ctoslit(node.expr.left.str()))
155192
expr_right_str := cnewlines(ctoslit(node.expr.right.str()))
156-
g.writeln('\t${metaname}.op = ${expr_op_str};')
157-
g.writeln('\t${metaname}.llabel = ${expr_left_str};')
158-
g.writeln('\t${metaname}.rlabel = ${expr_right_str};')
159-
left_type := if node.expr.left_ct_expr {
160-
g.type_resolver.get_type_or_default(node.expr.left, node.expr.left_type)
161-
} else {
162-
node.expr.left_type
163-
}
164-
right_type := if node.expr.right_ct_expr {
165-
g.type_resolver.get_type(node.expr.right)
166-
} else {
167-
node.expr.right_type
168-
}
169-
if kind != .pass {
170-
g.write('\t${metaname}.lvalue = ')
171-
g.gen_assert_single_expr(node.expr.left, left_type)
172-
g.writeln(';')
173-
g.write('\t${metaname}.rvalue = ')
174-
g.gen_assert_single_expr(node.expr.right, right_type)
175-
g.writeln(';')
176-
}
193+
g.writeln('${metaname}.op = ${expr_op_str};')
194+
g.writeln('${metaname}.llabel = ${expr_left_str};')
195+
g.writeln('${metaname}.rlabel = ${expr_right_str};')
177196
}
178197
ast.CallExpr {
179-
g.writeln('\t${metaname}.op = _S("call");')
198+
g.writeln('${metaname}.op = _S("call");')
180199
}
181200
else {}
182201
}
183-
if node.extra is ast.EmptyExpr {
184-
g.writeln('\t${metaname}.has_msg = false;')
185-
g.writeln('\t${metaname}.message = _SLIT0;')
186-
} else {
187-
g.writeln('\t${metaname}.has_msg = true;')
188-
g.write('\t${metaname}.message = ')
189-
g.gen_assert_single_expr(node.extra, ast.string_type)
190-
g.writeln(';')
191-
}
192202
return metaname
193203
}
194204

0 commit comments

Comments
 (0)