From: Jürg Billeter Date: Wed, 28 Oct 2009 14:09:59 +0000 (+0100) Subject: Fix delegates returning structs X-Git-Tag: 0.7.8~16 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5d6be97be7aa4a37a84b7adb617daec41f00cdea;p=thirdparty%2Fvala.git Fix delegates returning structs Fixes bug 595610. --- diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala index e98255043..d8cad9d70 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 7fc64f44b..012da5576 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 000000000..2882a64b8 --- /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 (); +}