From 066374bae4d192c3ef60cafd31bfaac46d4336cd Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Tue, 11 May 2021 19:29:06 +0300 Subject: [PATCH] v.gen.c: implement `-d trace_autofree` for conditional tracing comments about autofree --- vlib/v/gen/c/cgen.v | 27 ++++++++++++++++----------- vlib/v/gen/c/comptime.v | 2 +- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index c603778906..77ec1bd6fd 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -1034,8 +1034,8 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) { stmt := stmts[0] // stmt := stmts[stmts.len-1] if stmt !is ast.FnDecl && g.inside_ternary == 0 { - // g.writeln('// autofree scope') - // g.writeln('// autofree_scope_vars($stmt.pos.pos) | ${typeof(stmt)}') + // g.trace_autofree('// autofree scope') + // g.trace_autofree('// autofree_scope_vars($stmt.pos.pos) | ${typeof(stmt)}') // go back 1 position is important so we dont get the // internal scope of for loops and possibly other nodes // g.autofree_scope_vars(stmt.pos.pos - 1) @@ -1116,7 +1116,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { } else { // continue or break if g.is_autofree && !g.is_builtin_mod { - g.writeln('// free before continue/break') + g.trace_autofree('// free before continue/break') g.autofree_scope_vars_stop(node.pos.pos - 1, node.pos.line_nr, true, g.branch_parent_pos) } @@ -2719,11 +2719,16 @@ fn (mut g Gen) autofree_scope_vars_stop(pos int, line_nr int, free_parent_scopes // TODO why can scope.pos be 0? (only outside fns?) return } - g.writeln('// autofree_scope_vars(pos=$pos line_nr=$line_nr scope.pos=$scope.start_pos scope.end_pos=$scope.end_pos)') + g.trace_autofree('// autofree_scope_vars(pos=$pos line_nr=$line_nr scope.pos=$scope.start_pos scope.end_pos=$scope.end_pos)') g.autofree_scope_vars2(scope, scope.start_pos, scope.end_pos, line_nr, free_parent_scopes, stop_pos) } +[if trace_autofree] +fn (mut g Gen) trace_autofree(line string) { + g.writeln(line) +} + // fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, end_pos int) { fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int, line_nr int, free_parent_scopes bool, stop_pos int) { if isnil(scope) { @@ -2732,20 +2737,20 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int for _, obj in scope.objects { match obj { ast.Var { - g.writeln('// var "$obj.name" var.pos=$obj.pos.pos var.line_nr=$obj.pos.line_nr') + g.trace_autofree('// var "$obj.name" var.pos=$obj.pos.pos var.line_nr=$obj.pos.line_nr') if obj.name == g.returned_var_name { - g.writeln('// skipping returned var') + g.trace_autofree('// skipping returned var') continue } if obj.is_or { // Skip vars inited with the `or {}`, since they are generated // after the or block in C. - g.writeln('// skipping `or{}` var "$obj.name"') + g.trace_autofree('// skipping `or{}` var "$obj.name"') continue } if obj.is_tmp { // Skip for loop vars - g.writeln('// skipping tmp var "$obj.name"') + g.trace_autofree('// skipping tmp var "$obj.name"') continue } // if var.typ == 0 { @@ -2778,7 +2783,7 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int // if !isnil(scope.parent) && line_nr > 0 { if free_parent_scopes && !isnil(scope.parent) && (stop_pos == -1 || scope.parent.start_pos >= stop_pos) { - g.writeln('// af parent scope:') + g.trace_autofree('// af parent scope:') g.autofree_scope_vars2(scope.parent, start_pos, end_pos, line_nr, true, stop_pos) } } @@ -2801,7 +2806,7 @@ fn (mut g Gen) autofree_variable(v ast.Var) { // Don't free simple string literals. match v.expr { ast.StringLiteral { - g.writeln('// str literal') + g.trace_autofree('// str literal') } else { // NOTE/TODO: assign_stmt multi returns variables have no expr @@ -4771,7 +4776,7 @@ fn (mut g Gen) return_stmt(node ast.Return) { g.writeln('return ($styp){0};') } else { if g.is_autofree { - g.writeln('// free before return (no values returned)') + g.trace_autofree('// free before return (no values returned)') g.autofree_scope_vars(node.pos.pos - 1, node.pos.line_nr, true) } g.writeln('return;') diff --git a/vlib/v/gen/c/comptime.v b/vlib/v/gen/c/comptime.v index 1bc8c34d0a..461822661e 100644 --- a/vlib/v/gen/c/comptime.v +++ b/vlib/v/gen/c/comptime.v @@ -65,7 +65,7 @@ fn (mut g Gen) comptime_call(node ast.ComptimeCall) { } return } - g.writeln('// \$method call. sym="$node.sym.name"') + g.trace_autofree('// \$method call. sym="$node.sym.name"') if node.method_name == 'method' { // `app.$method()` m := node.sym.find_method(g.comp_for_method) or { return }