From: Luca Bruno Date: Mon, 9 May 2011 20:27:22 +0000 (+0200) Subject: codegen: Fix regression when capturing an unowned delegate variable X-Git-Tag: 0.13.0~131 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cbbf206f783b3d41dc9402dc4e6cc36a07b383fe;p=thirdparty%2Fvala.git codegen: Fix regression when capturing an unowned delegate variable --- diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index a6ab4d6aa..38cb88de2 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -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; diff --git a/tests/asynchronous/closures.vala b/tests/asynchronous/closures.vala index 791010c92..3212481a9 100644 --- a/tests/asynchronous/closures.vala +++ b/tests/asynchronous/closures.vala @@ -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 ();