diff options
author | Luca Bruno <lucabru@src.gnome.org> | 2011-01-18 10:44:33 +0100 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2011-01-19 22:11:54 +0100 |
commit | fb0c4bb7701da90ef65fc81c06be65f20232dc4c (patch) | |
tree | a551cb4ce3aa06b9c8e3cc7cf4503106527e0334 /codegen/valaccodememberaccessmodule.vala | |
parent | 373eafc7d85570d2e13bd56dc8fa532bdcbc2395 (diff) | |
download | vala-fb0c4bb7701da90ef65fc81c06be65f20232dc4c.tar.gz |
codegen: Add not_in_coroutine convenience parameter to get an lvalue
Diffstat (limited to 'codegen/valaccodememberaccessmodule.vala')
-rw-r--r-- | codegen/valaccodememberaccessmodule.vala | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 6e8d1a372..30b115cfd 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -521,8 +521,13 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { } } - /* Returns lvalue access to the given local variable */ - public TargetValue get_local_cvalue (LocalVariable local) { + /** + * Returns lvalue access to the given local variable. + * + * @param not_in_coroutine enforces not to be in a coroutine + * @return the computed C lvalue + */ + public TargetValue get_local_cvalue (LocalVariable local, bool not_in_coroutine = false) { var result = new GLibValue (local.variable_type.copy ()); var array_type = local.variable_type as ArrayType; @@ -560,7 +565,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { result.array_size_cvalue = get_variable_cexpression (get_array_size_cname (get_variable_cname (local.name))); } } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) { - if (is_in_coroutine ()) { + if (is_in_coroutine () && !not_in_coroutine) { result.delegate_target_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (local.name))); result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name))); } else { @@ -575,10 +580,15 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { return result; } - /* Returns access values to the given parameter */ - public TargetValue get_parameter_cvalue (Parameter param) { + /** + * Returns lvalue access to the given local variable. + * + * @param not_in_coroutine enforces not to be in a coroutine + * @return the computed C lvalue + */ + public TargetValue get_parameter_cvalue (Parameter param, bool not_in_coroutine = false) { var result = new GLibValue (param.variable_type.copy ()); - if (param.captured || is_in_coroutine ()) { + if (param.captured || (is_in_coroutine () && !not_in_coroutine)) { result.value_type.value_owned = true; } @@ -586,7 +596,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { var delegate_type = result.value_type as DelegateType; if (param.name == "this") { - if (is_in_coroutine ()) { + if (is_in_coroutine () && !not_in_coroutine) { // use closure result.cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"); } else { @@ -615,7 +625,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { result.delegate_target_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (param.name))); result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))); } - } else if (is_in_coroutine ()) { + } else if (is_in_coroutine () && !not_in_coroutine) { // use closure result.cvalue = get_variable_cexpression (param.name); if (delegate_type != null && delegate_type.delegate_symbol.has_target) { @@ -683,12 +693,18 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { return value; } - /* Returns lvalue access to the given symbol */ - public override TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null) { + /** + * Returns lvalue access to the given symbol. + * + * @param not_in_coroutine enforces not to be in a coroutine for local variables and parameters + * @param inner instance expression for accessing fields or properties + * @return the computed C lvalue + */ + public override TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null, bool not_in_coroutine = false) { if (variable is LocalVariable) { - return get_local_cvalue ((LocalVariable) variable); + return get_local_cvalue ((LocalVariable) variable, not_in_coroutine); } else if (variable is Parameter) { - return get_parameter_cvalue ((Parameter) variable); + return get_parameter_cvalue ((Parameter) variable, not_in_coroutine); } else { assert_not_reached (); } @@ -704,6 +720,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { return load_variable (local, result); } + /* Returns unowned access to the given parameter */ public TargetValue load_parameter (Parameter param) { var result = (GLibValue) get_parameter_cvalue (param); if (result.value_type is DelegateType) { |