+2008-11-30 Jürg Billeter <j@bitron.ch>
+
+ * vala/valalocalvariable.vala:
+ * vala/valamethodcall.vala:
+ * vala/valasemanticanalyzer.vala:
+ * gobject/valaccodebasemodule.vala:
+
+ Avoid object duplication due to error handling
+
2008-11-30 Jürg Billeter <j@bitron.ch>
* vala/valamethodcall.vala:
}
foreach (LocalVariable local in local_vars) {
- if (requires_destroy (local.variable_type)) {
+ if (!local.floating && requires_destroy (local.variable_type)) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma)));
var local_vars = b.get_local_variables ();
foreach (LocalVariable local in local_vars) {
- if (local.active && requires_destroy (local.variable_type)) {
+ if (local.active && !local.floating && requires_destroy (local.variable_type)) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma)));
var local_vars = b.get_local_variables ();
foreach (LocalVariable local in local_vars) {
- if (local.active && requires_destroy (local.variable_type)) {
+ if (local.active && !local.floating && requires_destroy (local.variable_type)) {
found = true;
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
}
}
+ /**
+ * Floating variables may only be accessed exactly once.
+ */
+ public bool floating { get; set; }
+
private Expression? _initializer;
private DataType? _variable_type;
var old_parent_node = parent_node;
var local = new LocalVariable (value_type, get_temp_name (), null, source_reference);
+ // use floating variable to avoid unnecessary (and sometimes impossible) copies
+ local.floating = true;
var decl = new DeclarationStatement (local, source_reference);
insert_statement (analyzer.insert_block, decl);
- var temp_access = new MemberAccess.simple (local.name, source_reference);
+ Expression temp_access = new MemberAccess.simple (local.name, source_reference);
temp_access.target_type = target_type;
// don't set initializer earlier as this changes parent_node and parent_statement
} else if (sym is LocalVariable) {
var local = (LocalVariable) sym;
var type = local.variable_type.copy ();
- if (!lvalue) {
+ if (!lvalue && !local.floating) {
type.value_owned = false;
}
return type;