]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use append_array_size for local variable access
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 14:39:44 +0000 (16:39 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 16:12:17 +0000 (18:12 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valagasyncmodule.vala

index 47f3301737d5a9d461fa91f2b19caec0c734abfc..cc137ee8886cfed6aef490bda96630292e6c6083 100644 (file)
@@ -181,7 +181,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                return size[dim - 1];
                        }
                } else if (array_expr.symbol_reference != null) {
-                       if (array_expr.symbol_reference is FormalParameter) {
+                       if (array_expr.symbol_reference is FormalParameter || array_expr.symbol_reference is LocalVariable) {
                                List<CCodeExpression> size = get_array_sizes (array_expr);
                                if (size != null && size.size >= dim) {
                                        if (is_out) {
@@ -191,26 +191,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                                return size[dim - 1];
                                        }
                                }
-                       } else if (array_expr.symbol_reference is LocalVariable) {
-                               var local = (LocalVariable) array_expr.symbol_reference;
-                               if (local.captured) {
-                                       // captured variables are stored on the heap
-                                       var block = (Block) local.parent_symbol;
-                                       var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim));
-                                       if (is_out) {
-                                               // passing array as out/ref
-                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                                       } else {
-                                               return length_expr;
-                                       }
-                               } else {
-                                       var length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim));
-                                       if (is_out) {
-                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                                       } else {
-                                               return length_expr;
-                                       }
-                               }
                        } else if (array_expr.symbol_reference is Field) {
                                var field = (Field) array_expr.symbol_reference;
                                if (field.array_null_terminated) {
index 06ba5c791a1bdba02df7522acfaa92a086a3e74d..344ec72411a2e52ad94dab2cac95a9d575608664 100644 (file)
@@ -953,6 +953,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        var ma = new MemberAccess.simple (local.name);
                                        ma.symbol_reference = local;
                                        ma.value_type = local.variable_type.copy ();
+                                       visit_member_access (ma);
                                        ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                                }
 
@@ -1737,6 +1738,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                                var ma = new MemberAccess.simple (local.name);
                                                ma.symbol_reference = local;
                                                ma.value_type = local.variable_type.copy ();
+                                               visit_member_access (ma);
                                                free_block.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), get_variable_cname (local.name)), local.variable_type, ma)));
 
                                                if (old_coroutine) {
@@ -1848,6 +1850,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
                                ma.value_type = local.variable_type.copy ();
+                               visit_member_access (ma);
                                ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                        }
                }
@@ -1976,6 +1979,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var ma = new MemberAccess.simple (local.name);
                        ma.symbol_reference = local;
                        ma.value_type = local.variable_type.copy ();
+                       visit_member_access (ma);
 
                        rhs = get_cvalue (local.initializer);
 
@@ -3026,6 +3030,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var ma = new MemberAccess.simple (local.name);
                        ma.symbol_reference = local;
                        ma.value_type = local.variable_type.copy ();
+                       visit_member_access (ma);
                        expr_list.append_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                }
 
@@ -3104,6 +3109,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var ma = new MemberAccess.simple (local.name);
                        ma.symbol_reference = local;
                        ma.value_type = local.variable_type.copy ();
+                       visit_member_access (ma);
                        ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                }
 
@@ -3126,6 +3132,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
                                ma.value_type = local.variable_type.copy ();
+                               visit_member_access (ma);
                                ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                        }
                }
@@ -3163,6 +3170,8 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        if (!local.unreachable && local.active && !local.floating && !local.captured && requires_destroy (local.variable_type)) {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
+                               ma.value_type = local.variable_type.copy ();
+                               visit_member_access (ma);
                                ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                        }
                }
index a2c7646e349dd0c5c1a035009f75dc400a0fd412..fb8d08599f4e10d77ce50c7473ed15e89d2dbcac 100644 (file)
@@ -355,8 +355,18 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                // captured variables are stored on the heap
                                var block = (Block) local.parent_symbol;
                                set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name)));
+                               if (array_type != null) {
+                                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                                               append_array_size (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim)));
+                                       }
+                               }
                        } else {
                                set_cvalue (expr, get_variable_cexpression (local.name));
+                               if (array_type != null) {
+                                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                                               append_array_size (expr, get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim)));
+                                       }
+                               }
 
                                if (expr.parent_node is ReturnStatement &&
                                    current_return_type.value_owned &&
index 798168a2ddc38d87526a86ae149792fe2d505082..1288ed2c41b9a745164c910b2d34b242fc945cbe 100644 (file)
@@ -114,6 +114,8 @@ public class Vala.GAsyncModule : GSignalModule {
                        var v = new LocalVariable (m.return_type, ".result");
                        var ma = new MemberAccess.simple (".result");
                        ma.symbol_reference = v;
+                       ma.value_type = v.variable_type.copy ();
+                       visit_member_access (ma);
                        var unref_expr = get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "result"), m.return_type, ma);
                        freeblock.add_statement (new CCodeExpressionStatement (unref_expr));
                }
@@ -571,6 +573,8 @@ public class Vala.GAsyncModule : GSignalModule {
                foreach (LocalVariable local in temp_ref_vars) {
                        var ma = new MemberAccess.simple (local.name);
                        ma.symbol_reference = local;
+                       ma.value_type = local.variable_type.copy ();
+                       visit_member_access (ma);
                        ccode.add_expression (get_unref_expression (new CCodeIdentifier (local.name), local.variable_type, ma));
                }