From 7a218286b388a8bd7b66069bb5da8e872ba65bce Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 8 Apr 2020 17:21:36 +0200 Subject: [PATCH] cgen: fix returning optional consts; fix csv test --- cmd/tools/vtest-fixed.v | 1 - vlib/encoding/csv/reader.v | 4 ++- vlib/v/gen/cgen.v | 59 +++++++++++++++++++++++++++----------- vlib/v/token/token.v | 4 +-- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/cmd/tools/vtest-fixed.v b/cmd/tools/vtest-fixed.v index ac102d5a76..5631889b22 100644 --- a/cmd/tools/vtest-fixed.v +++ b/cmd/tools/vtest-fixed.v @@ -16,7 +16,6 @@ const ( 'vlib/crypto/rc4/rc4_test.v', 'vlib/encoding/base64/base64_memory_test.v', 'vlib/encoding/base64/base64_test.v', - 'vlib/encoding/csv/csv_test.v', 'vlib/encoding/utf8/utf8_util_test.v', 'vlib/eventbus/eventbus_test.v', 'vlib/flag/flag_test.v', diff --git a/vlib/encoding/csv/reader.v b/vlib/encoding/csv/reader.v index a5a4157f7e..ddf2feed94 100644 --- a/vlib/encoding/csv/reader.v +++ b/vlib/encoding/csv/reader.v @@ -112,10 +112,12 @@ fn (r mut Reader) read_record() ?[]string { for { // not quoted if line[0] != `"` { - i = line.index(r.delimiter.str()) or { + // QTODO i = ... + j := line.index(r.delimiter.str()) or { // last break } + i = j fields << line[..i] line = line[i+1..] continue diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 7fd62e2a69..4f11e163c1 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -1123,9 +1123,9 @@ fn (g mut Gen) expr(node ast.Expr) { } // g.write('/*pref*/') g.write(it.op.str()) - //g.write('(') + // g.write('(') g.expr(it.right) - //g.write(')') + // g.write(')') g.is_amp = false } ast.SizeOf { @@ -1793,7 +1793,7 @@ fn (g mut Gen) return_statement(node ast.Return) { typ_sym := g.table.get_type_symbol(g.fn_decl.return_type) mr_info := typ_sym.info as table.MultiReturn mut styp := g.typ(g.fn_decl.return_type) - if fn_return_is_optional { + if fn_return_is_optional { // && !table.type_is(node.types[0], .optional) && node.types[0] != styp = styp[7..] // remove 'Option_' g.write('opt_ok(& ($styp []) { ') } @@ -1812,8 +1812,10 @@ fn (g mut Gen) return_statement(node ast.Return) { } else if node.exprs.len == 1 { // normal return g.write(' ') + return_sym := g.table.get_type_symbol(node.types[0]) // `return opt_ok(expr)` for functions that expect an optional - if fn_return_is_optional && !table.type_is(node.types[0], .optional) { + if fn_return_is_optional && !table.type_is(node.types[0], .optional) && return_sym.name != + 'Option' { mut is_none := false mut is_error := false expr0 := node.exprs[0] @@ -1831,7 +1833,7 @@ fn (g mut Gen) return_statement(node ast.Return) { } if !is_none && !is_error { styp := g.typ(g.fn_decl.return_type)[7..] // remove 'Option_' - g.write('opt_ok(& ($styp []) { ') + g.write('/*:)$return_sym.name*/opt_ok(&($styp []) { ') g.expr(node.exprs[0]) g.writeln(' }, sizeof($styp));') return @@ -2268,12 +2270,17 @@ fn (g mut Gen) string_inter_literal(node ast.StringInterLiteral) { verror('only V strings can be formatted with a ${sfmt} format') } g.write('%' + sfmt[1..]) - } else if node.expr_types[i] in [table.string_type, table.bool_type] || sym.kind == .enum_ { + } else if node.expr_types[i] in [table.string_type, table.bool_type] || sym.kind == + .enum_ { g.write('%.*s') } else { match node.exprs[i] { - ast.EnumVal { g.write('%.*s') } - else { g.write('%d') } + ast.EnumVal { + g.write('%.*s') + } + else { + g.write('%d') + } } } } @@ -2304,9 +2311,15 @@ fn (g mut Gen) string_inter_literal(node ast.StringInterLiteral) { sym := g.table.get_type_symbol(node.expr_types[i]) if sym.kind == .enum_ { is_var := match node.exprs[i] { - ast.SelectorExpr { true } - ast.Ident { true } - else { false } + ast.SelectorExpr { + true + } + ast.Ident { + true + } + else { + false + } } if is_var { styp := g.typ(node.expr_types[i]) @@ -2504,13 +2517,27 @@ fn (g mut Gen) fn_call(node ast.CallExpr) { } else if sym.kind == .enum_ { expr := node.args[0].expr is_var := match expr { - ast.SelectorExpr { true } - ast.Ident { true } - else { false } + ast.SelectorExpr { + true + } + ast.Ident { + true + } + else { + false + } } - g.write(if is_var { '${print_method}(${styp}_str(' } else { '${print_method}(tos3("' }) + g.write(if is_var { + '${print_method}(${styp}_str(' + } else { + '${print_method}(tos3("' + }) g.enum_expr(expr) - g.write(if is_var { '))' } else { '"))' }) + g.write(if is_var { + '))' + } else { + '"))' + }) } else { // `println(int_str(10))` // sym := g.table.get_type_symbol(node.args[0].typ) diff --git a/vlib/v/token/token.v b/vlib/v/token/token.v index e6435d34f1..a960c0c655 100644 --- a/vlib/v/token/token.v +++ b/vlib/v/token/token.v @@ -299,8 +299,8 @@ pub enum Precedence { assign // = eq // == or != // less_greater // > or < - sum // + or - - product // * or / + sum // + - | ^ + product // * / << >> & // mod // % prefix // -X or !X postfix // ++ or --