From 47a62b12d4f73befab255a29f81a6ff5020c5ebe Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 24 Sep 2020 19:22:16 +0200 Subject: [PATCH] autofree: advanced expr test --- vlib/v/gen/cgen.v | 2 +- vlib/v/gen/fn.v | 2 +- vlib/v/tests/valgrind/1.strings_and_arrays.v | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 6e5086b27d..b0665b8537 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -729,7 +729,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { defer { // If we have temporary string exprs to free after this statement, do it. e.g.: // `foo('a' + 'b')` => `tmp := 'a' + 'b'; foo(tmp); string_free(&tmp);` - if g.pref.autofree && !g.inside_or_block { + if g.pref.autofree { // && !g.inside_or_block { // TODO remove the inside_or_block hack. strings are not freed in or{} atm if g.strs_to_free.len != 0 { g.writeln('// strs_to_free:') diff --git a/vlib/v/gen/fn.v b/vlib/v/gen/fn.v index aab1a0f09c..8b947bb8a2 100644 --- a/vlib/v/gen/fn.v +++ b/vlib/v/gen/fn.v @@ -615,7 +615,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { } fn (mut g Gen) generate_tmp_autofree_arg_vars(node ast.CallExpr, name string) { - // Create a temporary var for each argument in order to free it (only if it's a complex expression, + // Create a temporary var before fn call for each argument in order to free it (only if it's a complex expression, // like `foo(get_string())` or `foo(a + b)` mut free_tmp_arg_vars := g.autofree && g.pref.experimental && !g.is_builtin_mod && node.args.len > 0 && !node.args[0].typ.has_flag(.optional) // TODO copy pasta checker.v diff --git a/vlib/v/tests/valgrind/1.strings_and_arrays.v b/vlib/v/tests/valgrind/1.strings_and_arrays.v index 1376b6b04e..9f7cc02b25 100644 --- a/vlib/v/tests/valgrind/1.strings_and_arrays.v +++ b/vlib/v/tests/valgrind/1.strings_and_arrays.v @@ -1,5 +1,6 @@ import os +// import time fn return_array(array_arg []string) []int { // array argument must not be freed s := [1, 2, 3] // escaping array must not be freed return s @@ -22,12 +23,20 @@ fn handle_strings(s, p string) int { fn handle_int(n int) { } +fn add_strings(a, b string) string { + return a + b +} + fn str_tmp_expr() { println('a' + 'b') // tmp expression result must be freed handle_strings('c' + 'd', 'e' + 'f') // multiple tmp expressions must be freed handle_int(handle_strings('x' + 'y', 'f')) // exprs 2 levels deep must bee freed } +fn str_tmp_expr_advanced() { + // handle_strings('c' + 'd', add_strings('e' + 'f', 'g')) // both lvl 1 and lvl2 exprs must be freed +} + struct Foo { a int b string @@ -68,6 +77,7 @@ fn opt(s string) ?int { return 1 } +/* fn optional_str() { q := 'select' s := 'query: select' @@ -85,15 +95,20 @@ fn optional_str() { } println(pos + 1) } +*/ +fn tt() { + // time.parse_rfc2822('1234') +} fn main() { println('start') foo() str_tmp_expr() + str_tmp_expr_advanced() str_inter() match_expr() reassign_str() - optional_str() + // optional_str() // str_replace() println('end') }