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.set_current_fn( p.cur_fn ) // give access too all variables in current function
pp.parse(.main)
pp.v.add_parser(pp)
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
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.
p.cgen.fns << 'string ${typ.name}_str();'
}

View File

@ -65,7 +65,6 @@ mut:
out_name_c string // name of the temporary C file
files []string // all V files that need to be parsed and compiled
dir string // directory (or file) being compiled (TODO rename to path?)
rdir string // abs dir
table &Table // table with types, vars, functions etc
cgen &CGen // C code generator
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) {
for p in v.parsers {
if p.id == parser.id {
return
}
}
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)')
for i, p in v.parsers {
if os.realpath(p.file_path) == os.realpath(file) {
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)
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
v.vgen_buf.free()
vgen_parser.parse(.main)
// v.parsers.add(vgen_parser)
v.log('Done parsing.')
// Write everything
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)
p.parse(.imports)
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
v.add_parser(p)
}
// Parse user imports
for file in v.get_user_files() {
mut p := v.new_parser_from_file(file)
p.parse(.imports)
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
v.add_parser(p)
}
// Parse lib imports
v.parse_lib_imports()
@ -632,7 +634,7 @@ fn (v &V) get_builtin_files() []string {
// get user files
fn (v &V) get_user_files() []string {
mut dir := v.rdir
mut dir := v.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
// 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
for file in vfiles {
if file in done_imports { continue }
v.parse(file, .imports)
pid := v.parse(file, .imports)
done_imports << file
// if p.import_table.module_name != mod {
// verror('bad module name: $file was imported as `$mod` but it is defined as module `$p.import_table.module_name`')
// }
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
p_mod := v.parsers[pid].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`')
}
}
}
done_fits << fit.file_path
@ -909,7 +911,6 @@ fn new_v(args[]string) &V {
return &V{
os: _os
out_name: out_name
rdir: rdir
dir: dir
lang_dir: vroot
table: new_table(obfuscate)

View File

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