From: Luca Bruno Date: Tue, 8 Jun 2010 15:16:58 +0000 (+0200) Subject: GAsync: Support returning structs from async methods X-Git-Tag: 0.9.2~42 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8561348583612d86c30fbc46220f12521b95751e;p=thirdparty%2Fvala.git GAsync: Support returning structs from async methods Fixes bug 620740. --- diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala index ab3fb0d75..506874571 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 1ed895026..31616581a 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 000000000..b4323fb3a --- /dev/null +++ b/tests/asynchronous/bug620740.vala @@ -0,0 +1,10 @@ +struct Foo { + int i; +} + +async Foo do_foo_async () { + return Foo (); +} + +void main () { +}