From: Jürg Billeter Date: Tue, 29 Sep 2009 20:29:58 +0000 (+0200) Subject: Fix memory management when returning captured variables X-Git-Tag: 0.7.8~96 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d73283631d0487b8361978a96994fd4a147568b8;p=thirdparty%2Fvala.git Fix memory management when returning captured variables Fixes bug 596726. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 8a1ce3172..9f6cf10c6 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2922,7 +2922,9 @@ internal class Vala.CCodeBaseModule : CCodeModule { if (stmt.return_expression != null) { var local = stmt.return_expression.symbol_reference as LocalVariable; if (current_return_type.value_owned - && local != null && local.variable_type.value_owned && !variable_accessible_in_finally (local)) { + && local != null && local.variable_type.value_owned + && !local.captured + && !variable_accessible_in_finally (local)) { /* return expression is local variable taking ownership and * current method is transferring ownership */ @@ -2957,7 +2959,9 @@ internal class Vala.CCodeBaseModule : CCodeModule { // avoid unnecessary ref/unref pair var local = stmt.return_expression.symbol_reference as LocalVariable; if (current_return_type.value_owned - && local != null && local.variable_type.value_owned && !variable_accessible_in_finally (local)) { + && local != null && local.variable_type.value_owned + && !local.captured + && !variable_accessible_in_finally (local)) { /* return expression is local variable taking ownership and * current method is transferring ownership */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 821b4a259..907f13326 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -25,6 +25,7 @@ TESTS = \ methods/lambda.vala \ methods/closures.vala \ methods/bug595538.vala \ + methods/bug596726.vala \ control-flow/break.vala \ control-flow/expressions-conditional.vala \ control-flow/for.vala \ diff --git a/tests/methods/bug596726.vala b/tests/methods/bug596726.vala new file mode 100644 index 000000000..6eaec2606 --- /dev/null +++ b/tests/methods/bug596726.vala @@ -0,0 +1,16 @@ +void do_bar (Func f) { +} + +Object do_foo () { + var result = new Object (); + + do_bar (() => { + var v = result; + }); + + return result; +} + +void main () { + do_foo (); +}