[vala/staging: 2/2] codegen: Wider support of [CCode(simple_generics = true)]



commit ad2c719015d6f1689e11b2166ca9aea27b98fa24
Author: Rico Tzschichholz <ricotz t-online de>
Date:   Wed Oct 5 17:22:00 2016 +0200

    codegen: Wider support of [CCode(simple_generics = true)]
    
    https://bugzilla.gnome.org/show_bug.cgi?id=772209

 codegen/valaccodemethodcallmodule.vala |    2 +-
 codegen/valaccodemethodmodule.vala     |    4 ++--
 tests/Makefile.am                      |    1 +
 tests/objects/simple_generics.vala     |   25 +++++++++++++++++++++++++
 4 files changed, 29 insertions(+), 3 deletions(-)
---
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index dce947f..d96b25b 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -315,7 +315,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                ccode.add_assignment (new CCodeMemberAccess.pointer (get_variable_cexpression 
("_data%d_".printf (get_block_id (current_method.body))), "self"), ref_call);
                        }
 
-                       if (!current_class.is_compact && current_class.get_type_parameters ().size > 0) {
+                       if (!current_class.is_compact && !get_ccode_simple_generics (m) && 
current_class.get_type_parameters ().size > 0) {
                                /* type, dup func, and destroy func fields for generic types */
                                var suffices = new string[] {"type", "dup_func", "destroy_func"};
                                foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index a6ce3a1..6f3f61c 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -46,7 +46,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                bool result = false;
 
                var cl = m.parent_symbol as Class;
-               if (m is CreationMethod && cl != null && !cl.is_compact) {
+               if (m is CreationMethod && cl != null && !cl.is_compact && !get_ccode_simple_generics (m)) {
                        result = true;
                }
 
@@ -1009,7 +1009,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                                }
                                type_param_index++;
                        }
-               } else if (!m.closure && (direction & 1) == 1) {
+               } else if (!m.closure && (direction & 1) == 1 && !get_ccode_simple_generics (m)) {
                        int type_param_index = 0;
                        foreach (var type_param in m.get_type_parameters ()) {
                                cparam_map.set (get_param_pos (0.1 * type_param_index + 0.01), new 
CCodeParameter ("%s_type".printf (type_param.name.down ()), "GType"));
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f7efca8..c15f245 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -150,6 +150,7 @@ TESTS = \
        objects/properties.vala \
        objects/regex.vala \
        objects/signals.vala \
+       objects/simple_generics.vala \
        objects/test-025.vala \
        objects/test-026.vala \
        objects/test-029.vala \
diff --git a/tests/objects/simple_generics.vala b/tests/objects/simple_generics.vala
new file mode 100644
index 0000000..e7bd5b8
--- /dev/null
+++ b/tests/objects/simple_generics.vala
@@ -0,0 +1,25 @@
+[CCode (cname = "g_hash_table_ref", simple_generics = true)]
+extern GLib.HashTable<K,V> g_hash_table_ref<K,V> (GLib.HashTable<K,V> ht);
+
+class Foo<G> : Object {
+       G g;
+
+       public Foo (G g) {
+               this.g = g;
+       }
+
+       public G get_g () {
+               return g;
+       }
+}
+
+[CCode (simple_generics = true)]
+G foo<G> (Foo<G> f) {
+       return f.get_g ();
+}
+
+void main () {
+       var f = new Foo<string> ("foo");
+       assert (foo<string> (f) == "foo");
+}
+


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]