]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GAsync: Support returning structs from async methods
authorLuca Bruno <lethalman88@gmail.com>
Tue, 8 Jun 2010 15:16:58 +0000 (17:16 +0200)
committerJürg Billeter <j@bitron.ch>
Wed, 16 Jun 2010 18:29:57 +0000 (20:29 +0200)
Fixes bug 620740.

codegen/valagasyncmodule.vala
tests/Makefile.am
tests/asynchronous/bug620740.vala [new file with mode: 0644]

index ab3fb0d750a8acfecc7fa13e9d5aa5e8481f7bd5..50687457161e3f640390adb7e10b2eac6d7d6d22 100644 (file)
@@ -395,7 +395,7 @@ public class Vala.GAsyncModule : GSignalModule {
                var finishblock = new CCodeBlock ();
 
                var return_type = m.return_type;
-               if (!(return_type is VoidType)) {
+               if (!(return_type is VoidType) && !return_type.is_real_non_null_struct_type ()) {
                        var cdecl = new CCodeDeclaration (m.return_type.get_cname ());
                        cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
                        finishblock.add_statement (cdecl);
@@ -437,7 +437,14 @@ public class Vala.GAsyncModule : GSignalModule {
                        }
                }
 
-               if (!(return_type is VoidType)) {
+               if (return_type.is_real_non_null_struct_type ()) {
+                       // structs are returned via out parameter
+                       CCodeExpression cexpr = new CCodeMemberAccess.pointer (data_var, "result");
+                       if (requires_copy (return_type)) {
+                               cexpr = get_ref_cexpression (return_type, cexpr, null, return_type);
+                       }
+                       finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result")), cexpr)));
+               } else if (!(return_type is VoidType)) {
                        finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("result"), new CCodeMemberAccess.pointer (data_var, "result"))));
                        if (return_type is ArrayType) {
                                var array_type = (ArrayType) return_type;
@@ -453,6 +460,11 @@ public class Vala.GAsyncModule : GSignalModule {
                        finishblock.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result")));
                }
 
+               var cfrag = new CCodeFragment ();
+               append_temp_decl (cfrag, temp_vars);
+               temp_vars.clear ();
+               finishblock.add_statement (cfrag);
+
                cparam_map.set (get_param_pos (0.1), new CCodeFormalParameter ("_res_", "GAsyncResult*"));
 
                generate_cparameters (m, source_declarations, cparam_map, finishfunc, null, null, null, 2);
index 1ed895026fd69192b1c9b463646785a6f5c096d3..31616581a4347d05f4134e699e17fc75f9ca5dfc 100644 (file)
@@ -81,6 +81,7 @@ TESTS = \
        asynchronous/bug600827.vala \
        asynchronous/bug601558.vala \
        asynchronous/bug613484.vala \
+       asynchronous/bug620740.vala \
        dbus/basic-types.test \
        dbus/arrays.test \
        dbus/structs.test \
diff --git a/tests/asynchronous/bug620740.vala b/tests/asynchronous/bug620740.vala
new file mode 100644 (file)
index 0000000..b4323fb
--- /dev/null
@@ -0,0 +1,10 @@
+struct Foo {
+        int i;
+}
+
+async Foo do_foo_async () {
+       return Foo ();
+}
+
+void main () {
+}