temp_ref_vars.clear ();
}
- public virtual void append_local_free (Symbol sym, bool stop_at_loop = false) {
+ public virtual void append_local_free (Symbol sym, bool stop_at_loop = false, CodeNode? stop_at = null) {
var b = (Block) sym;
var local_vars = b.get_local_variables ();
}
}
- if (sym.parent_symbol is Block) {
- append_local_free (sym.parent_symbol, stop_at_loop);
- } else if (sym.parent_symbol is Method) {
- append_param_free ((Method) sym.parent_symbol);
- }
- }
-
- public void append_error_free (Symbol sym, TryStatement current_try) {
- var b = (Block) sym;
-
- var local_vars = b.get_local_variables ();
- // free in reverse order
- for (int i = local_vars.size - 1; i >= 0; i--) {
- var local = local_vars[i];
- if (!local.unreachable && local.active && !local.floating && !local.captured && requires_destroy (local.variable_type)) {
- var ma = new MemberAccess.simple (local.name);
- ma.symbol_reference = local;
- ma.value_type = local.variable_type.copy ();
- visit_member_access (ma);
- ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
- }
- }
-
- if (b.captured) {
- int block_id = get_block_id (b);
-
- var data_unref = new CCodeFunctionCall (new CCodeIdentifier ("block%d_data_unref".printf (block_id)));
- data_unref.add_argument (get_variable_cexpression ("_data%d_".printf (block_id)));
- ccode.add_expression (data_unref);
- }
-
- if (sym == current_try.body) {
+ if (b.parent_node == stop_at) {
return;
}
if (sym.parent_symbol is Block) {
- append_error_free (sym.parent_symbol, current_try);
+ append_local_free (sym.parent_symbol, stop_at_loop, stop_at);
} else if (sym.parent_symbol is Method) {
append_param_free ((Method) sym.parent_symbol);
}
temp_ref_vars.clear ();
}
- public virtual void append_local_free (Symbol sym, bool stop_at_loop = false) {
+ public virtual void append_local_free (Symbol sym, bool stop_at_loop = false, CodeNode? stop_at = null) {
var b = (Block) sym;
var local_vars = b.get_local_variables ();
}
}
- if (sym.parent_symbol is Block) {
- append_local_free (sym.parent_symbol, stop_at_loop);
- } else if (sym.parent_symbol is Method) {
- append_param_free ((Method) sym.parent_symbol);
- }
- }
-
- public void append_error_free (Symbol sym, TryStatement current_try) {
- var b = (Block) sym;
-
- var local_vars = b.get_local_variables ();
- // free in reverse order
- for (int i = local_vars.size - 1; i >= 0; i--) {
- var local = local_vars[i];
- if (local.active && !local.floating && !local.captured && requires_destroy (local.variable_type)) {
- var ma = new MemberAccess.simple (local.name);
- ma.symbol_reference = local;
- ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
- }
- }
-
- if (b.captured) {
- int block_id = get_block_id (b);
-
- var data_unref = new CCodeFunctionCall (new CCodeIdentifier ("dova_object_unref"));
- data_unref.add_argument (get_variable_cexpression ("_data%d_".printf (block_id)));
- ccode.add_expression (data_unref);
- }
-
- if (sym == current_try.body) {
+ if (b.parent_node == stop_at) {
return;
}
if (sym.parent_symbol is Block) {
- append_error_free (sym.parent_symbol, current_try);
+ append_local_free (sym.parent_symbol, stop_at_loop, stop_at);
} else if (sym.parent_symbol is Method) {
append_param_free ((Method) sym.parent_symbol);
}
// surrounding try found
// free local variables
- append_error_free (current_symbol, current_try);
+ append_local_free (current_symbol, false, current_try);
var error_types = new ArrayList<DataType> ();
foreach (DataType node_error_type in node.get_error_types ()) {
ccode.close ();
}
- public override void append_local_free (Symbol sym, bool stop_at_loop = false) {
+ public override void append_local_free (Symbol sym, bool stop_at_loop = false, CodeNode? stop_at = null) {
var finally_block = (Block) null;
if (sym.parent_node is TryStatement) {
finally_block = (sym.parent_node as TryStatement).finally_body;
finally_block.emit (this);
}
- base.append_local_free (sym, stop_at_loop);
+ base.append_local_free (sym, stop_at_loop, stop_at);
}
}
// surrounding try found
// free local variables
- append_error_free (current_symbol, current_try);
+ append_local_free (current_symbol, false, current_try);
var error_types = new ArrayList<DataType> ();
foreach (DataType node_error_type in node.get_error_types ()) {
ccode.close ();
}
- public override void append_local_free (Symbol sym, bool stop_at_loop = false) {
- var finally_block = (Block) null;
- if (sym.parent_node is TryStatement) {
- finally_block = (sym.parent_node as TryStatement).finally_body;
- } else if (sym.parent_node is CatchClause) {
- finally_block = (sym.parent_node.parent_node as TryStatement).finally_body;
- }
+ public override void append_local_free (Symbol sym, bool stop_at_loop = false, CodeNode? stop_at = null) {
+ if (!(stop_at is TryStatement || stop_at is CatchClause)) {
+ var finally_block = (Block) null;
+ if (sym.parent_node is TryStatement) {
+ finally_block = (sym.parent_node as TryStatement).finally_body;
+ } else if (sym.parent_node is CatchClause) {
+ finally_block = (sym.parent_node.parent_node as TryStatement).finally_body;
+ }
- if (finally_block != null && finally_block != sym) {
- finally_block.emit (this);
+ if (finally_block != null && finally_block != sym) {
+ finally_block.emit (this);
+ }
}
- base.append_local_free (sym, stop_at_loop);
+ base.append_local_free (sym, stop_at_loop, stop_at);
}
}