parser: small optimizations

pull/1889/head
Alexander Medvednikov 2019-08-26 00:08:06 +03:00
parent 794cd561cd
commit 76a89c832e
3 changed files with 15 additions and 10 deletions

View File

@ -511,7 +511,8 @@ fn (p mut Parser) struct_decl() {
if !is_c && !p.builtin_mod && p.mod != 'main' { if !is_c && !p.builtin_mod && p.mod != 'main' {
name = p.prepend_mod(name) 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') p.error('`$name` redeclared')
} }
if !is_c { if !is_c {
@ -519,7 +520,6 @@ fn (p mut Parser) struct_decl() {
p.gen_typedef('typedef $kind $name $name;') p.gen_typedef('typedef $kind $name $name;')
} }
// Register the type // Register the type
mut typ := p.table.find_type(name)
mut is_ph := false mut is_ph := false
if typ.is_placeholder { if typ.is_placeholder {
// Update the placeholder // Update the placeholder
@ -1472,8 +1472,8 @@ fn (p mut Parser) name_expr() string {
} }
// ////////////////////////// // //////////////////////////
// module ? // module ?
// Allow shadowing (gg = gg.newcontext(); gg.draw_triangle()) // (Allow shadowing `gg = gg.newcontext(); gg.draw_triangle();` )
if ((name == p.mod && p.table.known_mod(name)) || p.import_table.known_alias(name)) 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 { && !p.cur_fn.known_var(name) && !is_c {
mut mod := name mut mod := name
// must be aliased module // must be aliased module

View File

@ -320,6 +320,10 @@ fn (table &Table) known_type(typ_ string) bool {
return t.name.len > 0 && !t.is_placeholder 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 { fn (t &Table) find_fn(name string) Fn {
f := t.fns[name] f := t.fns[name]
if !isnil(f.name.str) { if !isnil(f.name.str) {
@ -345,7 +349,7 @@ fn (t mut Table) register_type(typ string) {
} }
if typ in t.typesmap { if typ in t.typesmap {
return return
} }
t.typesmap[typ] = Type{name:typ} t.typesmap[typ] = Type{name:typ}
} }
@ -684,6 +688,7 @@ fn (t &Table) main_exists() bool {
// TODO use `?Var` // TODO use `?Var`
fn (t &Table) find_const(name string) Var { fn (t &Table) find_const(name string) Var {
//println('find const l=$t.consts.len')
for c in t.consts { for c in t.consts {
if c.name == name { if c.name == name {
return c return c

View File

@ -58,7 +58,7 @@ fn (m mut map) insert(n mut mapnode, key string, val voidptr) {
return return
} }
if n.key > key { if n.key > key {
if isnil(n.left) { if n.left == 0 {
n.left = new_node(key, val, m.element_size) n.left = new_node(key, val, m.element_size)
m.size++ m.size++
} else { } else {
@ -66,7 +66,7 @@ fn (m mut map) insert(n mut mapnode, key string, val voidptr) {
} }
return return
} }
if isnil(n.right) { if n.right == 0 {
n.right = new_node(key, val, m.element_size) n.right = new_node(key, val, m.element_size)
m.size++ m.size++
} else { } else {
@ -80,14 +80,14 @@ fn (n & mapnode) find(key string, out voidptr, element_size int) bool{
return true return true
} }
else if n.key > key { else if n.key > key {
if isnil(n.left) { if n.left == 0 {
return false return false
} else { } else {
return n.left.find(key, out, element_size) return n.left.find(key, out, element_size)
} }
} }
else { else {
if isnil(n.right) { if n.right == 0 {
return false return false
} else { } else {
return n.right.find(key, out, element_size) 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 { fn (m map) get(key string, out voidptr) bool {
if isnil(m.root) { if m.root == 0 {
return false return false
} }
return m.root.find(key, out, m.element_size) return m.root.find(key, out, m.element_size)