]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix delegates returning structs
authorJürg Billeter <j@bitron.ch>
Wed, 28 Oct 2009 14:09:59 +0000 (15:09 +0100)
committerJürg Billeter <j@bitron.ch>
Wed, 28 Oct 2009 14:09:59 +0000 (15:09 +0100)
Fixes bug 595610.

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

index e982550432e32101c6b739b176188929dc2c964e..d8cad9d7050209689c0b7938956fbcdf16741786 100644 (file)
@@ -38,6 +38,11 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
 
                string return_type_cname = d.return_type.get_cname ();
 
+               if (d.return_type.is_real_non_null_struct_type ()) {
+                       // structs are returned via out parameter
+                       return_type_cname = "void";
+               }
+
                if (return_type_cname == d.get_cname ()) {
                        // recursive delegate
                        return_type_cname = "GCallback";
@@ -91,6 +96,9 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                var cparam = new CCodeFormalParameter (get_delegate_target_cname ("result"), "void**");
                                cfundecl.add_parameter (cparam);
                        }
+               } else if (d.return_type.is_real_non_null_struct_type ()) {
+                       var cparam = new CCodeFormalParameter ("result", "%s*".printf (d.return_type.get_cname ()));
+                       cfundecl.add_parameter (cparam);
                }
                if (d.has_target) {
                        var cparam = new CCodeFormalParameter ("user_data", "void*");
@@ -350,7 +358,14 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
 
                // declaration
 
-               var function = new CCodeFunction (wrapper_name, m.return_type.get_cname ());
+               string return_type_cname = d.return_type.get_cname ();
+
+               if (d.return_type.is_real_non_null_struct_type ()) {
+                       // structs are returned via out parameter
+                       return_type_cname = "void";
+               }
+
+               var function = new CCodeFunction (wrapper_name, return_type_cname);
                function.modifiers = CCodeModifiers.STATIC;
                m.ccodenode = function;
 
@@ -394,6 +409,9 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                var cparam = new CCodeFormalParameter (get_delegate_target_cname ("result"), "void**");
                                cparam_map.set (get_param_pos (d.cdelegate_target_parameter_position), cparam);
                        }
+               } else if (d.return_type.is_real_non_null_struct_type ()) {
+                       var cparam = new CCodeFormalParameter ("result", "%s*".printf (d.return_type.get_cname ()));
+                       cparam_map.set (get_param_pos (-3), cparam);
                }
 
                if (m.get_error_types ().size > 0) {
@@ -497,6 +515,8 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                var ctarget = new CCodeIdentifier (get_delegate_target_cname ("result"));
                                carg_map.set (get_param_pos (m.cdelegate_target_parameter_position), ctarget);
                        }
+               } else if (m.return_type.is_real_non_null_struct_type ()) {
+                       carg_map.set (get_param_pos (-3), new CCodeIdentifier ("result"));
                }
 
                if (m.get_error_types ().size > 0) {
@@ -522,7 +542,7 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                }
 
                var block = new CCodeBlock ();
-               if (m.return_type is VoidType) {
+               if (m.return_type is VoidType || m.return_type.is_real_non_null_struct_type ()) {
                        block.add_statement (new CCodeExpressionStatement (ccall));
                } else {
                        block.add_statement (new CCodeReturnStatement (ccall));
index 7fc64f44b09400e4a8212d3e301434f56d31e6a8..012da55766f3e041d4e0431ac3dacd56257f1fb7 100644 (file)
@@ -42,6 +42,7 @@ TESTS = \
        structs/bug583603.vala \
        structs/bug595587.vala \
        delegates/delegates.vala \
+       delegates/bug595610.vala \
        delegates/bug595639.vala \
        objects/classes.vala \
        objects/fields.vala \
diff --git a/tests/delegates/bug595610.vala b/tests/delegates/bug595610.vala
new file mode 100644 (file)
index 0000000..2882a64
--- /dev/null
@@ -0,0 +1,14 @@
+struct Foo {
+       int bar;
+}
+
+delegate Foo Func ();
+
+Foo do_foo () {
+       return Foo ();
+}
+
+void main () {
+       Func func = do_foo;
+       func ();
+}