]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix memory management when returning captured variables
authorJürg Billeter <j@bitron.ch>
Tue, 29 Sep 2009 20:29:58 +0000 (22:29 +0200)
committerJürg Billeter <j@bitron.ch>
Tue, 29 Sep 2009 20:29:58 +0000 (22:29 +0200)
Fixes bug 596726.

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/methods/bug596726.vala [new file with mode: 0644]

index 8a1ce3172cc348e0cfb4a90344dc2d7bde0fe706..9f6cf10c664cb3688c587f7891f6b02c52459e56 100644 (file)
@@ -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 */
 
index 821b4a259810393c7769191078a41988672bc5c3..907f133267ac8bc322a2079f452e915eaa9e8884 100644 (file)
@@ -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 (file)
index 0000000..6eaec26
--- /dev/null
@@ -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 ();
+}