]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Use generics for g_object_*_{,q}data bindings
authorJürg Billeter <j@bitron.ch>
Sat, 20 Mar 2010 21:39:34 +0000 (22:39 +0100)
committerJürg Billeter <j@bitron.ch>
Sat, 20 Mar 2010 21:39:34 +0000 (22:39 +0100)
Fixes bug 531043.

codegen/valaccodemethodcallmodule.vala
vala/valamethod.vala
vapi/gobject-2.0.vapi

index c03e4f669c9ff796fd0e15f1b3857d824579bc13..267bf5c543ff30ef5d5766f39d686a644c713aa2 100644 (file)
@@ -152,7 +152,7 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        }
                } else if (m is CreationMethod && m.parent_symbol is Struct) {
                        ccall.add_argument (new CCodeIdentifier ("self"));
-               } else if (m != null && m.get_type_parameters ().size > 0 && !m.has_generic_type_parameter) {
+               } else if (m != null && m.get_type_parameters ().size > 0 && !m.has_generic_type_parameter && !m.simple_generics) {
                        // generic method
                        add_generic_type_arguments (in_arg_map, ma.get_type_arguments (), expr);
                }
@@ -370,6 +370,17 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                CCodeExpression delegate_target_destroy_notify;
                                                carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), get_delegate_target_cexpression (arg, out delegate_target_destroy_notify));
                                                multiple_cargs = true;
+                                       } else if (param.parameter_type is GenericType) {
+                                               if (m != null && m.simple_generics) {
+                                                       var generic_type = (GenericType) param.parameter_type;
+                                                       int type_param_index = m.get_type_parameter_index (generic_type.type_parameter.name);
+                                                       var type_arg = ma.get_type_arguments ().get (type_param_index);
+                                                       if (requires_copy (type_arg)) {
+                                                               carg_map.set (get_param_pos (param.cparameter_position + 0.1), get_destroy_func_expression (type_arg));
+                                                       } else {
+                                                               carg_map.set (get_param_pos (param.cparameter_position + 0.1), new CCodeConstant ("NULL"));
+                                                       }
+                                               }
                                        }
 
                                        cexpr = handle_struct_argument (param, arg, cexpr);
index 795baf0c11abeddb6ede0423d33541af61d5b3c8..17775ab88179144d17d3d8dc92ad6af9574fe9f1 100644 (file)
@@ -221,6 +221,8 @@ public class Vala.Method : Member {
 
        public double generic_type_parameter_position { get; set; }
 
+       public bool simple_generics { get; set; }
+
        public weak Signal signal_reference { get; set; }
 
        public bool closure { get; set; }
@@ -460,6 +462,9 @@ public class Vala.Method : Member {
                        has_generic_type_parameter = true;
                        generic_type_parameter_position = a.get_double ("generic_type_pos");
                }
+               if (a.has_argument ("simple_generics")) {
+                       simple_generics = a.get_bool ("simple_generics");
+               }
                if (a.has_argument ("returns_floating_reference")) {
                        returns_floating_reference = a.get_bool ("returns_floating_reference");
                }
index d8f0bc87882cf9a58f078765433c072ec3127b8d..ec9378a6ef779ef24ca2941d981dab2b46c51c66 100644 (file)
@@ -313,14 +313,20 @@ namespace GLib {
                public void set (string first_property_name, ...);
                public void get_property (string property_name, ref Value value);
                public void set_property (string property_name, Value value);
-               public void* get_data (string key);
-               public void set_data (string key, void* data);
+               [CCode (simple_generics = true)]
+               public unowned T get_data<T> (string key);
+               [CCode (cname = "g_object_set_data_full", simple_generics = true)]
+               public void set_data<T> (string key, owned T data);
                public void set_data_full (string key, void* data, DestroyNotify? destroy);
-               public void* steal_data (string key);
-               public void* get_qdata (Quark quark);
-               public void set_qdata (Quark quark, void* data);
+               [CCode (simple_generics = true)]
+               public T steal_data<T> (string key);
+               [CCode (simple_generics = true)]
+               public unowned T get_qdata<T> (Quark quark);
+               [CCode (cname = "g_object_set_qdata_full", simple_generics = true)]
+               public void set_qdata<T> (Quark quark, owned T data);
                public void set_qdata_full (Quark quark, void* data, DestroyNotify? destroy);
-               public void* steal_qdata (Quark quark);
+               [CCode (simple_generics = true)]
+               public T steal_qdata<T> (Quark quark);
                public void freeze_notify ();
                public void thaw_notify ();
                [CCode (cname = "g_object_run_dispose")]