]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
support instance delegate fields, fixes bug 519231
authorJuerg Billeter <j@bitron.ch>
Thu, 28 Feb 2008 21:56:33 +0000 (21:56 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Thu, 28 Feb 2008 21:56:33 +0000 (21:56 +0000)
2008-02-28  Juerg Billeter  <j@bitron.ch>

* gobject/valaccodeassignmentbinding.vala,
  gobject/valaccodegenerator.vala: support instance delegate fields,
  fixes bug 519231

svn path=/trunk/; revision=1063

ChangeLog
gobject/valaccodeassignmentbinding.vala
gobject/valaccodegenerator.vala

index 6b3805fb85760fcea557690fcc2524d72b0ad14b..84136c31b5f3817d0d4e6227bbd741c301f9db5c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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
index a65a7099097b4da1d3373ba793693edabe37a2b2..95531969a9b87570e5796dea9ce7cb94b155ced9 100644 (file)
@@ -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));
index 60aa7f9f8bbfa19126fa38de69248a43fe9624bf..071c3f945dc940d9cfaa327be944b6e3c48f78e4 100644 (file)
@@ -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) {