From a182b5c531b95911ccf620dd7943980947aa6d42 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2020 23:22:40 +0100 Subject: [PATCH] cgen: more errors fixed --- vlib/builtin/string.v | 6 +++--- vlib/v/checker/checker.v | 4 +++- vlib/v/gen/cgen.v | 42 ++++++++++++++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/vlib/builtin/string.v b/vlib/builtin/string.v index 4b8a1f4d48..0b86f97083 100644 --- a/vlib/builtin/string.v +++ b/vlib/builtin/string.v @@ -110,9 +110,9 @@ pub fn (a string) clone() string { str: malloc(a.len + 1) } for i in 0..a.len { - b[i] = a[i] + b.str[i] = a.str[i] } - b[a.len] = `\0` + b.str[a.len] = `\0` return b } @@ -280,7 +280,7 @@ val_idx:rep_i} } // Rep doesnt start here, just copy else { - b[b_i] = s[i] + b[b_i] = s.str[i] b_i++ } } diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 03fcd54efb..52a2bcbc9c 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -235,7 +235,7 @@ pub fn (c mut Checker) call_expr(call_expr mut ast.CallExpr) table.Type { } // println can print anything if fn_name == 'println' { - c.expr(call_expr.args[0]) + call_expr.arg_types = [c.expr(call_expr.args[0])] return f.return_type } mut arg_types := []table.Type @@ -286,6 +286,7 @@ pub fn (c mut Checker) method_call_expr(method_call_expr mut ast.MethodCallExpr) } // need to return `array_xxx` instead of `array` method_call_expr.return_type = typ + // method_call_expr.receiver_type = typ return typ } else if typ_sym.kind == .array && name in ['first', 'last'] { @@ -310,6 +311,7 @@ pub fn (c mut Checker) method_call_expr(method_call_expr mut ast.MethodCallExpr) } method_call_expr.receiver_type = method.args[0].typ method_call_expr.return_type = method.return_type + method_call_expr.arg_types = arg_types return method.return_type } c.error('type `$typ_sym.name` has no method `$name`', method_call_expr.pos) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index e12fa082f1..b1b6f65ae7 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -17,7 +17,7 @@ mut: fn_decl &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0 tmp_count int is_c_call bool // e.g. `C.printf("v")` - is_assign_expr bool + is_assign_expr bool // inside left part of assign expr (for array_set(), etc) is_array_set bool is_amp bool // for `&Foo{}` to merge PrefixExpr `&` and StructInit `Foo{}`; also for `&byte(0)` etc } @@ -466,12 +466,12 @@ fn (g mut Gen) expr(node ast.Expr) { if !g.is_array_set { g.write(' $it.op.str() ') } + g.is_assign_expr = false g.expr(it.val) if g.is_array_set { g.write(' })') g.is_array_set = false } - g.is_assign_expr = false } ast.Assoc { g.write('/* assoc */') @@ -487,8 +487,17 @@ fn (g mut Gen) expr(node ast.Expr) { name = name[3..] } g.write('${name}(') - g.call_args(it.args, it.muts, it.arg_types) - g.write(')') + if name == 'println' && it.arg_types[0] != table.string_type_idx { + // `println(int_str(10))` + sym := g.table.get_type_symbol(it.arg_types[0]) + g.write('${sym.name}_str(') + g.expr(it.args[0]) + g.write('))') + } + else { + g.call_args(it.args, it.muts, it.arg_types) + g.write(')') + } g.is_c_call = false } ast.CastExpr { @@ -672,9 +681,14 @@ fn (g mut Gen) expr(node ast.Expr) { // TODO: there are still due to unchecked exprs (opt/some fn arg) if it.expr_type != 0 { typ_sym := g.table.get_type_symbol(it.expr_type) + // rec_sym := g.table.get_type_symbol(it.receiver_type) receiver_name = typ_sym.name - if typ_sym.kind == .array && receiver_name.starts_with('array_') { - // array_byte_clone => array_clone + if typ_sym.kind == .array && it.name in + // TODO performance, detect `array` method differently + ['repeat', 'sort_with_compare', 'free', 'push_many', 'trim'] { + // && rec_sym.name == 'array' { + // && rec_sym.name == 'array' && receiver_name.starts_with('array') { + // `array_byte_clone` => `array_clone` receiver_name = 'array' } } @@ -693,6 +707,18 @@ fn (g mut Gen) expr(node ast.Expr) { if it.args.len > 0 { g.write(', ') } + // ///////// + /* + if name.contains('subkeys') { + println('call_args $name $it.arg_types.len') + for t in it.arg_types { + sym := g.table.get_type_symbol(t) + print('$sym.name ') + } + println('') + } + */ + // /////// g.call_args(it.args, it.muts, it.arg_types) g.write(')') } @@ -843,9 +869,9 @@ fn (g mut Gen) infix_expr(it ast.InfixExpr) { tmp := g.new_tmp_var() g.write('_PUSH(&') g.expr(it.left) - g.write(', ') + g.write(', (') g.expr(it.right) - g.write(', $tmp, $elem_type_str)') + g.write('), $tmp, $elem_type_str)') } else { // if it.op == .dot {