[vala] dova: Do not accept multi-dimensional arrays as they are not supported



commit 288a764bd9e1b23c89094156750fd3156151d74d
Author: Jürg Billeter <j bitron ch>
Date:   Mon Jun 28 19:44:14 2010 +0200

    dova: Do not accept multi-dimensional arrays as they are not supported

 codegen/valadovaarraymodule.vala |   70 +++++--------------------------------
 vala/valaparser.vala             |    4 +-
 2 files changed, 12 insertions(+), 62 deletions(-)
---
diff --git a/codegen/valadovaarraymodule.vala b/codegen/valadovaarraymodule.vala
index 83ddd45..d8b4e51 100644
--- a/codegen/valadovaarraymodule.vala
+++ b/codegen/valadovaarraymodule.vala
@@ -1,6 +1,6 @@
 /* valadovaarraymodule.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -25,14 +25,10 @@ internal class Vala.DovaArrayModule : DovaMethodCallModule {
 		base (codegen, next);
 	}
 
-	void append_initializer_list (CCodeCommaExpression ce, CCodeExpression name_cnode, InitializerList initializer_list, int rank, ref int i) {
+	void append_initializer_list (CCodeCommaExpression ce, CCodeExpression name_cnode, InitializerList initializer_list, ref int i) {
 		foreach (Expression e in initializer_list.get_initializers ()) {
-			if (rank > 1) {
-				append_initializer_list (ce, name_cnode, (InitializerList) e, rank - 1, ref i);
-			} else {
-				ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
-				i++;
-			}
+			ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+			i++;
 		}
 	}
 
@@ -50,7 +46,7 @@ internal class Vala.DovaArrayModule : DovaMethodCallModule {
 
 			temp_vars.insert (0, temp_var);
 
-			append_initializer_list (ce, name_cnode, expr.initializer_list, expr.rank, ref i);
+			append_initializer_list (ce, name_cnode, expr.initializer_list, ref i);
 
 			ce.append_expression (name_cnode);
 
@@ -61,70 +57,24 @@ internal class Vala.DovaArrayModule : DovaMethodCallModule {
 
 		generate_method_declaration (array_class.default_construction_method, source_declarations);
 
-		var gnew = new CCodeFunctionCall (new CCodeIdentifier ("dova_array_new"));
-		gnew.add_argument (get_type_id_expression (expr.element_type));
+		var array_new = new CCodeFunctionCall (new CCodeIdentifier ("dova_array_new"));
+		array_new.add_argument (get_type_id_expression (expr.element_type));
 
-		bool first = true;
-		CCodeExpression cexpr = null;
+		// length of new array
+		array_new.add_argument ((CCodeExpression) expr.get_sizes ().get (0).ccodenode);
 
-		// iterate over each dimension
-		foreach (Expression size in expr.get_sizes ()) {
-			CCodeExpression csize = (CCodeExpression) size.ccodenode;
-
-			if (!is_pure_ccode_expression (csize)) {
-				var temp_var = get_temp_variable (int_type, false, expr);
-				var name_cnode = new CCodeIdentifier (temp_var.name);
-				size.ccodenode = name_cnode;
-
-				temp_vars.insert (0, temp_var);
-
-				csize = new CCodeAssignment (name_cnode, csize);
-			}
-
-			if (first) {
-				cexpr = csize;
-				first = false;
-			} else {
-				cexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cexpr, csize);
-			}
-		}
-
-		gnew.add_argument (cexpr);
-
-		if (expr.initializer_list != null) {
-			var ce = new CCodeCommaExpression ();
-			var temp_var = get_temp_variable (expr.value_type, true, expr);
-			var name_cnode = new CCodeIdentifier (temp_var.name);
-			int i = 0;
-
-			temp_vars.insert (0, temp_var);
-
-			ce.append_expression (new CCodeAssignment (name_cnode, gnew));
-
-			append_initializer_list (ce, name_cnode, expr.initializer_list, expr.rank, ref i);
-
-			ce.append_expression (name_cnode);
-
-			expr.ccodenode = ce;
-		} else {
-			expr.ccodenode = gnew;
-		}
+		expr.ccodenode = array_new;
 	}
 
 	public override void visit_element_access (ElementAccess expr) {
 		expr.accept_children (codegen);
 
 		List<Expression> indices = expr.get_indices ();
-		int rank = indices.size;
 
 		var ccontainer = (CCodeExpression) expr.container.ccodenode;
 		var cindex = (CCodeExpression) indices[0].ccodenode;
 
 		// access to element in an array
-		for (int i = 1; i < rank; i++) {
-			var cmul = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cindex, head.get_array_length_cexpression (expr.container, i + 1));
-			cindex = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, cmul, (CCodeExpression) indices[i].ccodenode);
-		}
 		expr.ccodenode = new CCodeElementAccess (ccontainer, cindex);
 	}
 }
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index 1183142..609d6e1 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -463,7 +463,7 @@ public class Vala.Parser : CodeVisitor {
 					// only used for parsing, reject use as real type
 					invalid_array = true;
 				}
-			} while (accept (TokenType.COMMA));
+			} while (context.profile != Profile.DOVA && accept (TokenType.COMMA));
 			expect (TokenType.CLOSE_BRACKET);
 
 			// arrays contain strong references by default
@@ -877,7 +877,7 @@ public class Vala.Parser : CodeVisitor {
 					size_specified = true;
 				}
 				size_specifier_list.add (size);
-			} while (accept (TokenType.COMMA));
+			} while (context.profile != Profile.DOVA && accept (TokenType.COMMA));
 			expect (TokenType.CLOSE_BRACKET);
 		} while (accept (TokenType.OPEN_BRACKET));
 



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