diff options
author | Jürg Billeter <j@bitron.ch> | 2012-09-08 07:20:42 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2012-09-08 07:20:42 +0200 |
commit | 590dd689b90909f7ed27c097a7014f7a8cba8dcf (patch) | |
tree | 143ac3086d8308d4546ef33c76891eab6e1a91b7 /codegen/valagasyncmodule.vala | |
parent | 69189c9204eac311c894fa5eafba649f3881f960 (diff) | |
download | vala-590dd689b90909f7ed27c097a7014f7a8cba8dcf.tar.gz |
codegen: Fix memory leak with owned delegate parameters in async methods
Fixes bug 683600.
Diffstat (limited to 'codegen/valagasyncmodule.vala')
-rw-r--r-- | codegen/valagasyncmodule.vala | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala index eaa3979a3..1716b717a 100644 --- a/codegen/valagasyncmodule.vala +++ b/codegen/valagasyncmodule.vala @@ -264,10 +264,19 @@ public class Vala.GAsyncModule : GSignalModule { var old_captured = param.captured; param.captured = false; current_method.coroutine = false; - var value = load_parameter (param); - if (requires_copy (param_type) && !param.variable_type.value_owned) { - value = copy_value (value, param); + + TargetValue value; + if (param.variable_type.value_owned) { + // do not use load_parameter for reference/ownership transfer + // otherwise delegate destroy notify will not be moved + value = get_parameter_cvalue (param); + } else { + value = load_parameter (param); + if (requires_copy (param_type)) { + value = copy_value (value, param); + } } + current_method.coroutine = true; store_parameter (param, value); |