From: Luca Bruno Date: Tue, 18 Jan 2011 09:44:33 +0000 (+0100) Subject: codegen: Add not_in_coroutine convenience parameter to get an lvalue X-Git-Tag: 0.11.5~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb0c4bb7701da90ef65fc81c06be65f20232dc4c;p=thirdparty%2Fvala.git codegen: Add not_in_coroutine convenience parameter to get an lvalue --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index e6df5df1f..5b80cfe6a 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1704,17 +1704,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } if (requires_destroy (param_type) && !is_unowned_delegate) { - bool old_coroutine = false; - if (current_method != null) { - old_coroutine = current_method.coroutine; - current_method.coroutine = false; - } - - free_block.add_statement (new CCodeExpressionStatement (get_unref_expression_ (param))); - - if (old_coroutine) { - current_method.coroutine = true; - } + free_block.add_statement (new CCodeExpressionStatement (destroy_value (get_variable_cvalue (param, null, true)))); } } @@ -1794,20 +1784,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { // free in reverse order for (int i = local_vars.size - 1; i >= 0; i--) { var local = local_vars[i]; - if (local.captured) { - if (requires_destroy (local.variable_type)) { - bool old_coroutine = false; - if (current_method != null) { - old_coroutine = current_method.coroutine; - current_method.coroutine = false; - } - - free_block.add_statement (new CCodeExpressionStatement (get_unref_expression_ (local))); - - if (old_coroutine) { - current_method.coroutine = true; - } - } + if (local.captured && requires_destroy (local.variable_type)) { + free_block.add_statement (new CCodeExpressionStatement(destroy_value (get_variable_cvalue (local, null, true)))); } } @@ -3509,7 +3487,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } } - public virtual TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null) { + public virtual TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null, bool not_in_coroutine = false) { assert_not_reached (); } 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) {