]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix fields initialized by functions returning an array
authorJürg Billeter <j@bitron.ch>
Sat, 20 Oct 2012 07:50:54 +0000 (09:50 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 11 Nov 2012 13:01:59 +0000 (14:01 +0100)
Fixes bug 686336.

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/basic-types/bug686336.vala [new file with mode: 0644]

index 8b2a3594071c553f29c7ef1f24627096f7213921..62d1d8a0ab6605e53a4ce95dc6d7495030273890 100644 (file)
@@ -1088,16 +1088,26 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
                                ccode.add_assignment (lhs, rhs);
 
-                               if (f.variable_type is ArrayType && get_ccode_array_length (f) &&
-                                   f.initializer is ArrayCreationExpression) {
+                               if (f.variable_type is ArrayType && get_ccode_array_length (f)) {
                                        var array_type = (ArrayType) f.variable_type;
                                        var field_value = get_field_cvalue (f, load_this_parameter ((TypeSymbol) f.parent_symbol));
 
-                                       List<Expression> sizes = ((ArrayCreationExpression) f.initializer).get_sizes ();
-                                       for (int dim = 1; dim <= array_type.rank; dim++) {
-                                               var array_len_lhs = get_array_length_cvalue (field_value, dim);
-                                               var size = sizes[dim - 1];
-                                               ccode.add_assignment (array_len_lhs, get_cvalue (size));
+                                       var glib_value = (GLibValue) f.initializer.target_value;
+                                       if (glib_value.array_length_cvalues != null) {
+                                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                       var array_len_lhs = get_array_length_cvalue (field_value, dim);
+                                                       ccode.add_assignment (array_len_lhs, get_array_length_cvalue (glib_value, dim));
+                                               }
+                                       } else if (glib_value.array_null_terminated) {
+                                               requires_array_length = true;
+                                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+                                               len_call.add_argument (get_cvalue_ (glib_value));
+
+                                               ccode.add_assignment (get_array_length_cvalue (field_value, 1), len_call);
+                                       } else {
+                                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                       ccode.add_assignment (get_array_length_cvalue (field_value, dim), new CCodeConstant ("-1"));
+                                               }
                                        }
 
                                        if (array_type.rank == 1 && f.is_internal_symbol ()) {
@@ -1267,16 +1277,26 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                                ccode.add_assignment (lhs, rhs);
                                                        }
 
-                                                       if (f.variable_type is ArrayType && get_ccode_array_length (f) &&
-                                                           f.initializer is ArrayCreationExpression) {
+                                                       if (f.variable_type is ArrayType && get_ccode_array_length (f)) {
                                                                var array_type = (ArrayType) f.variable_type;
                                                                var field_value = get_field_cvalue (f, null);
 
-                                                               List<Expression> sizes = ((ArrayCreationExpression) f.initializer).get_sizes ();
-                                                               for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                                       var array_len_lhs = get_array_length_cvalue (field_value, dim);
-                                                                       var size = sizes[dim - 1];
-                                                                       ccode.add_assignment (array_len_lhs, get_cvalue (size));
+                                                               var glib_value = (GLibValue) f.initializer.target_value;
+                                                               if (glib_value.array_length_cvalues != null) {
+                                                                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                                               var array_len_lhs = get_array_length_cvalue (field_value, dim);
+                                                                               ccode.add_assignment (array_len_lhs, get_array_length_cvalue (glib_value, dim));
+                                                                       }
+                                                               } else if (glib_value.array_null_terminated) {
+                                                                       requires_array_length = true;
+                                                                       var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+                                                                       len_call.add_argument (get_cvalue_ (glib_value));
+
+                                                                       ccode.add_assignment (get_array_length_cvalue (field_value, 1), len_call);
+                                                               } else {
+                                                                       for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                                               ccode.add_assignment (get_array_length_cvalue (field_value, dim), new CCodeConstant ("-1"));
+                                                                       }
                                                                }
                                                        }
                                                } else {
index c1a8296fdcdcd9508e6b1a3ab11e37e32f269a01..13457eb45c5a3574c8a388644ab0ff4d0db54b52 100644 (file)
@@ -32,6 +32,7 @@ TESTS = \
        basic-types/bug652380.vala \
        basic-types/bug655908.vala \
        basic-types/bug659975.vala \
+       basic-types/bug686336.vala \
        namespaces.vala \
        methods/lambda.vala \
        methods/closures.vala \
diff --git a/tests/basic-types/bug686336.vala b/tests/basic-types/bug686336.vala
new file mode 100644 (file)
index 0000000..3aceef8
--- /dev/null
@@ -0,0 +1,25 @@
+class Foo {
+       static int[] static_bar = { 1, 2, 3 };
+       static int[] static_baz = create_array ();
+
+       int[] bar = { 1, 2, 3 };
+       int[] baz = create_array ();
+
+       static int[] create_array () {
+               return { 1, 2, 3 };
+       }
+
+       public void test () {
+               assert (static_bar.length == 3);
+               assert (static_baz.length == 3);
+
+               assert (bar.length == 3);
+               assert (baz.length == 3);
+       }
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.test ();
+}
+