for (int dim = 1; dim <= array_type.rank; dim++) {
function.add_parameter (new CCodeFormalParameter (head.get_array_length_cname (acc.readable ? "result" : "value", dim), length_ctype));
}
+ } else if ((acc.value_type is DelegateType) && ((DelegateType) acc.value_type).delegate_symbol.has_target) {
+ function.add_parameter (new CCodeFormalParameter (get_delegate_target_cname (acc.readable ? "result" : "value"), acc.readable ? "gpointer*" : "gpointer"));
}
if (prop.is_private_symbol () || (!acc.readable && !acc.writable) || acc.access == SymbolAccessibility.PRIVATE) {
for (int dim = 1; dim <= array_type.rank; dim++) {
function.add_parameter (new CCodeFormalParameter (head.get_array_length_cname (acc.readable ? "result" : "value", dim), length_ctype));
}
+ } else if ((acc.value_type is DelegateType) && ((DelegateType) acc.value_type).delegate_symbol.has_target) {
+ function.add_parameter (new CCodeFormalParameter (get_delegate_target_cname (acc.readable ? "result" : "value"), acc.readable ? "gpointer*" : "gpointer"));
}
if (prop.is_private_symbol () || !(acc.readable || acc.writable) || acc.access == SymbolAccessibility.PRIVATE) {
for (int dim = 1; dim <= array_type.rank; dim++) {
function.add_parameter (new CCodeFormalParameter (head.get_array_length_cname (acc.readable ? "result" : "value", dim), length_ctype));
}
+ } else if ((acc.value_type is DelegateType) && ((DelegateType) acc.value_type).delegate_symbol.has_target) {
+ function.add_parameter (new CCodeFormalParameter (get_delegate_target_cname (acc.readable ? "result" : "value"), acc.readable ? "gpointer*" : "gpointer"));
}
if (!is_virtual) {
stmt.return_expression.ccodenode = ccomma;
stmt.return_expression.temp_vars.add (return_expr_decl);
+ } else if ((current_method != null || current_property_accessor != null) && current_return_type is DelegateType) {
+ var delegate_type = (DelegateType) current_return_type;
+ if (delegate_type.delegate_symbol.has_target) {
+ var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt);
+
+ var ccomma = new CCodeCommaExpression ();
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
+
+ var len_l = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_delegate_target_cname ("result")));
+ var len_r = get_delegate_target_cexpression (stmt.return_expression);
+ ccomma.append_expression (new CCodeAssignment (len_l, len_r));
+
+ ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
+
+ stmt.return_expression.ccodenode = ccomma;
+ stmt.return_expression.temp_vars.add (return_expr_decl);
+ }
}
var cfrag = new CCodeFragment ();
for (int dim = 1; dim <= array_type.rank; dim++) {
ccall.add_argument (head.get_array_length_cexpression (rhs, dim));
}
+ } else if (prop.property_type is DelegateType && rhs != null) {
+ var delegate_type = (DelegateType) prop.property_type;
+ if (delegate_type.delegate_symbol.has_target) {
+ ccall.add_argument (get_delegate_target_cexpression (rhs));
+ }
}
if (prop.no_accessor_method) {
if (prop.get_accessor.automatic_body &&
current_type_symbol == prop.parent_symbol &&
prop.base_property == null &&
- prop.base_interface_property == null) {
+ prop.base_interface_property == null &&
+ !(prop.property_type is ArrayType || prop.property_type is DelegateType)) {
CCodeExpression inst;
inst = new CCodeMemberAccess.pointer (pub_inst, "priv");
expr.ccodenode = new CCodeMemberAccess.pointer (inst, prop.field.get_cname());
ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
expr.append_array_size (ctemp);
}
+ } else {
+ var delegate_type = base_property.property_type as DelegateType;
+ if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+ var temp_var = get_temp_variable (new PointerType (new VoidType ()));
+ var ctemp = new CCodeIdentifier (temp_var.name);
+ temp_vars.add (temp_var);
+ ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
+ expr.delegate_target = ctemp;
+ }
}
expr.ccodenode = ccall;