]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Reverse free order for local variables
authorJürg Billeter <j@bitron.ch>
Thu, 8 Jul 2010 10:45:12 +0000 (12:45 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 8 Jul 2010 10:45:12 +0000 (12:45 +0200)
Last created should be destroyed first.

codegen/valaccodebasemodule.vala
codegen/valadovabasemodule.vala

index 4e540571a307b225fbebbe28325a2f9698a73e65..b06df434a90852952e8dadcf6316c2f740c583f7 100644 (file)
@@ -1742,7 +1742,12 @@ public class Vala.CCodeBaseModule : CCodeModule {
                                                        data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
                                                }
                                        }
-
+                               }
+                       }
+                       // free in reverse order
+                       for (int i = local_vars.size - 1; i >= 0; i--) {
+                               var local = local_vars[i];
+                               if (local.captured) {
                                        if (requires_destroy (local.variable_type)) {
                                                bool old_coroutine = false;
                                                if (current_method != null) {
@@ -1878,7 +1883,9 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        }
                }
 
-               foreach (LocalVariable local in local_vars) {
+               // free in reverse order
+               for (int i = local_vars.size - 1; i >= 0; i--) {
+                       var local = local_vars[i];
                        if (!local.unreachable && !local.floating && !local.captured && requires_destroy (local.variable_type)) {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
@@ -3125,7 +3132,9 @@ public class Vala.CCodeBaseModule : CCodeModule {
                var b = (Block) sym;
 
                var local_vars = b.get_local_variables ();
-               foreach (LocalVariable local in local_vars) {
+               // 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;
@@ -3161,7 +3170,9 @@ public class Vala.CCodeBaseModule : CCodeModule {
                var b = (Block) sym;
 
                var local_vars = b.get_local_variables ();
-               foreach (LocalVariable local in local_vars) {
+               // 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;
index 4e3662f46794b069f66fcf16d73e8ff7f1baf846..c742d95cd7a8b3a689be016adf583dc9f2bef212 100644 (file)
@@ -753,7 +753,12 @@ internal class Vala.DovaBaseModule : CCodeModule {
                                        generate_type_declaration (local.variable_type, source_declarations);
 
                                        data.add_field (local.variable_type.get_cname (), get_variable_cname (local.name) + local.variable_type.get_cdeclarator_suffix ());
-
+                               }
+                       }
+                       // free in reverse order
+                       for (int i = local_vars.size - 1; i >= 0; i--) {
+                               var local = local_vars[i];
+                               if (local.captured) {
                                        if (requires_destroy (local.variable_type)) {
                                                var ma = new MemberAccess.simple (local.name);
                                                ma.symbol_reference = local;
@@ -881,7 +886,9 @@ internal class Vala.DovaBaseModule : CCodeModule {
                        }
                }
 
-               foreach (LocalVariable local in local_vars) {
+               // free in reverse order
+               for (int i = local_vars.size - 1; i >= 0; i--) {
+                       var local = local_vars[i];
                        if (!local.floating && !local.captured && requires_destroy (local.variable_type)) {
                                var ma = new MemberAccess.simple (local.name);
                                ma.symbol_reference = local;
@@ -1386,7 +1393,9 @@ internal class Vala.DovaBaseModule : CCodeModule {
                var b = (Block) sym;
 
                var local_vars = b.get_local_variables ();
-               foreach (LocalVariable local in local_vars) {
+               // 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;
@@ -1421,7 +1430,9 @@ internal class Vala.DovaBaseModule : CCodeModule {
                var b = (Block) sym;
 
                var local_vars = b.get_local_variables ();
-               foreach (LocalVariable local in local_vars) {
+               // 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;