diff options
author | Luca Bruno <lucabru@src.gnome.org> | 2011-05-08 08:32:14 +0200 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2011-05-08 08:55:03 +0200 |
commit | f7402d1d0a0ee82b2fc0eba043dcaeab7275e464 (patch) | |
tree | 74e168251f23456843e9247548a46644695bb508 /codegen/valaccodememberaccessmodule.vala | |
parent | 4935646d325911198e1fbf1c4f0734be03341cc8 (diff) | |
download | vala-f7402d1d0a0ee82b2fc0eba043dcaeab7275e464.tar.gz |
codegen: Unowned delegates can't become owned when captured or in coroutine
From a semantic view point it's neither possible to transfer ownership
to an unowned delegate nor destroy its target.
Diffstat (limited to 'codegen/valaccodememberaccessmodule.vala')
-rw-r--r-- | codegen/valaccodememberaccessmodule.vala | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index fb8ed3529..a6ab4d6aa 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -398,13 +398,15 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { if (param.has_array_length_cexpr) { result.array_length_cexpr = new CCodeConstant (param.get_array_length_cexpr ()); } - if (param.captured || is_in_coroutine ()) { - result.value_type.value_owned = true; - } var array_type = result.value_type as ArrayType; var delegate_type = result.value_type as DelegateType; + bool is_unowned_delegate = delegate_type != null && !param.variable_type.value_owned; + if ((param.captured || is_in_coroutine ()) && !is_unowned_delegate) { + result.value_type.value_owned = true; + } + if (param.name == "this") { if (is_in_coroutine ()) { // use closure @@ -433,7 +435,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 (param.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 (param.name))); + if (result.value_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 (param.name))); + } } } else if (is_in_coroutine ()) { // use closure |