compiler: remove unneeded field & manually add parser to v.parsers (#2232)

compiler: remove unneeded field & manually add parser to v.parsers (#2232)
pull/2233/head
joe-conigliaro 2019-10-05 16:52:50 +10:00 committed by GitHub
parent e14861694c
commit a62dec2053
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 22 deletions

View File

@ -124,6 +124,7 @@ fn (p mut Parser) comp_time() {
pp.is_vweb = true pp.is_vweb = true
pp.set_current_fn( p.cur_fn ) // give access too all variables in current function pp.set_current_fn( p.cur_fn ) // give access too all variables in current function
pp.parse(.main) pp.parse(.main)
pp.v.add_parser(pp)
tmpl_fn_body := p.cgen.lines.slice(pos + 2, p.cgen.lines.len).join('\n').clone() tmpl_fn_body := p.cgen.lines.slice(pos + 2, p.cgen.lines.len).join('\n').clone()
end_pos := tmpl_fn_body.last_index('Builder_str( sb )') + 19 // TODO end_pos := tmpl_fn_body.last_index('Builder_str( sb )') + 19 // TODO
p.cgen.lines = p.cgen.lines.left(pos) p.cgen.lines = p.cgen.lines.left(pos)
@ -287,7 +288,3 @@ fn (p mut Parser) gen_struct_str(typ Type) {
// This function will get parsee by V after the main pass. // This function will get parsee by V after the main pass.
p.cgen.fns << 'string ${typ.name}_str();' p.cgen.fns << 'string ${typ.name}_str();'
} }

View File

@ -65,7 +65,6 @@ mut:
out_name_c string // name of the temporary C file out_name_c string // name of the temporary C file
files []string // all V files that need to be parsed and compiled files []string // all V files that need to be parsed and compiled
dir string // directory (or file) being compiled (TODO rename to path?) dir string // directory (or file) being compiled (TODO rename to path?)
rdir string // abs dir
table &Table // table with types, vars, functions etc table &Table // table with types, vars, functions etc
cgen &CGen // C code generator cgen &CGen // C code generator
pref &Preferences // all the preferences and settings extracted to a struct for reusability pref &Preferences // all the preferences and settings extracted to a struct for reusability
@ -208,24 +207,24 @@ fn main() {
} }
fn (v mut V) add_parser(parser Parser) { fn (v mut V) add_parser(parser Parser) {
for p in v.parsers {
if p.id == parser.id {
return
}
}
v.parsers << parser v.parsers << parser
} }
fn (v mut V) parse(file string, pass Pass) { // find existing parser or create new one. returns v.parsers index
fn (v mut V) parse(file string, pass Pass) int {
//println('parse($file, $pass)') //println('parse($file, $pass)')
for i, p in v.parsers { for i, p in v.parsers {
if os.realpath(p.file_path) == os.realpath(file) { if os.realpath(p.file_path) == os.realpath(file) {
v.parsers[i].parse(pass) v.parsers[i].parse(pass)
return //if v.parsers[i].pref.autofree { v.parsers[i].scanner.text.free() free(v.parsers[i].scanner) }
return i
} }
} }
mut p := v.new_parser_from_file(file) mut p := v.new_parser_from_file(file)
p.parse(pass) p.parse(pass)
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
v.add_parser(p)
return v.parsers.len-1
} }
@ -342,6 +341,7 @@ fn (v mut V) compile() {
// free the string builder which held the generated methods // free the string builder which held the generated methods
v.vgen_buf.free() v.vgen_buf.free()
vgen_parser.parse(.main) vgen_parser.parse(.main)
// v.parsers.add(vgen_parser)
v.log('Done parsing.') v.log('Done parsing.')
// Write everything // Write everything
mut d := strings.new_builder(10000)// Avoid unnecessary allocations mut d := strings.new_builder(10000)// Avoid unnecessary allocations
@ -583,12 +583,14 @@ fn (v mut V) add_v_files_to_compile() {
mut p := v.new_parser_from_file(file) mut p := v.new_parser_from_file(file)
p.parse(.imports) p.parse(.imports)
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) } //if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
v.add_parser(p)
} }
// Parse user imports // Parse user imports
for file in v.get_user_files() { for file in v.get_user_files() {
mut p := v.new_parser_from_file(file) mut p := v.new_parser_from_file(file)
p.parse(.imports) p.parse(.imports)
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) } //if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
v.add_parser(p)
} }
// Parse lib imports // Parse lib imports
v.parse_lib_imports() v.parse_lib_imports()
@ -632,7 +634,7 @@ fn (v &V) get_builtin_files() []string {
// get user files // get user files
fn (v &V) get_user_files() []string { fn (v &V) get_user_files() []string {
mut dir := v.rdir mut dir := v.dir
v.log('get_v_files($dir)') v.log('get_v_files($dir)')
// Need to store user files separately, because they have to be added after libs, but we dont know // Need to store user files separately, because they have to be added after libs, but we dont know
// which libs need to be added yet // which libs need to be added yet
@ -685,12 +687,12 @@ fn (v mut V) parse_lib_imports() {
// Add all imports referenced by these libs // Add all imports referenced by these libs
for file in vfiles { for file in vfiles {
if file in done_imports { continue } if file in done_imports { continue }
v.parse(file, .imports) pid := v.parse(file, .imports)
done_imports << file done_imports << file
// if p.import_table.module_name != mod { p_mod := v.parsers[pid].import_table.module_name
// verror('bad module name: $file was imported as `$mod` but it is defined as module `$p.import_table.module_name`') if p_mod != mod {
// } verror('bad module name: $file was imported as `$mod` but it is defined as module `$p_mod`')
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) } }
} }
} }
done_fits << fit.file_path done_fits << fit.file_path
@ -909,7 +911,6 @@ fn new_v(args[]string) &V {
return &V{ return &V{
os: _os os: _os
out_name: out_name out_name: out_name
rdir: rdir
dir: dir dir: dir
lang_dir: vroot lang_dir: vroot
table: new_table(obfuscate) table: new_table(obfuscate)

View File

@ -99,7 +99,6 @@ const (
fn (v mut V) new_parser_from_string(text string, id string) Parser { fn (v mut V) new_parser_from_string(text string, id string) Parser {
mut p := v.new_parser(new_scanner(text), id) mut p := v.new_parser(new_scanner(text), id)
p.scan_tokens() p.scan_tokens()
v.add_parser(p)
return p return p
} }
@ -130,8 +129,6 @@ fn (v mut V) new_parser_from_file(path string) Parser {
v.cgen.file = path v.cgen.file = path
p.scan_tokens() p.scan_tokens()
//p.scanner.debug_tokens() //p.scanner.debug_tokens()
v.add_parser(p)
return p return p
} }