vala r1124 - in trunk: . gobject vala



Author: juergbi
Date: Fri Mar 14 02:11:02 2008
New Revision: 1124
URL: http://svn.gnome.org/viewvc/vala?rev=1124&view=rev

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

	* vala/Makefile.am, vala/valaarraytype.vala, vala/valadatatype.vala,
	  vala/valamember.vala, vala/valasemanticanalyzer.vala,
	  vala/valasymbolresolver.vala, vala/valatypeparameter.vala,
	  vala/valatypesymbol.vala, gobject/valaccodegenerator.vala,
	  gobject/valaccodegeneratorinvocationexpression.vala,
	  gobject/valaccodegeneratormethod.vala: remove Array class, arrays
	  are not type symbols


Removed:
   trunk/vala/valaarray.vala
Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodegenerator.vala
   trunk/gobject/valaccodegeneratorinvocationexpression.vala
   trunk/gobject/valaccodegeneratormethod.vala
   trunk/vala/Makefile.am
   trunk/vala/valaarraytype.vala
   trunk/vala/valadatatype.vala
   trunk/vala/valamember.vala
   trunk/vala/valasemanticanalyzer.vala
   trunk/vala/valasymbolresolver.vala
   trunk/vala/valatypeparameter.vala
   trunk/vala/valatypesymbol.vala

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Fri Mar 14 02:11:02 2008
@@ -1125,6 +1125,9 @@
 		} else if (type.type_parameter != null && current_type_symbol is Class) {
 			string func_name = "%s_dup_func".printf (type.type_parameter.name.down ());
 			return new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+		} else if (type is ArrayType) {
+			Report.error (type.source_reference, "internal error: duplicating %s instances not yet supported".printf (type.to_string ()));
+			return null;
 		} else {
 			return new CCodeConstant ("NULL");
 		}
@@ -1146,6 +1149,8 @@
 		} else if (type.type_parameter != null && current_type_symbol is Class) {
 			string func_name = "%s_destroy_func".printf (type.type_parameter.name.down ());
 			return new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+		} else if (type is ArrayType) {
+			return new CCodeIdentifier ("g_free");
 		} else if (type is PointerType) {
 			return new CCodeIdentifier ("g_free");
 		} else {
@@ -1162,7 +1167,7 @@
 		 */
 
 		var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cvar, new CCodeConstant ("NULL"));
-		if (type.data_type == null) {
+		if (type.type_parameter != null) {
 			if (!(current_type_symbol is Class) || !current_class.is_subtype_of (gobject_type)) {
 				return new CCodeConstant ("NULL");
 			}
@@ -1231,7 +1236,9 @@
 		var cassign = new CCodeAssignment (cvar, ccomma);
 
 		// g_free (NULL) is allowed
-		if ((context.non_null && !type.requires_null_check) || (type.data_type != null && !type.data_type.is_reference_counting () && type.data_type.get_free_function () == "g_free")) {
+		bool uses_gfree = (type.data_type != null && !type.data_type.is_reference_counting () && type.data_type.get_free_function () == "g_free");
+		uses_gfree = uses_gfree || type is ArrayType;
+		if ((context.non_null && !type.requires_null_check) || uses_gfree) {
 			return new CCodeParenthesizedExpression (cassign);
 		}
 
@@ -1294,7 +1301,7 @@
 
 			var st = decl.type_reference.data_type as Struct;
 
-			if (decl.type_reference.data_type != null && decl.type_reference.data_type.is_reference_type ()) {
+			if (decl.type_reference.is_reference_type_or_type_parameter ()) {
 				vardecl.initializer = new CCodeConstant ("NULL");
 			} else if (st != null && !st.is_simple_type ()) {
 				// 0-initialize struct with struct initializer { 0 }
@@ -1919,7 +1926,7 @@
 
 		var local_vars = b.get_local_variables ();
 		foreach (VariableDeclarator decl in local_vars) {
-			if (decl.active && decl.type_reference.data_type != null && decl.type_reference.data_type.is_reference_type () && decl.type_reference.takes_ownership) {
+			if (decl.active && decl.type_reference.is_reference_type_or_type_parameter () && decl.type_reference.takes_ownership) {
 				var ma = new MemberAccess.simple (decl.name);
 				ma.symbol_reference = decl;
 				cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (decl.name)), decl.type_reference, ma)));
@@ -1967,7 +1974,7 @@
 
 		var local_vars = b.get_local_variables ();
 		foreach (VariableDeclarator decl in local_vars) {
-			if (decl.active && decl.type_reference.data_type != null && decl.type_reference.data_type.is_reference_type () && decl.type_reference.takes_ownership) {
+			if (decl.active && decl.type_reference.is_reference_type_or_type_parameter () && decl.type_reference.takes_ownership) {
 				found = true;
 				var ma = new MemberAccess.simple (decl.name);
 				ma.symbol_reference = decl;

Modified: trunk/gobject/valaccodegeneratorinvocationexpression.vala
==============================================================================
--- trunk/gobject/valaccodegeneratorinvocationexpression.vala	(original)
+++ trunk/gobject/valaccodegeneratorinvocationexpression.vala	Fri Mar 14 02:11:02 2008
@@ -57,8 +57,8 @@
 		var carg_map = new HashMap<int,CCodeExpression> (direct_hash, direct_equal);
 
 		if (m is ArrayResizeMethod) {
-			var array = (Array) m.parent_symbol;
-			carg_map.set (get_param_pos (0), new CCodeIdentifier (array.get_cname ()));
+			var array_type = (ArrayType) ma.inner.static_type;
+			carg_map.set (get_param_pos (0), new CCodeIdentifier (array_type.element_type.get_cname ()));
 		} else if (m is ArrayMoveMethod) {
 			requires_array_move = true;
 		}
@@ -96,9 +96,9 @@
 		}
 
 		if (m is ArrayMoveMethod) {
-			var array = (Array) m.parent_symbol;
+			var array_type = (ArrayType) ma.inner.static_type;
 			var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
-			csizeof.add_argument (new CCodeIdentifier (array.get_cname ()));
+			csizeof.add_argument (new CCodeIdentifier (array_type.element_type.get_cname ()));
 			carg_map.set (get_param_pos (0.1), csizeof);
 		} else if (m is DBusMethod) {
 			bool found_out = false;
@@ -458,7 +458,8 @@
 
 			var clen = get_array_length_cexpression (ma.inner, 1);
 			var celems = (CCodeExpression) ma.inner.ccodenode;
-			var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (ma.inner.static_type.data_type.get_cname ()));
+			var array_type = (ArrayType) ma.inner.static_type;
+			var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (array_type.element_type.get_cname ()));
 			var cdelta = new CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, temp_ref, clen));
 			var ccheck = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, temp_ref, clen);
 

Modified: trunk/gobject/valaccodegeneratormethod.vala
==============================================================================
--- trunk/gobject/valaccodegeneratormethod.vala	(original)
+++ trunk/gobject/valaccodegeneratormethod.vala	Fri Mar 14 02:11:02 2008
@@ -727,7 +727,7 @@
 	}
 
 	private CCodeExpression default_value_for_type (DataType! type) {
-		if ((type.data_type != null && type.data_type.is_reference_type ()) || type is PointerType) {
+		if ((type.data_type != null && type.data_type.is_reference_type ()) || type is PointerType || type is ArrayType) {
 			return new CCodeConstant ("NULL");
 		} else if (type.data_type != null && type.data_type.get_default_value () != null) {
 			return new CCodeConstant (type.data_type.get_default_value ());

Modified: trunk/vala/Makefile.am
==============================================================================
--- trunk/vala/Makefile.am	(original)
+++ trunk/vala/Makefile.am	Fri Mar 14 02:11:02 2008
@@ -16,7 +16,6 @@
 
 libvalacore_la_VALASOURCES = \
 	valaaddressofexpression.vala \
-	valaarray.vala \
 	valaarraycreationexpression.vala \
 	valaarraylengthfield.vala \
 	valaarraymovemethod.vala \

Modified: trunk/vala/valaarraytype.vala
==============================================================================
--- trunk/vala/valaarraytype.vala	(original)
+++ trunk/vala/valaarraytype.vala	Fri Mar 14 02:11:02 2008
@@ -35,21 +35,88 @@
 	 * The rank of this array.
 	 */
 	public int rank { get; construct set; }
+	
+	private ArrayLengthField length_field;
+	private ArrayResizeMethod resize_method;
+	private ArrayMoveMethod move_method;
 
-	public ArrayType (construct DataType! element_type, construct int rank) {
+	public ArrayType (DataType! element_type, int rank, SourceReference source_reference) {
+		this.element_type = element_type;
+		this.rank = rank;
+		this.source_reference = source_reference;
 	}
 
-	construct {
-		if (element_type.data_type != null) {
-			data_type = element_type.data_type.get_array (rank);
-		} else {
-			data_type = element_type.type_parameter.get_array (rank);
+	public override Symbol? get_member (string member_name) {
+		if (member_name == "length") {
+			return get_length_field ();
+		} else if (member_name == "move") {
+			return get_move_method ();
+		} else if (member_name == "resize") {
+			return get_resize_method ();
 		}
+		return null;
+	}
+
+	private ArrayLengthField get_length_field () {
+		if (length_field == null) {
+			length_field = new ArrayLengthField (source_reference);
+
+			length_field.access = SymbolAccessibility.PUBLIC;
+
+			var root_symbol = source_reference.file.context.root;
+			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, source_reference);
+				length_field.type_reference.add_type_argument (integer);
+			} else {
+				length_field.type_reference = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int"));
+			}
+
+		}
+		return length_field;
+	}
+
+	private ArrayResizeMethod get_resize_method () {
+		if (resize_method == null) {
+			resize_method = new ArrayResizeMethod (source_reference);
+
+			resize_method.return_type = new VoidType ();
+			resize_method.access = SymbolAccessibility.PUBLIC;
+
+			resize_method.set_cname ("g_renew");
+			
+			var root_symbol = source_reference.file.context.root;
+			var int_type = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int"));
+
+			resize_method.add_parameter (new FormalParameter ("length", int_type));
+			
+			resize_method.returns_modified_pointer = true;
+		}
+		return resize_method;
+	}
+
+	private ArrayMoveMethod get_move_method () {
+		if (move_method == null) {
+			move_method = new ArrayMoveMethod (source_reference);
+
+			move_method.return_type = new VoidType ();
+			move_method.access = SymbolAccessibility.PUBLIC;
+
+			move_method.set_cname ("_vala_array_move");
+
+			var root_symbol = source_reference.file.context.root;
+			var int_type = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int"));
+
+			move_method.add_parameter (new FormalParameter ("src", int_type));
+			move_method.add_parameter (new FormalParameter ("dest", int_type));
+			move_method.add_parameter (new FormalParameter ("length", int_type));
+		}
+		return move_method;
 	}
 
 	public override DataType! copy () {
-		var result = new ArrayType (element_type, rank);
-		result.source_reference = source_reference;
+		var result = new ArrayType (element_type, rank, source_reference);
 		result.transfers_ownership = transfers_ownership;
 		result.takes_ownership = takes_ownership;
 		result.is_out = is_out;
@@ -65,7 +132,47 @@
 		return result;
 	}
 
+	public override string get_cname (bool var_type, bool const_type) {
+		return element_type.get_cname () + "*";
+	}
+
 	public override bool is_array () {
 		return true;
 	}
+
+	public override string! to_string () {
+		return element_type.to_string () + "[]";
+	}
+
+	public override bool compatible (DataType! target_type, bool enable_non_null) {
+		if (target_type is PointerType || (target_type.data_type != null && target_type.data_type.get_attribute ("PointerType") != null)) {
+			/* any array type can be cast to a generic pointer */
+			return true;
+		}
+
+		/* temporarily ignore type parameters */
+		if (target_type.type_parameter != null) {
+			return true;
+		}
+
+		var target_array_type = target_type as ArrayType;
+		if (target_array_type == null) {
+			return false;
+		}
+
+		if (element_type.compatible (target_array_type.element_type)
+		    && target_array_type.element_type.compatible (element_type)) {
+			if (requires_null_check && !target_type.nullable) {
+				// incompatibility between null and non-null types
+				return !enable_non_null;
+			}
+			return true;
+		}
+
+		return false;
+	}
+
+	public override bool is_reference_type_or_type_parameter () {
+		return true;
+	}
 }

Modified: trunk/vala/valadatatype.vala
==============================================================================
--- trunk/vala/valadatatype.vala	(original)
+++ trunk/vala/valadatatype.vala	Fri Mar 14 02:11:02 2008
@@ -339,7 +339,6 @@
 			if (type_parameter != null ||
 				(data_type != null && (
 					data_type.is_reference_type () ||
-					this is ArrayType ||
 					this is DelegateType ||
 					data_type.get_attribute ("PointerType") != null))) {
 				return true;
@@ -447,6 +446,13 @@
 		return symbols;
 	}
 
+	public virtual Symbol? get_member (string member_name) {
+		if (data_type != null) {
+			return SemanticAnalyzer.symbol_lookup_inherited (data_type, member_name);
+		}
+		return null;
+	}
+
 	public virtual Symbol get_pointer_member (string member_name) {
 		return null;
 	}

Modified: trunk/vala/valamember.vala
==============================================================================
--- trunk/vala/valamember.vala	(original)
+++ trunk/vala/valamember.vala	Fri Mar 14 02:11:02 2008
@@ -1,6 +1,6 @@
 /* valamember.vala
  *
- * Copyright (C) 2006-2007  Raffaele Sandrini, JÃrg Billeter
+ * Copyright (C) 2006-2008  Raffaele Sandrini, 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
@@ -34,7 +34,7 @@
 	}
 
 	public override Collection<string> get_cheader_filenames () {
-		if (cheader_filenames.size == 0) {
+		if (cheader_filenames.size == 0 && parent_symbol != null) {
 			/* default to header filenames of the namespace */
 			foreach (string filename in parent_symbol.get_cheader_filenames ()) {
 				add_cheader_filename (filename);

Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala	(original)
+++ trunk/vala/valasemanticanalyzer.vala	Fri Mar 14 02:11:02 2008
@@ -1180,7 +1180,7 @@
 
 		var calc_sizes = new ArrayList<LiteralExpression> ();
 		if (initlist != null) {
-			initlist.expected_type = new ArrayType (expr.element_type, expr.rank);
+			initlist.expected_type = new ArrayType (expr.element_type, expr.rank, expr.source_reference);
 			initlist.expected_type.add_type_argument (expr.element_type);
 
 			initlist.accept (this);
@@ -1237,7 +1237,7 @@
 			expr.element_type.takes_ownership = true;
 		}
 
-		expr.static_type = new ArrayType (expr.element_type, expr.rank);
+		expr.static_type = new ArrayType (expr.element_type, expr.rank, expr.source_reference);
 		expr.static_type.transfers_ownership = true;
 		expr.static_type.takes_ownership = true;
 
@@ -1456,9 +1456,11 @@
 			if (expr.symbol_reference == null && expr.inner.static_type != null) {
 				if (expr.pointer_member_access) {
 					expr.symbol_reference = expr.inner.static_type.get_pointer_member (expr.member_name);
-				} else if (expr.inner.static_type.data_type != null) {
-					base_symbol = expr.inner.static_type.data_type;
-					expr.symbol_reference = symbol_lookup_inherited (base_symbol, expr.member_name);
+				} else {
+					if (expr.inner.static_type.data_type != null) {
+						base_symbol = expr.inner.static_type.data_type;
+					}
+					expr.symbol_reference = expr.inner.static_type.get_member (expr.member_name);
 				}
 				if (expr.symbol_reference != null) {
 					// inner expression is variable, field, or parameter

Modified: trunk/vala/valasymbolresolver.vala
==============================================================================
--- trunk/vala/valasymbolresolver.vala	(original)
+++ trunk/vala/valasymbolresolver.vala	Fri Mar 14 02:11:02 2008
@@ -300,10 +300,9 @@
 			element_type.is_ref = false;
 			element_type.is_out = false;
 
-			type = new ArrayType (element_type, unresolved_type.array_rank);
+			type = new ArrayType (element_type, unresolved_type.array_rank, unresolved_type.source_reference);
 			type.add_type_argument (element_type);
 
-			type.source_reference = unresolved_type.source_reference;
 			type.takes_ownership = unresolved_type.takes_ownership;
 			type.transfers_ownership = unresolved_type.transfers_ownership;
 			type.is_ref = unresolved_type.is_ref;

Modified: trunk/vala/valatypeparameter.vala
==============================================================================
--- trunk/vala/valatypeparameter.vala	(original)
+++ trunk/vala/valatypeparameter.vala	Fri Mar 14 02:11:02 2008
@@ -1,6 +1,6 @@
 /* valatypeparameter.vala
  *
- * Copyright (C) 2006-2007  JÃrg Billeter
+ * Copyright (C) 2006-2008  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
@@ -50,45 +50,6 @@
 	public override void accept (CodeVisitor! visitor) {
 		visitor.visit_type_parameter (this);
 	}
-	
-	/**
-	 * Returns the array type for elements of this type parameter.
-	 *
-	 * @param rank the rank the array should be of
-	 * @return array type for this type parameter
-	 */
-	public Array! get_array (int rank) {
-		Array array_type = null;
-
-		if (array_types != null) {
-			array_type = array_types[rank];
-		}
-
-		if (array_type == null) {
-			if (array_types == null) {
-				array_types = new HashMap<int,Array> ();
-			}
-
-			var new_array_type = new Array.with_type_parameter (this, rank, source_reference);
-			parent_symbol.scope.add (new_array_type.name, new_array_type);
-
-			/* add internal length field */
-			new_array_type.scope.add (new_array_type.get_length_field ().name, new_array_type.get_length_field ());
-			/* add internal resize method */
-			new_array_type.scope.add (new_array_type.get_resize_method ().name, new_array_type.get_resize_method ());
-			/* add internal move method */
-			new_array_type.scope.add (new_array_type.get_move_method ().name, new_array_type.get_move_method ());
-
-			/* link the array type to the same source as the container type */
-			new_array_type.source_reference = this.source_reference;
-			
-			array_types[rank] = new_array_type;
-			
-			array_type = new_array_type;
-		}
-		
-		return array_type;
-	}
 
 	/**
 	 * Checks two type parameters for equality.

Modified: trunk/vala/valatypesymbol.vala
==============================================================================
--- trunk/vala/valatypesymbol.vala	(original)
+++ trunk/vala/valatypesymbol.vala	Fri Mar 14 02:11:02 2008
@@ -195,45 +195,6 @@
 	}
 
 	/**
-	 * Returns the array type for elements of this data type.
-	 *
-	 * @param rank the rank the array should be of
-	 * @return array type for this data type
-	 */
-	public Array! get_array (int rank) {
-		Array array_type = null;
-
-		if (array_types != null) {
-			array_type = array_types[rank];
-		}
-
-		if (array_type == null) {
-			if (array_types == null) {
-				array_types = new HashMap<int,Array> ();
-			}
-
-			var new_array_type = new Array (this, rank, source_reference);
-			parent_symbol.scope.add (new_array_type.name, new_array_type);
-
-			/* add internal length field */
-			new_array_type.scope.add (new_array_type.get_length_field ().name, new_array_type.get_length_field ());
-			/* add internal resize method */
-			new_array_type.scope.add (new_array_type.get_resize_method ().name, new_array_type.get_resize_method ());
-			/* add internal move method */
-			new_array_type.scope.add (new_array_type.get_move_method ().name, new_array_type.get_move_method ());
-
-			/* link the array type to the same source as the container type */
-			new_array_type.source_reference = this.source_reference;
-			
-			array_types[rank] = new_array_type;
-			
-			array_type = new_array_type;
-		}
-		
-		return array_type;
-	}
-
-	/**
 	 * Checks whether this data type is equal to or a subtype of the
 	 * specified data type.
 	 *



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