summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-10-09 16:35:17 +0200
committerJürg Billeter <j@bitron.ch>2010-10-09 18:12:17 +0200
commit60f3d89c3aee1082fcdb086cb20963251616b952 (patch)
tree7c320f0c2597cde0b29d93b95860ad144b6b0ec8
parent56a6fad4cc5075c3d7ecae0cbdf33b806a49de24 (diff)
downloadvala-60f3d89c3aee1082fcdb086cb20963251616b952.tar.gz
codegen: Use append_array_size for parameter access
-rw-r--r--codegen/valaccodearraymodule.vala31
-rw-r--r--codegen/valaccodebasemodule.vala4
-rw-r--r--codegen/valaccodememberaccessmodule.vala27
-rw-r--r--codegen/valagasyncmodule.vala3
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);
}