vala r1010 - in trunk: . gobject vala



Author: juergbi
Date: Fri Feb 15 11:26:50 2008
New Revision: 1010
URL: http://svn.gnome.org/viewvc/vala?rev=1010&view=rev

Log:
2008-02-15  Juerg Billeter  <j bitron ch>

	* vala/valamethod.vala, vala/valasemanticanalyzer.vala,
	  gobject/valaccodegenerator.vala: fix memory management of
	  parameters with ownership transfer, fixes bug 511642


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodegenerator.vala
   trunk/vala/valamethod.vala
   trunk/vala/valasemanticanalyzer.vala

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Fri Feb 15 11:26:50 2008
@@ -873,6 +873,17 @@
 			}
 		}
 
+		if (b.parent_symbol is Method) {
+			var m = (Method) b.parent_symbol;
+			foreach (FormalParameter param in m.get_parameters ()) {
+				if (param.type_reference.data_type != null && param.type_reference.data_type.is_reference_type () && param.type_reference.takes_ownership) {
+					var ma = new MemberAccess.simple (param.name);
+					ma.symbol_reference = param;
+					cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.type_reference, ma)));
+				}
+			}
+		}
+
 		b.ccodenode = cblock;
 
 		current_symbol = current_symbol.parent_symbol;
@@ -1876,6 +1887,18 @@
 
 		if (sym.parent_symbol is Block) {
 			append_local_free (sym.parent_symbol, cfrag, stop_at_loop);
+		} else if (sym.parent_symbol is Method) {
+			append_param_free ((Method) sym.parent_symbol, cfrag);
+		}
+	}
+
+	private void append_param_free (Method m, CCodeFragment cfrag) {
+		foreach (FormalParameter param in m.get_parameters ()) {
+			if (param.type_reference.data_type != null && param.type_reference.data_type.is_reference_type () && param.type_reference.takes_ownership) {
+				var ma = new MemberAccess.simple (param.name);
+				ma.symbol_reference = param;
+				cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.type_reference, ma)));
+			}
 		}
 	}
 
@@ -1889,7 +1912,7 @@
 	}
 
 	private bool append_local_free_expr (Symbol sym, CCodeCommaExpression ccomma, bool stop_at_loop) {
-		var found = false;
+		bool found = false;
 	
 		var b = (Block) sym;
 
@@ -1905,11 +1928,28 @@
 		
 		if (sym.parent_symbol is Block) {
 			found = append_local_free_expr (sym.parent_symbol, ccomma, stop_at_loop) || found;
+		} else if (sym.parent_symbol is Method) {
+			found = append_param_free_expr ((Method) sym.parent_symbol, ccomma) || found;
 		}
 		
 		return found;
 	}
 
+	private bool append_param_free_expr (Method m, CCodeCommaExpression ccomma) {
+		bool found = false;
+
+		foreach (FormalParameter param in m.get_parameters ()) {
+			if (param.type_reference.data_type != null && param.type_reference.data_type.is_reference_type () && param.type_reference.takes_ownership) {
+				found = true;
+				var ma = new MemberAccess.simple (param.name);
+				ma.symbol_reference = param;
+				ccomma.append_expression (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.type_reference, ma));
+			}
+		}
+
+		return found;
+	}
+
 	private void create_local_free_expr (Expression expr) {
 		var return_expr_decl = get_temp_variable_declarator (expr.static_type, true, expr);
 		

Modified: trunk/vala/valamethod.vala
==============================================================================
--- trunk/vala/valamethod.vala	(original)
+++ trunk/vala/valamethod.vala	Fri Feb 15 11:26:50 2008
@@ -41,7 +41,15 @@
 		}
 	}
 	
-	public Block body { get; set; }
+	public Block body {
+		get { return _body; }
+		set {
+			_body = value;
+			if (_body != null) {
+				_body.owner = scope;
+			}
+		}
+	}
 
 	public BasicBlock entry_block { get; set; }
 
@@ -193,6 +201,7 @@
 	private Gee.List<Expression> preconditions = new ArrayList<Expression> ();
 	private Gee.List<Expression> postconditions = new ArrayList<Expression> ();
 	private DataType _return_type;
+	private Block _body;
 
 	/**
 	 * Creates a new method.

Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala	(original)
+++ trunk/vala/valasemanticanalyzer.vala	Fri Feb 15 11:26:50 2008
@@ -1284,7 +1284,9 @@
 			return type;
 		} else if (sym is FormalParameter) {
 			var p = (FormalParameter) sym;
-			return p.type_reference;
+			var type = p.type_reference.copy ();
+			type.transfers_ownership = false;
+			return type;
 		} else if (sym is DataType) {
 			return (DataType) sym;
 		} else if (sym is VariableDeclarator) {
@@ -1703,7 +1705,7 @@
 						Report.error (expr.source_reference, "Argument %d: Cannot convert from `%s' to `%s'".printf (i + 1, arg.static_type.to_string (), param.type_reference.to_string ()));
 						return false;
 					} else if (context.is_non_null_enabled ()) {
-						Report.warning (expr.source_reference, "Argument %d: Argument may not be null".printf (i + 1, arg.static_type.to_string (), param.type_reference.to_string ()));
+						Report.warning (expr.source_reference, "Argument %d: Argument may not be null".printf (i + 1));
 					}
 				} else {
 					// 0 => null, 1 => in, 2 => ref, 3 => out



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