[vala] codegen: Merge append_local_free and append_error_free



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]