From 718819eb7a3719b5749240c3f6476ed99be7e55e Mon Sep 17 00:00:00 2001 From: joe-conigliaro Date: Sun, 29 Mar 2020 00:00:28 +1100 Subject: [PATCH] map/scope/checker: update just var type & ret zero in map.get3 --- vlib/builtin/map.v | 4 +--- vlib/v/ast/scope.v | 15 ++++++++++++++- vlib/v/checker/checker.v | 28 ++++++---------------------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/vlib/builtin/map.v b/vlib/builtin/map.v index 7f48547e43..2c49247c4d 100644 --- a/vlib/builtin/map.v +++ b/vlib/builtin/map.v @@ -358,9 +358,7 @@ fn (m map) get3(key string, zero voidptr) voidptr { index += 2 meta += probe_inc } - out := malloc(m.value_bytes) - C.memcpy(out, zero, m.value_bytes) - return out + return zero //return voidptr(0) } diff --git a/vlib/v/ast/scope.v b/vlib/v/ast/scope.v index 74da36abd9..329ee554f8 100644 --- a/vlib/v/ast/scope.v +++ b/vlib/v/ast/scope.v @@ -3,13 +3,14 @@ // that can be found in the LICENSE file. module ast +import v.table + pub struct Scope { mut: parent &Scope children []&Scope start_pos int end_pos int - // vars map[string]table.Var vars map[string]Var } @@ -73,6 +74,18 @@ pub fn (s mut Scope) override_var(var Var) { s.vars[var.name] = var } +pub fn (s mut Scope) update_var_type(name string, typ table.Type) { + mut x := s.vars[name] + // dont do an insert for no reason + if x.typ == typ { + return + } + x.typ = typ + s.vars[name] = x + // TODO + // s.vars[name].typ = typ +} + pub fn (s &Scope) outermost() &Scope { mut sc := s for !isnil(sc.parent) { diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index fb7e9fe4ae..be56d462e5 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -286,10 +286,7 @@ pub fn (c mut Checker) method_call_expr(method_call_expr mut ast.MethodCallExpr) if name in ['filter', 'map'] { array_info := typ_sym.info as table.Array mut scope := c.file.scope.innermost(method_call_expr.pos.pos) - scope.override_var(ast.Var{ - name: 'it' - typ: array_info.elem_type - }) + scope.update_var_type('it', array_info.elem_type) } for i, arg in method_call_expr.args { c.expr(arg.expr) @@ -451,10 +448,7 @@ pub fn (c mut Checker) assign_stmt(assign_stmt mut ast.AssignStmt) { } } assign_stmt.right_types << val_type - scope.override_var(ast.Var{ - name: ident.name - typ: mr_info.types[i] - }) + scope.update_var_type(ident.name, mr_info.types[i]) } } // `a := 1` | `a,b := 1,2` @@ -480,10 +474,7 @@ pub fn (c mut Checker) assign_stmt(assign_stmt mut ast.AssignStmt) { ident_var_info.typ = val_type ident.info = ident_var_info assign_stmt.left[i] = ident - scope.override_var(ast.Var{ - name: ident.name - typ: val_type - }) + scope.update_var_type(ident.name, val_type) } } c.expected_type = table.void_type @@ -619,10 +610,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { table.int_type} } it.key_type = key_type - scope.override_var(ast.Var{ - name: it.key_var - typ: key_type - }) + scope.update_var_type(it.key_var, key_type) } value_type := c.table.value_type(typ) if value_type == table.void_type { @@ -632,10 +620,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { it.cond_type = typ it.kind = sym.kind it.val_type = value_type - scope.override_var(ast.Var{ - name: it.val_var - typ: value_type - }) + scope.update_var_type(it.val_var, value_type) } c.stmts(it.stmts) } @@ -838,8 +823,7 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type { // set var type on first use if typ == 0 { typ = c.expr(var.expr) - var.typ = typ - var_scope.override_var(var) + var_scope.update_var_type(var.name, typ) } // update ident ident.kind = .variable