cgen: minor cleanup in gen_assert_xxx() (#8943)

pull/8951/head
yuyi 2021-02-25 02:35:11 +08:00 committed by GitHub
parent 8e69d3629f
commit 3c94a79375
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 27 deletions

View File

@ -1634,29 +1634,29 @@ fn (mut g Gen) gen_attrs(attrs []table.Attr) {
} }
fn (mut g Gen) gen_assert_stmt(original_assert_statement ast.AssertStmt) { fn (mut g Gen) gen_assert_stmt(original_assert_statement ast.AssertStmt) {
mut a := original_assert_statement mut node := original_assert_statement
g.writeln('// assert') g.writeln('// assert')
if mut a.expr is ast.InfixExpr { if mut node.expr is ast.InfixExpr {
if mut a.expr.left is ast.CallExpr { if mut node.expr.left is ast.CallExpr {
a.expr.left = g.new_ctemp_var_then_gen(a.expr.left, a.expr.left_type) node.expr.left = g.new_ctemp_var_then_gen(node.expr.left, node.expr.left_type)
} }
if mut a.expr.right is ast.CallExpr { if mut node.expr.right is ast.CallExpr {
a.expr.right = g.new_ctemp_var_then_gen(a.expr.right, a.expr.right_type) node.expr.right = g.new_ctemp_var_then_gen(node.expr.right, node.expr.right_type)
} }
} }
g.inside_ternary++ g.inside_ternary++
if g.is_test { if g.is_test {
g.write('if (') g.write('if (')
g.expr(a.expr) g.expr(node.expr)
g.write(')') g.write(')')
g.decrement_inside_ternary() g.decrement_inside_ternary()
g.writeln(' {') g.writeln(' {')
g.writeln('\tg_test_oks++;') g.writeln('\tg_test_oks++;')
metaname_ok := g.gen_assert_metainfo(a) metaname_ok := g.gen_assert_metainfo(node)
g.writeln('\tmain__cb_assertion_ok(&$metaname_ok);') g.writeln('\tmain__cb_assertion_ok(&$metaname_ok);')
g.writeln('} else {') g.writeln('} else {')
g.writeln('\tg_test_fails++;') g.writeln('\tg_test_fails++;')
metaname_fail := g.gen_assert_metainfo(a) metaname_fail := g.gen_assert_metainfo(node)
g.writeln('\tmain__cb_assertion_failed(&$metaname_fail);') g.writeln('\tmain__cb_assertion_failed(&$metaname_fail);')
g.writeln('\tlongjmp(g_jump_buffer, 1);') g.writeln('\tlongjmp(g_jump_buffer, 1);')
g.writeln('\t// TODO') g.writeln('\t// TODO')
@ -1664,11 +1664,11 @@ fn (mut g Gen) gen_assert_stmt(original_assert_statement ast.AssertStmt) {
g.writeln('}') g.writeln('}')
} else { } else {
g.write('if (!(') g.write('if (!(')
g.expr(a.expr) g.expr(node.expr)
g.write('))') g.write('))')
g.decrement_inside_ternary() g.decrement_inside_ternary()
g.writeln(' {') g.writeln(' {')
metaname_panic := g.gen_assert_metainfo(a) metaname_panic := g.gen_assert_metainfo(node)
g.writeln('\t__print_assert_failure(&$metaname_panic);') g.writeln('\t__print_assert_failure(&$metaname_panic);')
g.writeln('\tv_panic(_SLIT("Assertion failed..."));') g.writeln('\tv_panic(_SLIT("Assertion failed..."));')
g.writeln('}') g.writeln('}')
@ -1679,28 +1679,28 @@ fn cnewlines(s string) string {
return s.replace('\n', r'\n') return s.replace('\n', r'\n')
} }
fn (mut g Gen) gen_assert_metainfo(a ast.AssertStmt) string { fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt) string {
mod_path := cestring(g.file.path) mod_path := cestring(g.file.path)
fn_name := g.fn_decl.name fn_name := g.fn_decl.name
line_nr := a.pos.line_nr line_nr := node.pos.line_nr
src := cestring(a.expr.str()) src := cestring(node.expr.str())
metaname := 'v_assert_meta_info_$g.new_tmp_var()' metaname := 'v_assert_meta_info_$g.new_tmp_var()'
g.writeln('\tVAssertMetaInfo $metaname = {0};') g.writeln('\tVAssertMetaInfo $metaname = {0};')
g.writeln('\t${metaname}.fpath = ${ctoslit(mod_path)};') g.writeln('\t${metaname}.fpath = ${ctoslit(mod_path)};')
g.writeln('\t${metaname}.line_nr = $line_nr;') g.writeln('\t${metaname}.line_nr = $line_nr;')
g.writeln('\t${metaname}.fn_name = ${ctoslit(fn_name)};') g.writeln('\t${metaname}.fn_name = ${ctoslit(fn_name)};')
g.writeln('\t${metaname}.src = ${cnewlines(ctoslit(src))};') g.writeln('\t${metaname}.src = ${cnewlines(ctoslit(src))};')
match mut a.expr { match mut node.expr {
ast.InfixExpr { ast.InfixExpr {
g.writeln('\t${metaname}.op = ${ctoslit(a.expr.op.str())};') g.writeln('\t${metaname}.op = ${ctoslit(node.expr.op.str())};')
g.writeln('\t${metaname}.llabel = ${cnewlines(ctoslit(a.expr.left.str()))};') g.writeln('\t${metaname}.llabel = ${cnewlines(ctoslit(node.expr.left.str()))};')
g.writeln('\t${metaname}.rlabel = ${cnewlines(ctoslit(a.expr.right.str()))};') g.writeln('\t${metaname}.rlabel = ${cnewlines(ctoslit(node.expr.right.str()))};')
g.write('\t${metaname}.lvalue = ') g.write('\t${metaname}.lvalue = ')
g.gen_assert_single_expr(a.expr.left, a.expr.left_type) g.gen_assert_single_expr(node.expr.left, node.expr.left_type)
g.writeln(';') g.writeln(';')
// //
g.write('\t${metaname}.rvalue = ') g.write('\t${metaname}.rvalue = ')
g.gen_assert_single_expr(a.expr.right, a.expr.right_type) g.gen_assert_single_expr(node.expr.right, node.expr.right_type)
g.writeln(';') g.writeln(';')
} }
ast.CallExpr { ast.CallExpr {
@ -1711,31 +1711,31 @@ fn (mut g Gen) gen_assert_metainfo(a ast.AssertStmt) string {
return metaname return metaname
} }
fn (mut g Gen) gen_assert_single_expr(e ast.Expr, t table.Type) { fn (mut g Gen) gen_assert_single_expr(expr ast.Expr, typ table.Type) {
unknown_value := '*unknown value*' unknown_value := '*unknown value*'
match e { match expr {
ast.CastExpr, ast.IndexExpr, ast.MatchExpr { ast.CastExpr, ast.IndexExpr, ast.MatchExpr {
g.write(ctoslit(unknown_value)) g.write(ctoslit(unknown_value))
} }
ast.PrefixExpr { ast.PrefixExpr {
if e.right is ast.CastExpr { if expr.right is ast.CastExpr {
// TODO: remove this check; // TODO: remove this check;
// vlib/builtin/map_test.v (a map of &int, set to &int(0)) fails // vlib/builtin/map_test.v (a map of &int, set to &int(0)) fails
// without special casing ast.CastExpr here // without special casing ast.CastExpr here
g.write(ctoslit(unknown_value)) g.write(ctoslit(unknown_value))
} else { } else {
g.gen_expr_to_string(e, t) g.gen_expr_to_string(expr, typ)
} }
} }
ast.Type { ast.Type {
sym := g.table.get_type_symbol(t) sym := g.table.get_type_symbol(typ)
g.write(ctoslit('$sym.name')) g.write(ctoslit('$sym.name'))
} }
else { else {
g.gen_expr_to_string(e, t) g.gen_expr_to_string(expr, typ)
} }
} }
g.write(' /* typeof: ' + e.type_name() + ' type: ' + t.str() + ' */ ') g.write(' /* typeof: ' + expr.type_name() + ' type: ' + typ.str() + ' */ ')
} }
fn (mut g Gen) write_fn_ptr_decl(func &table.FnType, ptr_name string) { fn (mut g Gen) write_fn_ptr_decl(func &table.FnType, ptr_name string) {