]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add not_in_coroutine convenience parameter to get an lvalue
authorLuca Bruno <lucabru@src.gnome.org>
Tue, 18 Jan 2011 09:44:33 +0000 (10:44 +0100)
committerJürg Billeter <j@bitron.ch>
Wed, 19 Jan 2011 21:11:54 +0000 (22:11 +0100)
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala

index e6df5df1f6c7413be5f04f591463ff9f28469b20..5b80cfe6a51a9eb21877b1ef6a2ea0cc77d4ee8a 100644 (file)
@@ -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 ();
        }
 
index 6e8d1a37284618311252fe2e5f0067ffd580e4bf..30b115cfddf5575aeede55bdf2289ab174b94cf3 100644 (file)
@@ -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) {