]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix regression when capturing an unowned delegate variable
authorLuca Bruno <lucabru@src.gnome.org>
Mon, 9 May 2011 20:27:22 +0000 (22:27 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 9 May 2011 20:38:43 +0000 (22:38 +0200)
codegen/valaccodememberaccessmodule.vala
tests/asynchronous/closures.vala

index a6ab4d6aa6aac727334ef3a230b7f1b89091e4fa..38cb88de2e2ef47574ae7fbd30796e043d8675f4 100644 (file)
@@ -364,7 +364,9 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                }
                        } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                result.delegate_target_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (local.name)));
-                               result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
+                               if (delegate_type.value_owned) {
+                                       result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
+                               }
                        }
                } else {
                        result.cvalue = get_variable_cexpression (local.name);
@@ -378,7 +380,9 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                if (is_in_coroutine ()) {
                                        result.delegate_target_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (local.name)));
-                                       result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
+                                       if (local.variable_type.value_owned) {
+                                               result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
+                                       }
                                } else {
                                        result.delegate_target_cvalue = new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (local.name)));
                                        if (local.variable_type.value_owned) {
@@ -444,7 +448,9 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                result.cvalue = get_variable_cexpression (param.name);
                                if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                        result.delegate_target_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (param.name)));
-                                       result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+                                       if (delegate_type.value_owned) {
+                                               result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+                                       }
                                }
                        } else {
                                var type_as_struct = result.value_type.data_type as Struct;
index 791010c924882df7361761460c79c2822dcc52a2..3212481a96bfc264e9e8bf506f5cbeb340cc97d5 100644 (file)
@@ -3,8 +3,10 @@ delegate void Func ();
 MainLoop main_loop;
 
 async void foo (string baz) {
+       unowned SourceFunc func = null;
        string bar = "hello";
        Func foobar = () => {
+               func = null;
                bar = baz;
        };
        foobar ();