]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Capture array size variable in closures as well
authorAdam Folmert <afolmert@gmail.com>
Fri, 5 Feb 2010 01:54:19 +0000 (02:54 +0100)
committerJürg Billeter <j@bitron.ch>
Mon, 22 Mar 2010 08:47:07 +0000 (09:47 +0100)
Fixes bug 599951.

codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala

index 72d169f322eb8c8d38ec4c61d5df609939596951..568e462e1721da51d6718c867da57a12ef8fa603 100644 (file)
@@ -363,7 +363,15 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule {
        public override CCodeExpression get_array_size_cexpression (Expression array_expr) {
                if (array_expr.symbol_reference is LocalVariable) {
                        var local = (LocalVariable) array_expr.symbol_reference;
-                       return get_variable_cexpression (get_array_size_cname (get_variable_cname (local.name)));
+                       if (local.captured) {
+                               // captured variables are stored on the heap
+                               var block = (Block) local.parent_symbol;
+                               return new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_size_cname (get_variable_cname (local.name)));
+                       } else {
+                               var size_expr = get_variable_cexpression (get_array_size_cname (get_variable_cname (local.name)));
+                               return size_expr;
+                       }
+
                } else if (array_expr.symbol_reference is Field) {
                        var field = (Field) array_expr.symbol_reference;
                        var ma = (MemberAccess) array_expr;
index 5c7153badb3d54cd2c4409b98ff51b128aa22b7c..8981e7850fac92406fae5c4170d35838224fda97 100644 (file)
@@ -1773,6 +1773,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                                        data.add_field ("gint", get_array_length_cname (get_variable_cname (local.name), dim));
                                                }
+                                               data.add_field ("gint", get_array_size_cname (get_variable_cname (local.name)));
                                        } else if (local.variable_type is DelegateType) {
                                                data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (local.name)));
                                                if (local.variable_type.value_owned) {