vala r1182 - in trunk: . gobject vala



Author: juergbi
Date: Mon Apr  7 21:29:36 2008
New Revision: 1182
URL: http://svn.gnome.org/viewvc/vala?rev=1182&view=rev

Log:
2008-04-07  Juerg Billeter  <j bitron ch>

	* vala/valacodenode.vala, gobject/valaccodegenerator.vala: improve
	  error reporting for non reference-counted object instances,
	  fixes bug 471053


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodegenerator.vala
   trunk/vala/valacodenode.vala

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Mon Apr  7 21:29:36 2008
@@ -1200,7 +1200,7 @@
 		}
 	}
 
-	private CCodeExpression get_dup_func_expression (DataType! type) {
+	private CCodeExpression get_dup_func_expression (DataType! type, SourceReference source_reference) {
 		if (type.data_type != null) {
 			string dup_function;
 			if (type.data_type.is_reference_counting ()) {
@@ -1209,7 +1209,7 @@
 				dup_function = type.data_type.get_dup_function ();
 			} else {
 				// duplicating non-reference counted structs may cause side-effects (and performance issues)
-				Report.error (type.source_reference, "duplicating %s instance, use weak variable or explicitly invoke copy method".printf (type.data_type.name));
+				Report.error (source_reference, "duplicating %s instance, use weak variable or explicitly invoke copy method".printf (type.data_type.name));
 				return null;
 			}
 
@@ -1218,11 +1218,11 @@
 			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 ()));
+			Report.error (source_reference, "internal error: duplicating %s instances not yet supported".printf (type.to_string ()));
 			return null;
 		} else if (type is PointerType) {
 			var pointer_type = (PointerType) type;
-			return get_dup_func_expression (pointer_type.base_type);
+			return get_dup_func_expression (pointer_type.base_type, source_reference);
 		} else {
 			return new CCodeConstant ("NULL");
 		}
@@ -2693,9 +2693,10 @@
 		 * if static type of expr is non-null
 		 */
 		 
-		var dupexpr = get_dup_func_expression (expr.static_type);
+		var dupexpr = get_dup_func_expression (expr.static_type, expr.source_reference);
 
-		if (null == dupexpr) {
+		if (dupexpr == null) {
+			expr.error = true;
 			return null;
 		}
 
@@ -2719,7 +2720,7 @@
 				}
 
 				// dup functions are optional for type parameters
-				var cdupisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, get_dup_func_expression (expr.static_type), new CCodeConstant ("NULL"));
+				var cdupisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, get_dup_func_expression (expr.static_type, expr.source_reference), new CCodeConstant ("NULL"));
 				cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.OR, cisnull, cdupisnull);
 			}
 
@@ -2851,7 +2852,7 @@
 				foreach (DataType type_arg in expr.type_reference.get_type_arguments ()) {
 					creation_call.add_argument (get_type_id_expression (type_arg));
 					if (type_arg.takes_ownership) {
-						var dup_func = get_dup_func_expression (type_arg);
+						var dup_func = get_dup_func_expression (type_arg, type_arg.source_reference);
 						if (dup_func == null) {
 							// type doesn't contain a copy function
 							expr.error = true;

Modified: trunk/vala/valacodenode.vala
==============================================================================
--- trunk/vala/valacodenode.vala	(original)
+++ trunk/vala/valacodenode.vala	Mon Apr  7 21:29:36 2008
@@ -53,7 +53,7 @@
 			return _ccodenode;
 		}
 		set {
-			if (source_reference != null) {
+			if (value != null && source_reference != null) {
 				value.line = new CCodeLineDirective (
 					Path.get_basename (source_reference.file.filename),
 					source_reference.first_line);



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