+2008-02-28 Jürg Billeter <j@bitron.ch>
+
+ * gobject/valaccodeassignmentbinding.vala,
+ gobject/valaccodegenerator.vala: support instance delegate fields,
+ fixes bug 519231
+
2008-02-28 Jürg Billeter <j@bitron.ch>
* doc/vala/default.css: set background-color
bool unref_old = (assignment.left.static_type.takes_ownership);
bool array = false;
+ bool instance_delegate = false;
if (assignment.left.static_type is ArrayType) {
array = !(codegen.get_array_length_cexpression (assignment.left, 1) is CCodeConstant);
+ } else if (assignment.left.static_type is DelegateType) {
+ var delegate_type = (DelegateType) assignment.left.static_type;
+ instance_delegate = delegate_type.delegate_symbol.instance;
}
- if (unref_old || array) {
+ if (unref_old || array || instance_delegate) {
var ccomma = new CCodeCommaExpression ();
var temp_decl = codegen.get_temp_variable_declarator (assignment.left.static_type);
var rhs_array_len = codegen.get_array_length_cexpression (assignment.right, dim);
ccomma.append_expression (new CCodeAssignment (lhs_array_len, rhs_array_len));
}
+ } else if (instance_delegate) {
+ var delegate_type = (DelegateType) assignment.left.static_type;
+ var lhs_delegate_target = codegen.get_delegate_target_cexpression (assignment.left);
+ var rhs_delegate_target = codegen.get_delegate_target_cexpression (assignment.right);
+ ccomma.append_expression (new CCodeAssignment (lhs_delegate_target, rhs_delegate_target));
}
ccomma.append_expression (new CCodeIdentifier (temp_decl.name));
st.add_field (len_type.get_cname (), get_array_length_cname (f.name, dim));
}
+ } else if (f.type_reference is DelegateType) {
+ var delegate_type = (DelegateType) f.type_reference;
+ if (delegate_type.delegate_symbol.instance) {
+ // create field to store delegate target
+ st.add_field ("gpointer", get_delegate_target_cname (f.name));
+ }
}
if (f.initializer != null) {
source_type_member_declaration.append (cdecl);
}
}
+ } else if (f.type_reference is DelegateType) {
+ var delegate_type = (DelegateType) f.type_reference;
+ if (delegate_type.delegate_symbol.instance) {
+ // create field to store delegate target
+ var cdecl = new CCodeDeclaration ("gpointer");
+ cdecl.add_declarator (new CCodeVariableDeclarator (get_delegate_target_cname (f.get_cname ())));
+ if (f.access != SymbolAccessibility.PRIVATE) {
+ cdecl.modifiers = CCodeModifiers.EXTERN;
+ header_type_member_declaration.append (cdecl);
+ } else {
+ cdecl.modifiers = CCodeModifiers.STATIC;
+ source_type_member_declaration.append (cdecl);
+ }
+ }
}
if (f.initializer != null) {