summaryrefslogtreecommitdiff
path: root/codegen/valagasyncmodule.vala
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2011-05-08 10:20:46 +0200
committerLuca Bruno <lucabru@src.gnome.org>2011-05-08 17:20:02 +0200
commit9ae9b180bca5d8f4af8a4145fdfb0d75cc6d030c (patch)
tree6f9e5fe275e622ebc4614c1a62509a1646f907e0 /codegen/valagasyncmodule.vala
parent44d71202d4a873bae2c9bec971b53b518798954b (diff)
downloadvala-9ae9b180bca5d8f4af8a4145fdfb0d75cc6d030c.tar.gz
GAsync: Use full result of copy_value in generate_async_function
Diffstat (limited to 'codegen/valagasyncmodule.vala')
-rw-r--r--codegen/valagasyncmodule.vala24
1 files changed, 9 insertions, 15 deletions
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index e1f75e4d9..df8184a76 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -248,34 +248,28 @@ public class Vala.GAsyncModule : GSignalModule {
param_type.value_owned = true;
// create copy if necessary as variables in async methods may need to be kept alive
- CCodeExpression cparam = new CCodeIdentifier (get_variable_cname (param.name));
- if (param.variable_type.is_real_non_null_struct_type ()) {
- cparam = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, cparam);
- }
+ var old_captured = param.captured;
+ param.captured = false;
+ var value = load_parameter (param);
if (requires_copy (param_type) && !param.variable_type.value_owned) {
- var ma = new MemberAccess.simple (param.name);
- ma.symbol_reference = param;
- ma.value_type = param.variable_type.copy ();
- visit_member_access (ma);
- var value = load_parameter (param);
- ((GLibValue) value).cvalue = cparam;
- cparam = get_cvalue_ (copy_value (value, param));
+ value = copy_value (value, param);
}
+ param.captured = old_captured;
- ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_variable_cname (param.name)), cparam);
+ ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_variable_cname (param.name)), get_cvalue_ (value));
if (param.variable_type is ArrayType) {
var array_type = (ArrayType) param.variable_type;
if (!param.no_array_length) {
for (int dim = 1; dim <= array_type.rank; dim++) {
- ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_parameter_array_length_cname (param, dim)), new CCodeIdentifier (get_parameter_array_length_cname (param, dim)));
+ ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_parameter_array_length_cname (param, dim)), get_array_length_cvalue (value, dim));
}
}
} else if (param.variable_type is DelegateType) {
var deleg_type = (DelegateType) param.variable_type;
if (deleg_type.delegate_symbol.has_target) {
- ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (param.name))));
+ ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_cname (get_variable_cname (param.name))), get_delegate_target_cvalue (value));
if (deleg_type.value_owned) {
- ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))));
+ ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), get_delegate_target_destroy_notify_cvalue (value));
}
}
}