summaryrefslogtreecommitdiff
path: root/codegen/valaccodememberaccessmodule.vala
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2011-05-08 08:32:14 +0200
committerLuca Bruno <lucabru@src.gnome.org>2011-05-08 08:55:03 +0200
commitf7402d1d0a0ee82b2fc0eba043dcaeab7275e464 (patch)
tree74e168251f23456843e9247548a46644695bb508 /codegen/valaccodememberaccessmodule.vala
parent4935646d325911198e1fbf1c4f0734be03341cc8 (diff)
downloadvala-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.vala12
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