summaryrefslogtreecommitdiff
path: root/codegen
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2012-08-15 10:45:33 +0200
committerJürg Billeter <j@bitron.ch>2012-08-15 10:45:33 +0200
commit2499aa65087cb86c3194afb183bc82d687e0bb20 (patch)
tree2dbd709b695cd47e29ced9dd7c512d8a69394029 /codegen
parentb7c29ee981e0ad8276891d73c96ea57a94a96759 (diff)
downloadvala-2499aa65087cb86c3194afb183bc82d687e0bb20.tar.gz
codegen: Drop extra copy of captured unowned parameters in async methods
Diffstat (limited to 'codegen')
-rw-r--r--codegen/valaccodebasemodule.vala5
1 files changed, 4 insertions, 1 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 15a4aa677..0684436b9 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1766,6 +1766,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
void capture_parameter (Parameter param, CCodeStruct data, int block_id) {
generate_type_declaration (param.variable_type, cfile);
+ var m = param.parent_symbol as Method;
+ bool coroutine = m != null && m.coroutine;
+
var param_type = param.variable_type.copy ();
if (!param.variable_type.value_owned) {
param_type.value_owned = !no_implicit_copy (param.variable_type);
@@ -1775,7 +1778,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
// create copy if necessary as captured variables may need to be kept alive
param.captured = false;
var value = load_parameter (param);
- if (requires_copy (param_type) && !param.variable_type.value_owned) {
+ if (requires_copy (param_type) && !param.variable_type.value_owned && !coroutine) {
// directly access parameters in ref expressions
value = copy_value (value, param);
}