[vala] Fix delegates returning structs
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Fix delegates returning structs
- Date: Wed, 28 Oct 2009 14:10:58 +0000 (UTC)
commit 5d6be97be7aa4a37a84b7adb617daec41f00cdea
Author: Jürg Billeter <j bitron ch>
Date: Wed Oct 28 15:09:59 2009 +0100
Fix delegates returning structs
Fixes bug 595610.
codegen/valaccodedelegatemodule.vala | 24 ++++++++++++++++++++++--
tests/Makefile.am | 1 +
tests/delegates/bug595610.vala | 14 ++++++++++++++
3 files changed, 37 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala
index e982550..d8cad9d 100644
--- a/codegen/valaccodedelegatemodule.vala
+++ b/codegen/valaccodedelegatemodule.vala
@@ -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));
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7fc64f4..012da55 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 0000000..2882a64
--- /dev/null
+++ b/tests/delegates/bug595610.vala
@@ -0,0 +1,14 @@
+struct Foo {
+ int bar;
+}
+
+delegate Foo Func ();
+
+Foo do_foo () {
+ return Foo ();
+}
+
+void main () {
+ Func func = do_foo;
+ func ();
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]