From 0250e7d1fc5cf3d8cef99d69999a60e1da409480 Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Thu, 28 Feb 2008 21:56:33 +0000 Subject: [PATCH] support instance delegate fields, fixes bug 519231 2008-02-28 Juerg Billeter * gobject/valaccodeassignmentbinding.vala, gobject/valaccodegenerator.vala: support instance delegate fields, fixes bug 519231 svn path=/trunk/; revision=1063 --- ChangeLog | 6 ++++++ gobject/valaccodeassignmentbinding.vala | 11 ++++++++++- gobject/valaccodegenerator.vala | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 6b3805f..84136c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-02-28 Jürg Billeter + * gobject/valaccodeassignmentbinding.vala, + gobject/valaccodegenerator.vala: support instance delegate fields, + fixes bug 519231 + +2008-02-28 Jürg Billeter + * doc/vala/default.css: set background-color 2008-02-28 Jürg Billeter diff --git a/gobject/valaccodeassignmentbinding.vala b/gobject/valaccodeassignmentbinding.vala index a65a709..9553196 100644 --- a/gobject/valaccodeassignmentbinding.vala +++ b/gobject/valaccodeassignmentbinding.vala @@ -452,11 +452,15 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding { 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); @@ -474,6 +478,11 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding { 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)); diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 60aa7f9..071c3f9 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -475,6 +475,12 @@ public class Vala.CCodeGenerator : CodeGenerator { 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) { @@ -521,6 +527,20 @@ public class Vala.CCodeGenerator : CodeGenerator { 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) { -- 2.7.4