]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support [CCode (delegate_target = false)] attribute for fields
authorJürg Billeter <j@bitron.ch>
Thu, 2 Apr 2009 12:58:13 +0000 (14:58 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 2 Apr 2009 13:07:05 +0000 (15:07 +0200)
gobject/valaccodeassignmentmodule.vala
gobject/valaccodebasemodule.vala
vala/valafield.vala

index 332bb4f034d7003a9ae1eeb93ba1f06d64191604..35d8d68d605fc59fd11e5f2a1a54210156955d2f 100644 (file)
@@ -105,7 +105,12 @@ internal class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                        array = (array_field == null || !array_field.no_array_length);
                } else if (assignment.left.value_type is DelegateType) {
                        var delegate_type = (DelegateType) assignment.left.value_type;
-                       instance_delegate = delegate_type.delegate_symbol.has_target;
+                       if (delegate_type.delegate_symbol.has_target) {
+                               var delegate_field = assignment.left.symbol_reference as Field;
+                               if (delegate_field == null || !delegate_field.no_delegate_target) {
+                                       instance_delegate = true;
+                               }
+                       }
                }
 
                if (unref_old || array || instance_delegate) {
index 9bfa75c75fc121d0ecdd9f281cf353008d118ffe..5b8b4d46d3ba8bb0d57ea9aa092703773ba3be36 100644 (file)
@@ -3013,7 +3013,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                                        var rhs_array_len = head.get_array_length_cexpression (init.initializer, dim);
                                                        ccomma.append_expression (new CCodeAssignment (lhs, rhs_array_len));
                                                }
-                                       } else if (f.field_type is DelegateType) {
+                                       } else if (f.field_type is DelegateType && !f.no_delegate_target) {
                                                if (expr.type_reference.data_type is Struct) {
                                                        lhs = new CCodeMemberAccess (typed_inst, get_delegate_target_cname (f.get_cname ()));
                                                } else {
index 24ac796e73be7abf2dae52af3c81e62aeb951fa8..0338d26a51c26ac38e4b97cd9a79a2dc916cf2b6 100644 (file)
@@ -69,6 +69,12 @@ public class Vala.Field : Member, Lockable {
         */
        public bool no_array_length { get; set; }
 
+       /**
+        * Specifies whether a delegate target field should implicitly be created
+        * if the field type is a delegate.
+        */
+       public bool no_delegate_target { get; set; }
+
        /**
         * Specifies whether the array is null terminated.
         */
@@ -224,6 +230,9 @@ public class Vala.Field : Member, Lockable {
                if (a.has_argument ("array_length_cexpr")) {
                        set_array_length_cexpr (a.get_string ("array_length_cexpr"));
                }
+               if (a.has_argument ("delegate_target")) {
+                       no_delegate_target = !a.get_bool ("delegate_target");
+               }
        }
        
        /**