]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Merge append_local_free and append_error_free
authorJürg Billeter <j@bitron.ch>
Thu, 13 Jan 2011 12:42:41 +0000 (13:42 +0100)
committerJürg Billeter <j@bitron.ch>
Thu, 13 Jan 2011 13:06:58 +0000 (14:06 +0100)
codegen/valaccodebasemodule.vala
codegen/valadovabasemodule.vala
codegen/valadovaerrormodule.vala
codegen/valagerrormodule.vala

index 48d89ebcc320ff71b6ea325ba2d83301c932fb22..c13a541af0e8f35814a3eb20b6ec9e34f4348de0 100644 (file)
@@ -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);
                }
index 8443c400fae362dc3303964c9df8ba5ddd0450e4..44a22ab8bbff61a9d55c6689d51a43f7e60bd327 100644 (file)
@@ -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);
                }
index f4d9d37e6ab631c8eef0a7445433ac66eb07e0a9..6813ca777888e78e4c75d258bee6d1d94af9c9d0 100644 (file)
@@ -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);
        }
 }
 
index 3ccc68f3425be8551ca9644aace3df5455bef06a..10352f7f3c2580a36bd4b14c927ae8c7f8a5a2a9 100644 (file)
@@ -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);
        }
 }