diff options
author | Jürg Billeter <j@bitron.ch> | 2010-10-09 16:35:17 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2010-10-09 18:12:17 +0200 |
commit | 60f3d89c3aee1082fcdb086cb20963251616b952 (patch) | |
tree | 7c320f0c2597cde0b29d93b95860ad144b6b0ec8 | |
parent | 56a6fad4cc5075c3d7ecae0cbdf33b806a49de24 (diff) | |
download | vala-60f3d89c3aee1082fcdb086cb20963251616b952.tar.gz |
codegen: Use append_array_size for parameter access
-rw-r--r-- | codegen/valaccodearraymodule.vala | 31 | ||||
-rw-r--r-- | codegen/valaccodebasemodule.vala | 4 | ||||
-rw-r--r-- | codegen/valaccodememberaccessmodule.vala | 27 | ||||
-rw-r--r-- | codegen/valagasyncmodule.vala | 3 |
4 files changed, 37 insertions, 28 deletions
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 09772cb3e..47f330173 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -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) { diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index e6947b18f..06ba5c791 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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)); } } diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index c5be34887..a2c7646e3 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -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); + } + } + } } } } diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala index f6401ca9e..798168a2d 100644 --- a/codegen/valagasyncmodule.vala +++ b/codegen/valagasyncmodule.vala @@ -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); } |