From: Rico Tzschichholz Date: Sat, 6 Jan 2018 08:53:48 +0000 (+0100) Subject: codegen: Add destroy out-param when invoking delegate returned by delegate X-Git-Tag: 0.34.14~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8b50a925ee2191bfca505960ba2437bd6512c19;p=thirdparty%2Fvala.git codegen: Add destroy out-param when invoking delegate returned by delegate https://bugzilla.gnome.org/show_bug.cgi?id=792077 --- diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 376e82aac..3c3b73223 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -588,6 +588,17 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule { out_arg_map.set (get_param_pos (get_ccode_delegate_target_pos (deleg)), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref)); set_delegate_target (expr, temp_ref); + + if (deleg_type.is_disposable ()) { + temp_var = get_temp_variable (gdestroynotify_type); + temp_ref = get_variable_cexpression (temp_var.name); + + emit_temp_var (temp_var); + + out_arg_map.set (get_param_pos (get_ccode_delegate_target_pos (deleg) + 0.01), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref)); + + set_delegate_target_destroy_notify (expr, temp_ref); + } } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 270ba369f..0391a45dc 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -145,6 +145,7 @@ TESTS = \ delegates/bug659778.vala \ delegates/bug683925.vala \ delegates/bug703804.vala \ + delegates/bug792077.vala \ objects/chainup.vala \ objects/classes.vala \ objects/constructors.vala \ diff --git a/tests/delegates/bug792077.vala b/tests/delegates/bug792077.vala new file mode 100644 index 000000000..4c29822b2 --- /dev/null +++ b/tests/delegates/bug792077.vala @@ -0,0 +1,16 @@ +delegate void FooFunc (int i); +delegate FooFunc BarFunc (); + +int result = 0; + +void main () { + BarFunc func_gen = () => { + return (data) => { + result = data; + }; + }; + + FooFunc func = func_gen (); + func (42); + assert (result == 42); +}