]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Handle the integers and enums in generic closure wrapper
authorMaciej Piechotka <uzytkownik2@gmail.com>
Fri, 23 Aug 2013 16:24:18 +0000 (18:24 +0200)
committerMaciej Piechotka <uzytkownik2@gmail.com>
Sun, 15 Dec 2013 13:16:36 +0000 (14:16 +0100)
Handle edge-case when the one of generic parameters of delegate is an
integer in closure or method.

codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
tests/Makefile.am
tests/delegates/bug659778.vala [new file with mode: 0644]

index 090fce368ae9b76002bf6f7e858137d0dfc555e7..3af2c2d8c8be863b6094286d545b915344146d56 100644 (file)
@@ -3092,6 +3092,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                        unref_function = "g_free";
                                                }
                                        }
+                               } else if (type is EnumValueType) {
+                                       unref_function = null;
                                } else {
                                        var st = (Struct) type.data_type;
                                        if (!get_ccode_has_destroy_function (st)) {
index cf367a52e476c704d7b70afa72865694c930ec65..744f63a1d04e63d04158fd87217fc8064e5e9283 100644 (file)
@@ -290,6 +290,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                        CCodeExpression arg;
                        if (d.has_target) {
                                arg = new CCodeIdentifier ("self");
+                               if (!m.closure && m.this_parameter != null) {
+                                       arg = convert_from_generic_pointer (arg, m.this_parameter.variable_type);
+                               }
                        } else {
                                // use first delegate parameter as instance
                                if (d_params.size == 0 || m.closure) {
@@ -316,6 +319,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
 
                        CCodeExpression arg;
                        arg = new CCodeIdentifier (get_variable_cname (d_params.get (i).name));
+                       if (d_params.get (i).variable_type is GenericType) {
+                               arg = convert_from_generic_pointer (arg, param.variable_type);
+                       }
                        carg_map.set (get_param_pos (get_ccode_pos (param)), arg);
 
                        // handle array arguments
@@ -405,7 +411,11 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                if (m.return_type is VoidType || m.return_type.is_real_non_null_struct_type ()) {
                        ccode.add_expression (ccall);
                } else {
-                       ccode.add_declaration (return_type_cname, new CCodeVariableDeclarator ("result", ccall));
+                       CCodeExpression result = ccall;
+                       if (d.return_type is GenericType) {
+                               result = convert_to_generic_pointer (result, m.return_type);
+                       }
+                       ccode.add_declaration (return_type_cname, new CCodeVariableDeclarator ("result", result));
                }
 
                if (d.has_target /* TODO: && dt.value_owned */ && dt.is_called_once) {
index de7e82323623f543dfbc9f46703a579befeed34c..f7dca48076488f4a2cc7069a3223d24864bd5b46 100644 (file)
@@ -100,6 +100,7 @@ TESTS = \
        delegates/bug595639.vala \
        delegates/bug638415.vala \
        delegates/bug639751.vala \
+       delegates/bug659778.vala \
        delegates/bug703804.vala \
        objects/chainup.vala \
        objects/classes.vala \
diff --git a/tests/delegates/bug659778.vala b/tests/delegates/bug659778.vala
new file mode 100644 (file)
index 0000000..3e60386
--- /dev/null
@@ -0,0 +1,28 @@
+delegate G DoSomething<G>(G g);
+
+void do_something<G> (DoSomething<G> f) {}
+
+enum TE {
+       T
+}
+
+class Test {
+       public void f() {
+               do_something<TE> (g);
+               do_something<int> (h);
+       }
+       [CCode (instance_pos = -1)]
+       private TE g(TE i) {
+               return i;
+       }
+       [CCode (instance_pos = -1)]
+       private int h(int i) {
+               return i;
+       }
+}
+
+int main() {
+       Test t2 = new Test ();
+       t2.f ();
+       return 0;
+}