]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix disposing local variables in coroutines
authorJürg Billeter <j@bitron.ch>
Fri, 19 Dec 2008 18:11:28 +0000 (18:11 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 19 Dec 2008 18:11:28 +0000 (18:11 +0000)
2008-12-19  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodebasemodule.vala:
* gobject/valaccodememberaccessmodule.vala:

Fix disposing local variables in coroutines

svn path=/trunk/; revision=2226

ChangeLog
gobject/valaccodebasemodule.vala
gobject/valaccodememberaccessmodule.vala

index 187e008ae6b477fc62347337806b7ceab053e703..ec990c3987327c062a2fbd27375a9e4e44b0cd7f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-19  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodebasemodule.vala:
+       * gobject/valaccodememberaccessmodule.vala:
+
+       Fix disposing local variables in coroutines
+
 2008-12-19  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodebasemodule.vala:
index 1c03757722d97cb91c723fd0058c6519f52477c9..02abeda89edb4e27395969ee1282b73f0b237a7a 100644 (file)
@@ -1345,7 +1345,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        if (!local.floating && requires_destroy (local.variable_type)) {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
-                               cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma)));
+                               cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma)));
                        }
                }
 
@@ -1355,7 +1355,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                                if (requires_destroy (param.parameter_type) && param.direction == ParameterDirection.IN) {
                                        var ma = new MemberAccess.simple (param.name);
                                        ma.symbol_reference = param;
-                                       cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.parameter_type, ma)));
+                                       cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (param.name), param.parameter_type, ma)));
                                }
                        }
                }
@@ -1383,6 +1383,14 @@ public class Vala.CCodeBaseModule : CCodeModule {
                temp_vars.clear ();
        }
 
+       public CCodeExpression get_variable_cexpression (string name) {
+               if (current_method != null && current_method.coroutine) {
+                       return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (name));
+               } else {
+                       return new CCodeIdentifier (get_variable_cname (name));
+               }
+       }
+
        public string get_variable_cname (string name) {
                if (name[0] == '.') {
                        // compiler-internal variable
@@ -2011,7 +2019,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        if (local.active && !local.floating && requires_destroy (local.variable_type)) {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
-                               cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma)));
+                               cfrag.append (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma)));
                        }
                }
                
@@ -2035,7 +2043,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        if (requires_destroy (param.parameter_type) && param.direction == ParameterDirection.IN) {
                                var ma = new MemberAccess.simple (param.name);
                                ma.symbol_reference = param;
-                               cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.parameter_type, ma)));
+                               cfrag.append (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (param.name), param.parameter_type, ma)));
                        }
                }
        }
@@ -2060,7 +2068,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                                found = true;
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
-                               ccomma.append_expression (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma));
+                               ccomma.append_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                        }
                }
                
@@ -2081,7 +2089,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                                found = true;
                                var ma = new MemberAccess.simple (param.name);
                                ma.symbol_reference = param;
-                               ccomma.append_expression (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.parameter_type, ma));
+                               ccomma.append_expression (get_unref_expression (get_variable_cexpression (param.name), param.parameter_type, ma));
                        }
                }
 
index 8741e9bdfeb7aade1187e98d37a52ea64e742a05..c80b6513ed3475762dfb7d7cb31036c2d118c2dd 100644 (file)
@@ -250,18 +250,13 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        expr.ccodenode = new CCodeConstant (ev.get_cname ());
                } else if (expr.symbol_reference is LocalVariable) {
                        var local = (LocalVariable) expr.symbol_reference;
-                       if (current_method != null && current_method.coroutine) {
-                               // use closure
-                               expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (local.name));
-                       } else {
-                               expr.ccodenode = new CCodeIdentifier (get_variable_cname (local.name));
-                       }
+                       expr.ccodenode = get_variable_cexpression (local.name);
                } else if (expr.symbol_reference is FormalParameter) {
                        var p = (FormalParameter) expr.symbol_reference;
                        if (p.name == "this") {
                                if (current_method != null && current_method.coroutine) {
                                        // use closure
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
+                                       expr.ccodenode = get_variable_cexpression ("self");
                                } else {
                                        var st = current_type_symbol as Struct;
                                        if (st != null && !st.is_simple_type ()) {
@@ -273,7 +268,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        } else {
                                if (current_method != null && current_method.coroutine) {
                                        // use closure
-                                       expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), p.name);
+                                       expr.ccodenode = get_variable_cexpression (p.name);
                                } else {
                                        var type_as_struct = p.parameter_type.data_type as Struct;
                                        if (p.direction != ParameterDirection.IN