vala r1119 - in trunk: . gobject tests vala



Author: juergbi
Date: Mon Mar 10 15:16:06 2008
New Revision: 1119
URL: http://svn.gnome.org/viewvc/vala?rev=1119&view=rev

Log:
2008-03-10  Juerg Billeter  <j bitron ch>

	* 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


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodeelementaccessbinding.vala
   trunk/tests/arrays.vala
   trunk/vala/valaarray.vala

Modified: trunk/gobject/valaccodeelementaccessbinding.vala
==============================================================================
--- trunk/gobject/valaccodeelementaccessbinding.vala	(original)
+++ trunk/gobject/valaccodeelementaccessbinding.vala	Mon Mar 10 15:16:06 2008
@@ -43,7 +43,17 @@
 
 		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);

Modified: trunk/tests/arrays.vala
==============================================================================
--- trunk/tests/arrays.vala	(original)
+++ trunk/tests/arrays.vala	Mon Mar 10 15:16:06 2008
@@ -256,6 +256,9 @@
 			i++;
 		}
 		assert (i == 3 * 2);
+
+		assert (array.length[0] == 3);
+		assert (array.length[1] == 2);
 	}
 
 	static void main (string[] args) {

Modified: trunk/vala/valaarray.vala
==============================================================================
--- trunk/vala/valaarray.vala	(original)
+++ trunk/vala/valaarray.vala	Mon Mar 10 15:16:06 2008
@@ -141,7 +141,14 @@
 			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;



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