map/scope/checker: update just var type & ret zero in map.get3
parent
9fb218d379
commit
718819eb7a
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue