From 1338e7fce21fe705a61977b49f8e43b9d737249a Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Jul 2020 13:56:50 +0200 Subject: [PATCH] autofree: free in each scope --- vlib/v/gen/cgen.v | 36 +++++++++++++++++++----------------- vlib/v/gen/fn.v | 8 ++++---- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 352342d8cc..39f30b5601 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -622,6 +622,10 @@ fn (mut g Gen) stmts(stmts []ast.Stmt) { g.write('') g.write(')') } + if g.pref.autofree && stmts.len > 0 { + // g.writeln('// autofree scope') + g.autofree_scope_vars(stmts[stmts.len - 1].position().pos) + } } fn (mut g Gen) stmt(node ast.Stmt) { @@ -1511,9 +1515,9 @@ fn (mut g Gen) gen_clone_assignment(val ast.Expr, right_sym table.TypeSymbol, ad return true } -fn (mut g Gen) autofree_scope_vars(pos int) string { +fn (mut g Gen) autofree_scope_vars(pos int) { + g.writeln('// autofree_scope_vars($pos)') // eprintln('> free_scope_vars($pos)') - mut freeing_code := '' scope := g.file.scope.innermost(pos) for _, obj in scope.objects { match obj { @@ -1528,27 +1532,27 @@ fn (mut g Gen) autofree_scope_vars(pos int) string { // TODO: free optionals continue } - freeing_code += g.autofree_variable(v) + g.autofree_variable(v) } else {} } } - return freeing_code } -fn (g &Gen) autofree_variable(v ast.Var) string { +fn (g &Gen) autofree_variable(v ast.Var) { sym := g.table.get_type_symbol(v.typ) // if v.name.contains('output2') { // eprintln(' > var name: ${v.name:-20s} | is_arg: ${v.is_arg.str():6} | var type: ${int(v.typ):8} | type_name: ${sym.name:-33s}') // } if sym.kind == .array { - return g.autofree_var_call('array_free', v) + g.autofree_var_call('array_free', v) + return } if sym.kind == .string { // Don't free simple string literals. match v.expr { ast.StringLiteral { - return '// str literal\n' + g.writeln('// str literal') } else { // NOTE/TODO: assign_stmt multi returns variables have no expr @@ -1565,23 +1569,23 @@ fn (g &Gen) autofree_variable(v ast.Var) string { */ } } - return g.autofree_var_call('string_free', v) + g.autofree_var_call('string_free', v) + return } if sym.has_method('free') { - return g.autofree_var_call(c_name(sym.name) + '_free', v) + g.autofree_var_call(c_name(sym.name) + '_free', v) } - return '' } -fn (g &Gen) autofree_var_call(free_fn_name string, v ast.Var) string { +fn (g &Gen) autofree_var_call(free_fn_name string, v ast.Var) { if v.is_arg { // fn args should not be autofreed - return '' + return } if v.typ.is_ptr() { - return '\t${free_fn_name}($v.name); // autofreed ptr var\n' + g.writeln('\t${free_fn_name}($v.name); // autofreed ptr var') } else { - return '\t${free_fn_name}(&$v.name); // autofreed var\n' + g.writeln('\t${free_fn_name}(&$v.name); // autofreed var') } } @@ -3907,13 +3911,11 @@ fn (g Gen) type_default(typ table.Type) string { 'rune' { return '0' } else {} } - - return match sym.kind { + return match sym.kind { .sum_type { '{0}' } .array_fixed { '{0}' } else { '0' } } - // TODO this results in // error: expected a field designator, such as '.field = 4' // - Empty ee= (Empty) { . = {0} } ; diff --git a/vlib/v/gen/fn.v b/vlib/v/gen/fn.v index 93e4a04a03..021969ec8a 100644 --- a/vlib/v/gen/fn.v +++ b/vlib/v/gen/fn.v @@ -140,10 +140,10 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl) { g.write_defer_stmts_when_needed() } // ///////// - if g.autofree { - // TODO: remove this, when g.write_autofree_stmts_when_needed works properly - g.writeln(g.autofree_scope_vars(it.body_pos.pos)) - } + // if g.autofree { + // TODO: remove this, when g.write_autofree_stmts_when_needed works properly + // g.autofree_scope_vars(it.body_pos.pos) + // } g.writeln('}') g.defer_stmts = [] if g.pref.printfn_list.len > 0 && g.last_fn_c_name in g.pref.printfn_list {