[vala] codegen: Fix returning inline allocated arrays



commit 2b6a4aa1ae86089b1cde2fa31cd04b690879d953
Author: Luca Bruno <lucabru src gnome org>
Date:   Tue Jul 5 10:09:12 2011 +0200

    codegen: Fix returning inline allocated arrays
    
    Fixes bug 653908.

 codegen/valaccodebasemodule.vala         |    2 +-
 codegen/valaccodememberaccessmodule.vala |    3 ++-
 tests/Makefile.am                        |    1 +
 tests/methods/bug653908.vala             |   10 ++++++++++
 4 files changed, 14 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 39adeb4..1fd8eeb 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -3216,7 +3216,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 		// return array length if appropriate
 		if (((current_method != null && !current_method.no_array_length) || current_property_accessor != null) && current_return_type is ArrayType) {
-			var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt, false);
+			var return_expr_decl = get_temp_variable (current_return_type, true, stmt, false);
 
 			ccode.add_assignment (get_variable_cexpression (return_expr_decl.name), get_cvalue (stmt.return_expression));
 
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index e3f7f29..169de4f 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -317,7 +317,8 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 			    current_return_type.value_owned &&
 			    local.variable_type.value_owned &&
 			    !local.captured &&
-			    !variable_accessible_in_finally (local)) {
+			    !variable_accessible_in_finally (local) &&
+			    !(local.variable_type is ArrayType && ((ArrayType) local.variable_type).inline_allocated)) {
 				/* return expression is local variable taking ownership and
 				 * current method is transferring ownership */
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 309c72c..b9beaae 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -42,6 +42,7 @@ TESTS = \
 	methods/bug646345.vala \
 	methods/bug648320.vala \
 	methods/bug653391.vala \
+	methods/bug653908.vala \
 	control-flow/break.vala \
 	control-flow/expressions-conditional.vala \
 	control-flow/for.vala \
diff --git a/tests/methods/bug653908.vala b/tests/methods/bug653908.vala
new file mode 100644
index 0000000..7eda5bd
--- /dev/null
+++ b/tests/methods/bug653908.vala
@@ -0,0 +1,10 @@
+int[] foo() {
+	int bar[8];
+	bar[7] = 42;
+	return bar;
+}
+
+void main () {
+	var bar = foo ();
+	assert (bar[7] == 42);
+}



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