]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Support gobject-style chainup to base class that has generics
authorLuca Bruno <lucabru@src.gnome.org>
Sat, 16 Jul 2011 07:02:38 +0000 (09:02 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Sat, 16 Jul 2011 07:02:38 +0000 (09:02 +0200)
Fixes bug 654702.

codegen/valaccodebasemodule.vala
codegen/valaccodemethodcallmodule.vala
tests/Makefile.am
tests/objects/bug654702.vala [new file with mode: 0644]

index d9b3800a512f86aaeafa930eda3389e6e58aeab3..e553fbcb302a79d0f657e6d7a631d7c01b82c5e9 100644 (file)
@@ -4024,10 +4024,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        public virtual void generate_error_domain_declaration (ErrorDomain edomain, CCodeFile decl_space) {
        }
 
-       public void add_generic_type_arguments (Map<int,CCodeExpression> arg_map, List<DataType> type_args, CodeNode expr, bool is_chainup = false) {
+       public void add_generic_type_arguments (Map<int,CCodeExpression> arg_map, List<DataType> type_args, CodeNode expr, bool is_chainup = false, List<TypeParameter>? type_parameters = null) {
                int type_param_index = 0;
                foreach (var type_arg in type_args) {
-                       arg_map.set (get_param_pos (0.1 * type_param_index + 0.01), get_type_id_expression (type_arg, is_chainup));
+                       if (type_parameters != null) {
+                               var type_param_name = type_parameters.get (type_param_index).name.down ();
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.01), new CCodeConstant ("\"%s_type\"".printf (type_param_name)));
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), new CCodeConstant ("\"%s_dup_func\"".printf (type_param_name)));
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.05), new CCodeConstant ("\"%s_destroy_func\"".printf (type_param_name)));
+                       }
+
+                       arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), get_type_id_expression (type_arg, is_chainup));
                        if (requires_copy (type_arg)) {
                                var dup_func = get_dup_func_expression (type_arg, type_arg.source_reference, is_chainup);
                                if (dup_func == null) {
@@ -4035,11 +4042,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        expr.error = true;
                                        return;
                                }
-                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), new CCodeCastExpression (dup_func, "GBoxedCopyFunc"));
-                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), get_destroy_func_expression (type_arg, is_chainup));
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.04), new CCodeCastExpression (dup_func, "GBoxedCopyFunc"));
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.06), get_destroy_func_expression (type_arg, is_chainup));
                        } else {
-                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), new CCodeConstant ("NULL"));
-                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), new CCodeConstant ("NULL"));
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.04), new CCodeConstant ("NULL"));
+                               arg_map.set (get_param_pos (0.1 * type_param_index + 0.06), new CCodeConstant ("NULL"));
                        }
                        type_param_index++;
                }
index 2d615b72375ac8204d0bc863969be72af0d15eb5..ce536bba80c6947b028dd829af3aa3bacd76e413 100644 (file)
@@ -133,7 +133,12 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                        // chain up to base class
                                        foreach (DataType base_type in current_class.get_base_types ()) {
                                                if (base_type.data_type is Class) {
-                                                       add_generic_type_arguments (in_arg_map, base_type.get_type_arguments (), expr, true);
+                                                       List<TypeParameter> type_parameters = null;
+                                                       if (m.get_real_cname () == "g_object_new") {
+                                                               // gobject-style chainup
+                                                               type_parameters = ((Class) base_type.data_type).get_type_parameters ();
+                                                       }
+                                                       add_generic_type_arguments (in_arg_map, base_type.get_type_arguments (), expr, true, type_parameters);
                                                        break;
                                                }
                                        }
index f77549bf43494756f31fc7ab81aaf77101fdfa86..9f750c5c1cf4fe42873f8a07ec0a36a1555446ae 100644 (file)
@@ -102,6 +102,7 @@ TESTS = \
        objects/bug642809.vala \
        objects/bug643711.vala \
        objects/bug653138.vala \
+       objects/bug654702.vala \
        errors/errors.vala \
        errors/bug567181.vala \
        errors/bug579101.vala \
diff --git a/tests/objects/bug654702.vala b/tests/objects/bug654702.vala
new file mode 100644 (file)
index 0000000..3b98cf7
--- /dev/null
@@ -0,0 +1,12 @@
+class Foo<T> : Object {
+}
+
+class Bar : Foo<string> {
+       public Bar () {
+               Object ();
+       }
+}
+
+void main () {
+       new Bar ();
+}