From e0dcda1d1d6721d7148dca49f196952dd91696b6 Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Mon, 10 Mar 2008 15:16:06 +0000 Subject: [PATCH] Make the length field of a multi-dimensional array an array of ints, 2008-03-10 Juerg Billeter * vala/valaarray.vala, gobject/valaccodeelementaccessbinding.vala: Make the length field of a multi-dimensional array an array of ints, currently only works with literal indices, patch by Rob Taylor * tests/arrays.vala: test length field of multi-dimensional arrays svn path=/trunk/; revision=1119 --- ChangeLog | 8 ++++++++ gobject/valaccodeelementaccessbinding.vala | 12 +++++++++++- tests/arrays.vala | 3 +++ vala/valaarray.vala | 9 ++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index db8ed42..2f15473 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-03-10 Jürg Billeter + + * vala/valaarray.vala, gobject/valaccodeelementaccessbinding.vala: + Make the length field of a multi-dimensional array an array of ints, + currently only works with literal indices, patch by Rob Taylor + + * tests/arrays.vala: test length field of multi-dimensional arrays + 2008-03-09 Jürg Billeter * vapi/packages/webkit-1.0/: update to r30885 diff --git a/gobject/valaccodeelementaccessbinding.vala b/gobject/valaccodeelementaccessbinding.vala index 61836ec..28b2184 100644 --- a/gobject/valaccodeelementaccessbinding.vala +++ b/gobject/valaccodeelementaccessbinding.vala @@ -43,7 +43,17 @@ public class Vala.CCodeElementAccessBinding : CCodeExpressionBinding { var ccontainer = (CCodeExpression) expr.container.ccodenode; var cindex = (CCodeExpression) indices[0].ccodenode; - if (container_type == codegen.string_type.data_type) { + if (expr.container.symbol_reference is ArrayLengthField) { + /* Figure if cindex is a constant expression and calculate dim...*/ + var lit = indices[0] as LiteralExpression; + var memberaccess = expr.container as MemberAccess; + if (lit != null && + lit.literal is IntegerLiteral && + memberaccess != null) { + int dim = (lit.literal as IntegerLiteral).value.to_int (); + codenode = codegen.get_array_length_cexpression (memberaccess.inner, dim + 1); + } + } else if (container_type == codegen.string_type.data_type) { // access to unichar in a string var coffsetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_utf8_offset_to_pointer")); coffsetcall.add_argument (ccontainer); diff --git a/tests/arrays.vala b/tests/arrays.vala index 0800881..1ca9745 100644 --- a/tests/arrays.vala +++ b/tests/arrays.vala @@ -256,6 +256,9 @@ class Maman.Foo : Object { i++; } assert (i == 3 * 2); + + assert (array.length[0] == 3); + assert (array.length[1] == 2); } static void main (string[] args) { diff --git a/vala/valaarray.vala b/vala/valaarray.vala index 306c6cd..a03f896 100644 --- a/vala/valaarray.vala +++ b/vala/valaarray.vala @@ -141,7 +141,14 @@ public class Vala.Array : Typesymbol { length_field.access = SymbolAccessibility.PUBLIC; var root_symbol = source_reference.file.context.root; - length_field.type_reference = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int")); + if (rank > 1) { + // length is an int[] containing the dimensions of the array, starting at 0 + ValueType integer = new ValueType((Typesymbol) root_symbol.scope.lookup("int")); + length_field.type_reference = new ArrayType (integer, 1); + length_field.type_reference.add_type_argument (integer); + } else { + length_field.type_reference = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int")); + } } return length_field; -- 2.7.4