]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support delegate properties
authorJürg Billeter <j@bitron.ch>
Tue, 28 Jul 2009 08:51:25 +0000 (10:51 +0200)
committerJürg Billeter <j@bitron.ch>
Tue, 28 Jul 2009 08:51:25 +0000 (10:51 +0200)
Based on patch by Julien Fontanet, fixes bug 543879.

codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valagobjectmodule.vala
vala/valaexpression.vala
vala/valamethodcall.vala

index 14b35f376d5f7165b8713caf83c676c294dcac90..c44b5ecff20edd659e14267a6ea9f8da2646679c 100644 (file)
@@ -1221,6 +1221,8 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        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) {
@@ -1303,6 +1305,8 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                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) {
@@ -1412,6 +1416,8 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                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) {
@@ -2482,6 +2488,23 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                
                                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 ();
@@ -3845,6 +3868,11 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        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) {
index 05e5c311cdb58e09e26b1cea328865d0b6919d5a..c45750a147059f8c221971a2a3eaab06cc4df15e 100644 (file)
@@ -210,6 +210,8 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                } else {
                                        return (CCodeExpression) get_ccodenode (ma.inner);
                                }
+                       } else if (delegate_expr.symbol_reference is Property) {
+                               return delegate_expr.delegate_target;
                        }
                }
 
index a225c80ef7f4a9be1eafaac7fc6fd08d41a6042f..a87871cfd49e8f57d055190e7e10b249b054cd3b 100644 (file)
@@ -223,7 +223,8 @@ internal class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        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());
@@ -267,6 +268,15 @@ internal class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                        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;
index 700d5c1d63d8e9409cbb0a50fbd56f09bcea79ca..ba0ad1f9bd93979267b3157819da6ed64883c755 100644 (file)
@@ -692,6 +692,11 @@ internal class Vala.GObjectModule : GTypeModule {
                        return false;
                }
 
+               var d = prop.property_type as DelegateType;
+               if (d != null && d.delegate_symbol.has_target) {
+                       return false;
+               }
+
                if (prop.base_interface_property != null) {
                        var iface = (Interface) prop.base_interface_property.parent_symbol;
                        if (!iface.is_subtype_of (gobject_type)) {
index 3e458f5b8791d479f6798b2d8c1fafa248ae98a2..431349972f950d5d35f7f1be13455e9451fe4bbf 100644 (file)
@@ -66,6 +66,8 @@ public abstract class Vala.Expression : CodeNode {
 
        private Gee.List<CCodeExpression> array_sizes = new ArrayList<CCodeExpression> ();
 
+       public CCodeExpression delegate_target { get; set; }
+
        /**
         * Returns whether this expression is constant, i.e. whether this
         * expression only consists of literals and other constants.
index e1fa0c73584240daf8c7792beda7833dd4f44521..ff9443bab25b417eb45594f58d1394042746bf5a 100644 (file)
@@ -38,8 +38,6 @@ public class Vala.MethodCall : Expression {
                }
        }
 
-       public CCodeExpression delegate_target { get; set; }
-
        public Expression _call;
        
        private Gee.List<Expression> argument_list = new ArrayList<Expression> ();