vala r1010 - in trunk: . gobject vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1010 - in trunk: . gobject vala
- Date: Fri, 15 Feb 2008 11:26:51 +0000 (GMT)
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]