[vala] dova: Do not accept multi-dimensional arrays as they are not supported
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] dova: Do not accept multi-dimensional arrays as they are not supported
- Date: Mon, 28 Jun 2010 19:08:00 +0000 (UTC)
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]