]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix memory management of closures in async methods
authorJürg Billeter <j@bitron.ch>
Mon, 21 Sep 2009 18:02:05 +0000 (20:02 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 21 Sep 2009 18:02:05 +0000 (20:02 +0200)
codegen/valaccodebasemodule.vala

index 1a711817fbdfc7bbad3918f83a20d7f8a9015040..5fa12f0de8abe11f0fcc0df9b18659e268062d23 100644 (file)
@@ -1675,10 +1675,20 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                        }
 
                                        if (requires_destroy (local.variable_type)) {
+                                               bool old_coroutine = false;
+                                               if (current_method != null) {
+                                                       old_coroutine = current_method.coroutine;
+                                                       current_method.coroutine = false;
+                                               }
+
                                                var ma = new MemberAccess.simple (local.name);
                                                ma.symbol_reference = local;
                                                ma.value_type = local.variable_type.copy ();
                                                free_block.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), get_variable_cname (local.name)), local.variable_type, ma)));
+
+                                               if (old_coroutine) {
+                                                       current_method.coroutine = true;
+                                               }
                                        }
                                }
                        }
@@ -1756,10 +1766,20 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                                }
 
                                                if (requires_destroy (param_type) && !is_unowned_delegate) {
+                                                       bool old_coroutine = false;
+                                                       if (current_method != null) {
+                                                               old_coroutine = current_method.coroutine;
+                                                               current_method.coroutine = false;
+                                                       }
+
                                                        var ma = new MemberAccess.simple (param.name);
                                                        ma.symbol_reference = param;
                                                        ma.value_type = param_type.copy ();
                                                        free_block.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), get_variable_cname (param.name)), param.parameter_type, ma)));
+
+                                                       if (old_coroutine) {
+                                                               current_method.coroutine = true;
+                                                       }
                                                }
                                        }
                                }