]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use append_array_size for parameter access
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 14:35:17 +0000 (16:35 +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 09772cb3e52d9661379ce0d297579fe2ea441472..47f3301737d5a9d461fa91f2b19caec0c734abfc 100644 (file)
@@ -182,36 +182,13 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        }
                } else if (array_expr.symbol_reference != null) {
                        if (array_expr.symbol_reference is FormalParameter) {
-                               var param = (FormalParameter) array_expr.symbol_reference;
-                               if (param.captured) {
-                                       // captured variables are stored on the heap
-                                       var block = ((Method) param.parent_symbol).body;
-                                       var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_parameter_array_length_cname (param, dim));
+                               List<CCodeExpression> size = get_array_sizes (array_expr);
+                               if (size != null && size.size >= dim) {
                                        if (is_out) {
                                                // passing array as out/ref
-                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
+                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, size[dim - 1]);
                                        } else {
-                                               return length_expr;
-                                       }
-                               } else {
-                                       if (param.array_null_terminated) {
-                                               var carray_expr = get_variable_cexpression (param.name);
-                                               requires_array_length = true;
-                                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
-                                               len_call.add_argument (carray_expr);
-                                               return len_call;
-                                       } else if (!param.no_array_length) {
-                                               CCodeExpression length_expr = get_variable_cexpression (get_parameter_array_length_cname (param, dim));
-                                               if (param.direction != ParameterDirection.IN) {
-                                                       // accessing argument of out/ref param
-                                                       length_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr);
-                                               }
-                                               if (is_out) {
-                                                       // passing array as out/ref
-                                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                                               } else {
-                                                       return length_expr;
-                                               }
+                                               return size[dim - 1];
                                        }
                                }
                        } else if (array_expr.symbol_reference is LocalVariable) {
index e6947b18f7b3f774070e94b04c6caaeac721cb59..06ba5c791a1bdba02df7522acfaa92a086a3e74d 100644 (file)
@@ -1625,6 +1625,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var ma = new MemberAccess.simple (param.name);
                        ma.symbol_reference = param;
                        ma.value_type = param.variable_type.copy ();
+                       visit_member_access (ma);
                        // directly access parameters in ref expressions
                        param.captured = false;
                        cparam = get_ref_cexpression (param.variable_type, cparam, ma, param);
@@ -1658,6 +1659,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        var ma = new MemberAccess.simple (param.name);
                        ma.symbol_reference = param;
                        ma.value_type = param_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 (param.name)), param.variable_type, ma)));
 
                        if (old_coroutine) {
@@ -1857,6 +1859,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        var ma = new MemberAccess.simple (param.name);
                                        ma.symbol_reference = param;
                                        ma.value_type = param.variable_type.copy ();
+                                       visit_member_access (ma);
                                        ccode.add_expression (get_unref_expression (get_variable_cexpression (param.name), param.variable_type, ma));
                                }
                        }
@@ -3189,6 +3192,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                var ma = new MemberAccess.simple (param.name);
                                ma.symbol_reference = param;
                                ma.value_type = param.variable_type.copy ();
+                               visit_member_access (ma);
                                ccode.add_expression (get_unref_expression (get_variable_cexpression (param.name), param.variable_type, ma));
                        }
                }
index c5be34887919da2c1ddf5a0fcd5fb344ca7a9ad0..a2c7646e349dd0c5c1a035009f75dc400a0fd412 100644 (file)
@@ -30,6 +30,8 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        pub_inst = get_cvalue (expr.inner);
                }
 
+               var array_type = expr.value_type as ArrayType;
+
                if (expr.symbol_reference is Method) {
                        var m = (Method) expr.symbol_reference;
 
@@ -287,7 +289,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        ccomma.append_expression (ctemp);
                                        set_cvalue (expr, ccomma);
                                } else {
-                                       var array_type = base_property.property_type as ArrayType;
+                                       array_type = base_property.property_type as ArrayType;
                                        if (array_type != null && !base_property.no_array_length) {
                                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                                        var temp_var = get_temp_variable (int_type);
@@ -392,6 +394,11 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                block = ((Method) p.parent_symbol).body;
                                        }
                                        set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (p.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_parameter_array_length_cname (p, dim)));
+                                               }
+                                       }
                                } else if (current_method != null && current_method.coroutine) {
                                        // use closure
                                        set_cvalue (expr, get_variable_cexpression (p.name));
@@ -415,6 +422,24 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                }
                                        }
                                }
+                               if (!p.captured && array_type != null) {
+                                       if (p.array_null_terminated) {
+                                               var carray_expr = get_variable_cexpression (p.name);
+                                               requires_array_length = true;
+                                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+                                               len_call.add_argument (carray_expr);
+                                               append_array_size (expr, len_call);
+                                       } else if (!p.no_array_length) {
+                                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                       CCodeExpression length_expr = get_variable_cexpression (get_parameter_array_length_cname (p, dim));
+                                                       if (p.direction != ParameterDirection.IN) {
+                                                               // accessing argument of out/ref param
+                                                               length_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr);
+                                                       }
+                                                       append_array_size (expr, length_expr);
+                                               }
+                                       }
+                               }
                        }
                }
        }
index f6401ca9e8018b23be562e634ae48754f07747f9..798168a2ddc38d87526a86ae149792fe2d505082 100644 (file)
@@ -103,6 +103,7 @@ public class Vala.GAsyncModule : GSignalModule {
                                        var ma = new MemberAccess.simple (param.name);
                                        ma.symbol_reference = param;
                                        ma.value_type = param.variable_type.copy ();
+                                       visit_member_access (ma);
                                        freeblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (param.name)), param.variable_type, ma)));
                                }
                        }
@@ -247,6 +248,8 @@ public class Vala.GAsyncModule : GSignalModule {
                                if (requires_copy (param_type) && !param.variable_type.value_owned)  {
                                        var ma = new MemberAccess.simple (param.name);
                                        ma.symbol_reference = param;
+                                       ma.value_type = param.variable_type.copy ();
+                                       visit_member_access (ma);
                                        cparam = get_ref_cexpression (param.variable_type, cparam, ma, param);
                                }