}
return get_delegate_target (delegate_expr);
} else if (delegate_expr.symbol_reference != null) {
- if (delegate_expr.symbol_reference is FormalParameter) {
+ if (delegate_expr.symbol_reference is FormalParameter || delegate_expr.symbol_reference is LocalVariable) {
if (get_delegate_target_destroy_notify (delegate_expr) != null) {
delegate_target_destroy_notify = get_delegate_target_destroy_notify (delegate_expr);
}
} else {
return target_expr;
}
- } else if (delegate_expr.symbol_reference is LocalVariable) {
- var local = (LocalVariable) delegate_expr.symbol_reference;
- if (local.captured) {
- // captured variables are stored on the heap
- var block = (Block) local.parent_symbol;
- delegate_target_destroy_notify = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
- return new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (local.name)));
- } else if (current_method != null && current_method.coroutine) {
- delegate_target_destroy_notify = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
- return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (local.name)));
- } else {
- var target_expr = new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (local.name)));
- if (expr_owned) {
- delegate_target_destroy_notify = new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
- }
- if (is_out) {
- if (expr_owned) {
- delegate_target_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, delegate_target_destroy_notify);
- }
- return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
- } else {
- return target_expr;
- }
- }
} else if (delegate_expr.symbol_reference is Field) {
var field = (Field) delegate_expr.symbol_reference;
string target_cname = get_delegate_target_cname (field.get_cname ());
for (int dim = 1; dim <= array_type.rank; dim++) {
append_array_size (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim)));
}
+ } else if (local.variable_type is DelegateType) {
+ set_delegate_target (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (local.name))));
+ set_delegate_target_destroy_notify (expr, 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 {
set_cvalue (expr, get_variable_cexpression (local.name));
for (int dim = 1; dim <= array_type.rank; dim++) {
append_array_size (expr, get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim)));
}
+ } else if (local.variable_type is DelegateType) {
+ if (current_method != null && current_method.coroutine) {
+ set_delegate_target (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (local.name))));
+ set_delegate_target_destroy_notify (expr, new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name))));
+ } else {
+ set_delegate_target (expr, new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (local.name))));
+ if (expr.value_type.value_owned) {
+ set_delegate_target_destroy_notify (expr, new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (local.name))));
+ }
+ }
}
if (expr.parent_node is ReturnStatement &&