[vala] GAsync: Support returning structs from async methods
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] GAsync: Support returning structs from async methods
- Date: Wed, 16 Jun 2010 18:37:27 +0000 (UTC)
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]