[vala] codegen: Fix fields initialized by functions returning an array



commit aef2d1d71d9d81b0775896258426a83cc12c4441
Author: JÃrg Billeter <j bitron ch>
Date:   Sat Oct 20 09:50:54 2012 +0200

    codegen: Fix fields initialized by functions returning an array
    
    Fixes bug 686336.

 codegen/valaccodebasemodule.vala |   48 ++++++++++++++++++++++++++-----------
 tests/Makefile.am                |    1 +
 tests/basic-types/bug686336.vala |   25 +++++++++++++++++++
 3 files changed, 60 insertions(+), 14 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 8b2a359..62d1d8a 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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 {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c1a8296..13457eb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 0000000..3aceef8
--- /dev/null
+++ b/tests/basic-types/bug686336.vala
@@ -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 ();
+}
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]