diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2018-01-06 09:53:48 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2018-01-16 18:26:00 +0100 |
commit | a8b50a925ee2191bfca505960ba2437bd6512c19 (patch) | |
tree | 18c5448bcf30cf76a16f3161cb8711966f2524b5 | |
parent | 5954b8892f50eb5996c122c1c7020c4a190de91a (diff) | |
download | vala-a8b50a925ee2191bfca505960ba2437bd6512c19.tar.gz |
codegen: Add destroy out-param when invoking delegate returned by delegate
https://bugzilla.gnome.org/show_bug.cgi?id=792077
-rw-r--r-- | codegen/valaccodemethodcallmodule.vala | 11 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/delegates/bug792077.vala | 16 |
3 files changed, 28 insertions, 0 deletions
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); +} |