]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
dova: Do not accept multi-dimensional arrays as they are not supported
authorJürg Billeter <j@bitron.ch>
Mon, 28 Jun 2010 17:44:14 +0000 (19:44 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 28 Jun 2010 18:31:30 +0000 (20:31 +0200)
codegen/valadovaarraymodule.vala
vala/valaparser.vala

index 83ddd4593051238eeb6b0c58b24568b3995900b0..d8b4e51ea8d6ec84ae85de6c1ce6148ecc0826ed 100644 (file)
@@ -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);
        }
 }
index 11831424fa73c8f5a56e47dc14dacf2828fce8d0..609d6e1eef6190da8972c19bdd1ab051890e0b64 100644 (file)
@@ -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));