[vala] GAsync: Support returning structs from async methods



commit 8561348583612d86c30fbc46220f12521b95751e
Author: Luca Bruno <lethalman88 gmail com>
Date:   Tue Jun 8 17:16:58 2010 +0200

    GAsync: Support returning structs from async methods
    
    Fixes bug 620740.

 codegen/valagasyncmodule.vala     |   16 ++++++++++++++--
 tests/Makefile.am                 |    1 +
 tests/asynchronous/bug620740.vala |   10 ++++++++++
 3 files changed, 25 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index ab3fb0d..5068745 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -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);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 1ed8950..3161658 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 0000000..b4323fb
--- /dev/null
+++ b/tests/asynchronous/bug620740.vala
@@ -0,0 +1,10 @@
+struct Foo {
+        int i;
+}
+
+async Foo do_foo_async () {
+	return Foo ();
+}
+
+void main () {
+}



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