diff --git a/compiler/main.v b/compiler/main.v index c3b6bc6e13..536861842f 100644 --- a/compiler/main.v +++ b/compiler/main.v @@ -188,11 +188,16 @@ fn main() { // TODO remove if v.pref.autofree { println('started freeing v struct') - v.table.fns.free() v.table.typesmap.free() v.table.obf_ids.free() v.cgen.lines.free() free(v.cgen) + for _, f in v.table.fns { + f.local_vars.free() + f.args.free() + //f.defer_text.free() + } + v.table.fns.free() free(v.table) //for p in parsers { @@ -226,6 +231,8 @@ fn (v mut V) compile() { for file in v.files { mut p := v.new_parser(file) p.parse(.decl) + + } // Main pass cgen.pass = Pass.main diff --git a/compiler/parser.v b/compiler/parser.v index 05bc6e62b3..9a2e7531bc 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -17,8 +17,9 @@ struct Parser { file_pcguard string // When p.file_pcguard != '', it contains a // C ifdef guard clause that must be put before // the #include directives in the parsed .v file -mut: v &V + pref &Preferences // Preferences shared from V struct +mut: scanner &Scanner // tokens []Token // TODO cache all tokens, right now they have to be scanned twice token_idx int @@ -40,7 +41,6 @@ mut: expected_type string tmp_cnt int is_script bool - pref &Preferences // Preferences shared from V struct builtin_mod bool vh_lines []string inside_if_expr bool @@ -1078,7 +1078,7 @@ fn (p mut Parser) close_scope() { free_fn = 'v_array_free' } else if v.typ == 'string' { free_fn = 'v_string_free' - //continue + continue } else if v.ptr || v.typ.ends_with('*') { free_fn = 'v_ptr_free' //continue @@ -3562,7 +3562,7 @@ fn (p mut Parser) go_statement() { // Normal function else { f := p.table.find_fn(p.lit) or { panic('fn') } - if f.name == 'println' { + if f.name == 'println' || f.name == 'print' { p.error('`go` cannot be used with `println`') } p.async_fn_call(f, 0, '', '')