[vala] codegen: Use append_array_size for parameter access



commit 60f3d89c3aee1082fcdb086cb20963251616b952
Author: Jürg Billeter <j bitron ch>
Date:   Sat Oct 9 16:35:17 2010 +0200

    codegen: Use append_array_size for parameter access

 codegen/valaccodearraymodule.vala        |   31 +++--------------------------
 codegen/valaccodebasemodule.vala         |    4 +++
 codegen/valaccodememberaccessmodule.vala |   27 +++++++++++++++++++++++++-
 codegen/valagasyncmodule.vala            |    3 ++
 4 files changed, 37 insertions(+), 28 deletions(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index 09772cb..47f3301 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 e6947b1..06ba5c7 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 c5be348..a2c7646 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 f6401ca..798168a 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);
 				}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]