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 <[EMAIL PROTECTED]>
* 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
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list
Want to limit the commits to a few modules? Go to above URL, log in to edit
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development
mailing list. Email [EMAIL PROTECTED] if interested.