[vala] Fix delegates returning structs



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]