diff --git a/compiler/parser.v b/compiler/parser.v index c51b673784..d058519beb 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -511,7 +511,8 @@ fn (p mut Parser) struct_decl() { if !is_c && !p.builtin_mod && p.mod != 'main' { name = p.prepend_mod(name) } - if p.pass == .decl && p.table.known_type(name) { + mut typ := p.table.find_type(name) + if p.pass == .decl && p.table.known_type_fast(typ) { p.error('`$name` redeclared') } if !is_c { @@ -519,7 +520,6 @@ fn (p mut Parser) struct_decl() { p.gen_typedef('typedef $kind $name $name;') } // Register the type - mut typ := p.table.find_type(name) mut is_ph := false if typ.is_placeholder { // Update the placeholder @@ -1472,8 +1472,8 @@ fn (p mut Parser) name_expr() string { } // ////////////////////////// // module ? - // Allow shadowing (gg = gg.newcontext(); gg.draw_triangle()) - if ((name == p.mod && p.table.known_mod(name)) || p.import_table.known_alias(name)) + // (Allow shadowing `gg = gg.newcontext(); gg.draw_triangle();` ) + if p.peek() == .dot && ((name == p.mod && p.table.known_mod(name)) || p.import_table.known_alias(name)) && !p.cur_fn.known_var(name) && !is_c { mut mod := name // must be aliased module diff --git a/compiler/table.v b/compiler/table.v index 75b5832e46..527d35bba5 100644 --- a/compiler/table.v +++ b/compiler/table.v @@ -320,6 +320,10 @@ fn (table &Table) known_type(typ_ string) bool { return t.name.len > 0 && !t.is_placeholder } +fn (table &Table) known_type_fast(t &Type) bool { + return t.name.len > 0 && !t.is_placeholder +} + fn (t &Table) find_fn(name string) Fn { f := t.fns[name] if !isnil(f.name.str) { @@ -345,7 +349,7 @@ fn (t mut Table) register_type(typ string) { } if typ in t.typesmap { return - } + } t.typesmap[typ] = Type{name:typ} } @@ -684,6 +688,7 @@ fn (t &Table) main_exists() bool { // TODO use `?Var` fn (t &Table) find_const(name string) Var { + //println('find const l=$t.consts.len') for c in t.consts { if c.name == name { return c diff --git a/vlib/builtin/map.v b/vlib/builtin/map.v index 7b8f601b39..7f5f0c00c8 100644 --- a/vlib/builtin/map.v +++ b/vlib/builtin/map.v @@ -58,7 +58,7 @@ fn (m mut map) insert(n mut mapnode, key string, val voidptr) { return } if n.key > key { - if isnil(n.left) { + if n.left == 0 { n.left = new_node(key, val, m.element_size) m.size++ } else { @@ -66,7 +66,7 @@ fn (m mut map) insert(n mut mapnode, key string, val voidptr) { } return } - if isnil(n.right) { + if n.right == 0 { n.right = new_node(key, val, m.element_size) m.size++ } else { @@ -80,14 +80,14 @@ fn (n & mapnode) find(key string, out voidptr, element_size int) bool{ return true } else if n.key > key { - if isnil(n.left) { + if n.left == 0 { return false } else { return n.left.find(key, out, element_size) } } else { - if isnil(n.right) { + if n.right == 0 { return false } else { return n.right.find(key, out, element_size) @@ -178,7 +178,7 @@ pub fn (m mut map) keys() []string { } fn (m map) get(key string, out voidptr) bool { - if isnil(m.root) { + if m.root == 0 { return false } return m.root.find(key, out, m.element_size)