]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Revert not_in_coroutine convenience parameter
authorJürg Billeter <j@bitron.ch>
Thu, 20 Jan 2011 10:14:35 +0000 (11:14 +0100)
committerJürg Billeter <j@bitron.ch>
Thu, 20 Jan 2011 10:19:58 +0000 (11:19 +0100)
Commit fb0c4bb7 broke closures in async methods.

codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala

index 00b1f40a3fa5c4d66a9765125afad833c394b8c7..5fff89ec7e4ed2d623caa739d62b847ec4e2dc59 100644 (file)
@@ -1704,7 +1704,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                }
 
                if (requires_destroy (param_type) && !is_unowned_delegate) {
-                       free_block.add_statement (new CCodeExpressionStatement (destroy_value (get_variable_cvalue (param, null, true))));
+                       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;
+                       }
                }
        }
 
@@ -1784,8 +1794,20 @@ 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 && requires_destroy (local.variable_type)) {
-                                       free_block.add_statement (new CCodeExpressionStatement(destroy_value (get_variable_cvalue (local, null, true))));
+                               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;
+                                               }
+                                       }
                                }
                        }
 
@@ -3487,7 +3509,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                }
        }
 
-       public virtual TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null, bool not_in_coroutine = false) {
+       public virtual TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null) {
                assert_not_reached ();
        }
 
index 391f1c30f12ad9a4ed1893736ac3388b94284055..882109dce2c9ca54a33321f6e734045e8aa3d07c 100644 (file)
@@ -521,13 +521,8 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                }
        }
 
-       /**
-        * 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) {
+       /* Returns lvalue access to the given local variable */
+       public TargetValue get_local_cvalue (LocalVariable local) {
                var result = new GLibValue (local.variable_type.copy ());
 
                var array_type = local.variable_type as ArrayType;
@@ -565,7 +560,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 () && !not_in_coroutine) {
+                               if (is_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 {
@@ -580,15 +575,10 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                return result;
        }
 
-       /**
-        * 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) {
+       /* Returns access values to the given parameter */
+       public TargetValue get_parameter_cvalue (Parameter param) {
                var result = new GLibValue (param.variable_type.copy ());
-               if (param.captured || (is_in_coroutine () && !not_in_coroutine)) {
+               if (param.captured || is_in_coroutine ()) {
                        result.value_type.value_owned = true;
                }
 
@@ -596,7 +586,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                var delegate_type = result.value_type as DelegateType;
 
                if (param.name == "this") {
-                       if (is_in_coroutine () && !not_in_coroutine) {
+                       if (is_in_coroutine ()) {
                                // use closure
                                result.cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
                        } else {
@@ -625,7 +615,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 () && !not_in_coroutine) {
+                       } else if (is_in_coroutine ()) {
                                // use closure
                                result.cvalue = get_variable_cexpression (param.name);
                                if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
@@ -693,18 +683,12 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                return value;
        }
 
-       /**
-        * 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) {
+       /* Returns lvalue access to the given symbol */
+       public override TargetValue get_variable_cvalue (Variable variable, CCodeExpression? inner = null) {
                if (variable is LocalVariable) {
-                       return get_local_cvalue ((LocalVariable) variable, not_in_coroutine);
+                       return get_local_cvalue ((LocalVariable) variable);
                } else if (variable is Parameter) {
-                       return get_parameter_cvalue ((Parameter) variable, not_in_coroutine);
+                       return get_parameter_cvalue ((Parameter) variable);
                } else {
                        assert_not_reached ();
                }
@@ -720,7 +704,6 @@ 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) {