]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix memory leaks when handling errors, patch by Philip Van Hoof, fixes bug
authorJürg Billeter <j@bitron.ch>
Thu, 1 Jan 2009 19:03:49 +0000 (19:03 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Thu, 1 Jan 2009 19:03:49 +0000 (19:03 +0000)
2009-01-01  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodebasemodule.vala:
* gobject/valagerrormodule.vala:

Fix memory leaks when handling errors, patch by Philip Van Hoof,
fixes bug 557856

svn path=/trunk/; revision=2251

ChangeLog
gobject/valaccodebasemodule.vala
gobject/valagerrormodule.vala

index 573068e15c5f006588f73706bccd91caf7aa74e9..2e2236b34fee1fc3c7ea7a5db41058c99230162f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-01-01  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodebasemodule.vala:
+       * gobject/valagerrormodule.vala:
+
+       Fix memory leaks when handling errors, patch by Philip Van Hoof,
+       fixes bug 557856
+
 2008-12-30  Jürg Billeter  <j@bitron.ch>
 
        * doc/valac.1:
index 0b4549b16673b3f87973d5d95f2587baa33c934c..c3378f7a331a1b097afffbc6b730b1900055887f 100644 (file)
@@ -2055,6 +2055,29 @@ public class Vala.CCodeBaseModule : CCodeModule {
                }
        }
 
+       public void append_error_free (Symbol sym, CCodeFragment cfrag, TryStatement current_try) {
+               var b = (Block) sym;
+
+               var local_vars = b.get_local_variables ();
+               foreach (LocalVariable local in local_vars) {
+                       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 (get_variable_cexpression (local.name), local.variable_type, ma)));
+                       }
+               }
+
+               if (sym == current_try.body) {
+                       return;
+               }
+
+               if (sym.parent_symbol is Block) {
+                       append_error_free (sym.parent_symbol, cfrag, current_try);
+               } else if (sym.parent_symbol is Method) {
+                       append_param_free ((Method) sym.parent_symbol, cfrag);
+               }
+       }
+
        private void append_param_free (Method m, CCodeFragment cfrag) {
                foreach (FormalParameter param in m.get_parameters ()) {
                        if (requires_destroy (param.parameter_type) && param.direction == ParameterDirection.IN) {
index c69b2da558ae2d80062b6405009baf8d62861e88..de527a998a30443425932281be72181e7ad2fbb7 100644 (file)
@@ -105,6 +105,12 @@ public class Vala.GErrorModule : CCodeDelegateModule {
                        // TODO might be the wrong one when using nested try statements
 
                        var cerror_block = new CCodeBlock ();
+
+                       // free local variables
+                       var free_frag = new CCodeFragment ();
+                       append_error_free (current_symbol, free_frag, current_try);
+                       cerror_block.add_statement (free_frag);
+
                        foreach (CatchClause clause in current_try.get_catch_clauses ()) {
                                // go to catch clause if error domain matches
                                var cgoto_stmt = new CCodeGotoStatement (clause.clabel_name);
@@ -157,6 +163,12 @@ public class Vala.GErrorModule : CCodeDelegateModule {
                        // unhandled error
 
                        var cerror_block = new CCodeBlock ();
+
+                       // free local variables
+                       var free_frag = new CCodeFragment ();
+                       append_local_free (current_symbol, free_frag, false);
+                       cerror_block.add_statement (free_frag);
+
                        // print critical message
                        cerror_block.add_statement (cprint_frag);