]> 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 12:58:13 +0000 (14:58 +0200)
gobject/valaccodeassignmentmodule.vala
gobject/valaccodebasemodule.vala
vala/valafield.vala

index eb2a1fd168ece840f6f1418858418d250bb7844d..eef4f9aed94efce59f9fdba8a204e74a2ed15732 100644 (file)
@@ -117,7 +117,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 e143b04e94b9354cfa65ce06795f414d8f8b85a6..23af71493ed3b6e0ec58a6d2049eb5d6cdb559ef 100644 (file)
@@ -3016,7 +3016,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 f43e83bd4fb0c378329de00311a0795711ad0956..c754a33c679dcc26d693b83d400024f1789d353d 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");
+               }
        }
        
        /**