[vala] codegen: Merge append_local_free and append_error_free
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Merge append_local_free and append_error_free
- Date: Thu, 13 Jan 2011 14:43:00 +0000 (UTC)
commit 09de9d42b75872e52782090200067c5f5bb10cfe
Author: Jürg Billeter <j bitron ch>
Date: Thu Jan 13 13:42:41 2011 +0100
codegen: Merge append_local_free and append_error_free
codegen/valaccodebasemodule.vala | 37 +++----------------------------------
codegen/valadovabasemodule.vala | 35 +++--------------------------------
codegen/valadovaerrormodule.vala | 6 +++---
codegen/valagerrormodule.vala | 24 +++++++++++++-----------
4 files changed, 22 insertions(+), 80 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 48d89eb..c13a541 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -3188,7 +3188,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
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 ();
@@ -3220,43 +3220,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
}
- 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);
}
diff --git a/codegen/valadovabasemodule.vala b/codegen/valadovabasemodule.vala
index 8443c40..44a22ab 100644
--- a/codegen/valadovabasemodule.vala
+++ b/codegen/valadovabasemodule.vala
@@ -1220,7 +1220,7 @@ public abstract class Vala.DovaBaseModule : CodeGenerator {
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 ();
@@ -1250,41 +1250,12 @@ public abstract class Vala.DovaBaseModule : CodeGenerator {
}
}
- 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);
}
diff --git a/codegen/valadovaerrormodule.vala b/codegen/valadovaerrormodule.vala
index f4d9d37..6813ca7 100644
--- a/codegen/valadovaerrormodule.vala
+++ b/codegen/valadovaerrormodule.vala
@@ -92,7 +92,7 @@ public class Vala.DovaErrorModule : DovaDelegateModule {
// 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 ()) {
@@ -258,7 +258,7 @@ public class Vala.DovaErrorModule : DovaDelegateModule {
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;
@@ -270,7 +270,7 @@ public class Vala.DovaErrorModule : DovaDelegateModule {
finally_block.emit (this);
}
- base.append_local_free (sym, stop_at_loop);
+ base.append_local_free (sym, stop_at_loop, stop_at);
}
}
diff --git a/codegen/valagerrormodule.vala b/codegen/valagerrormodule.vala
index 3ccc68f..10352f7 100644
--- a/codegen/valagerrormodule.vala
+++ b/codegen/valagerrormodule.vala
@@ -179,7 +179,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
// 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 ()) {
@@ -365,19 +365,21 @@ public class Vala.GErrorModule : CCodeDelegateModule {
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);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]