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
|
index += 2
|
||||||
meta += probe_inc
|
meta += probe_inc
|
||||||
}
|
}
|
||||||
out := malloc(m.value_bytes)
|
return zero
|
||||||
C.memcpy(out, zero, m.value_bytes)
|
|
||||||
return out
|
|
||||||
//return voidptr(0)
|
//return voidptr(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,14 @@
|
||||||
// that can be found in the LICENSE file.
|
// that can be found in the LICENSE file.
|
||||||
module ast
|
module ast
|
||||||
|
|
||||||
|
import v.table
|
||||||
|
|
||||||
pub struct Scope {
|
pub struct Scope {
|
||||||
mut:
|
mut:
|
||||||
parent &Scope
|
parent &Scope
|
||||||
children []&Scope
|
children []&Scope
|
||||||
start_pos int
|
start_pos int
|
||||||
end_pos int
|
end_pos int
|
||||||
// vars map[string]table.Var
|
|
||||||
vars map[string]Var
|
vars map[string]Var
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +74,18 @@ pub fn (s mut Scope) override_var(var Var) {
|
||||||
s.vars[var.name] = 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 {
|
pub fn (s &Scope) outermost() &Scope {
|
||||||
mut sc := s
|
mut sc := s
|
||||||
for !isnil(sc.parent) {
|
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'] {
|
if name in ['filter', 'map'] {
|
||||||
array_info := typ_sym.info as table.Array
|
array_info := typ_sym.info as table.Array
|
||||||
mut scope := c.file.scope.innermost(method_call_expr.pos.pos)
|
mut scope := c.file.scope.innermost(method_call_expr.pos.pos)
|
||||||
scope.override_var(ast.Var{
|
scope.update_var_type('it', array_info.elem_type)
|
||||||
name: 'it'
|
|
||||||
typ: array_info.elem_type
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
for i, arg in method_call_expr.args {
|
for i, arg in method_call_expr.args {
|
||||||
c.expr(arg.expr)
|
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
|
assign_stmt.right_types << val_type
|
||||||
scope.override_var(ast.Var{
|
scope.update_var_type(ident.name, mr_info.types[i])
|
||||||
name: ident.name
|
|
||||||
typ: mr_info.types[i]
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// `a := 1` | `a,b := 1,2`
|
// `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_var_info.typ = val_type
|
||||||
ident.info = ident_var_info
|
ident.info = ident_var_info
|
||||||
assign_stmt.left[i] = ident
|
assign_stmt.left[i] = ident
|
||||||
scope.override_var(ast.Var{
|
scope.update_var_type(ident.name, val_type)
|
||||||
name: ident.name
|
|
||||||
typ: val_type
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.expected_type = table.void_type
|
c.expected_type = table.void_type
|
||||||
|
@ -619,10 +610,7 @@ fn (c mut Checker) stmt(node ast.Stmt) {
|
||||||
table.int_type}
|
table.int_type}
|
||||||
}
|
}
|
||||||
it.key_type = key_type
|
it.key_type = key_type
|
||||||
scope.override_var(ast.Var{
|
scope.update_var_type(it.key_var, key_type)
|
||||||
name: it.key_var
|
|
||||||
typ: key_type
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
value_type := c.table.value_type(typ)
|
value_type := c.table.value_type(typ)
|
||||||
if value_type == table.void_type {
|
if value_type == table.void_type {
|
||||||
|
@ -632,10 +620,7 @@ fn (c mut Checker) stmt(node ast.Stmt) {
|
||||||
it.cond_type = typ
|
it.cond_type = typ
|
||||||
it.kind = sym.kind
|
it.kind = sym.kind
|
||||||
it.val_type = value_type
|
it.val_type = value_type
|
||||||
scope.override_var(ast.Var{
|
scope.update_var_type(it.val_var, value_type)
|
||||||
name: it.val_var
|
|
||||||
typ: value_type
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
c.stmts(it.stmts)
|
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
|
// set var type on first use
|
||||||
if typ == 0 {
|
if typ == 0 {
|
||||||
typ = c.expr(var.expr)
|
typ = c.expr(var.expr)
|
||||||
var.typ = typ
|
var_scope.update_var_type(var.name, typ)
|
||||||
var_scope.override_var(var)
|
|
||||||
}
|
}
|
||||||
// update ident
|
// update ident
|
||||||
ident.kind = .variable
|
ident.kind = .variable
|
||||||
|
|
Loading…
Reference in New Issue