[vala] Fix copying struct parameters for lambdas and async methods.



commit ef3442bce53351239c5b4a044af056cc4671420a
Author: Luca Bruno <lethalman88 gmail com>
Date:   Wed Jun 23 18:54:22 2010 +0200

    Fix copying struct parameters for lambdas and async methods.
    
    Fixes bug 622422.

 codegen/valaccodebasemodule.vala  |    3 +++
 codegen/valagasyncmodule.vala     |    5 +++--
 tests/Makefile.am                 |    1 +
 tests/asynchronous/bug613484.vala |    4 ++--
 tests/structs/bug622422.vala      |   15 +++++++++++++++
 5 files changed, 24 insertions(+), 4 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 41c6a59..031c5d2 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1637,6 +1637,9 @@ public class Vala.CCodeBaseModule : CCodeModule {
 
 		// create copy if necessary as captured variables may need to be kept alive
 		CCodeExpression cparam = get_variable_cexpression (param.name);
+		if (param.parameter_type.is_real_non_null_struct_type ()) {
+			cparam = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, cparam);
+		}
 		if (requires_copy (param_type) && !param.parameter_type.value_owned && !is_unowned_delegate)  {
 			var ma = new MemberAccess.simple (param.name);
 			ma.symbol_reference = param;
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index 508bac5..32679f0 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -230,12 +230,13 @@ public class Vala.GAsyncModule : GSignalModule {
 
 				// create copy if necessary as variables in async methods may need to be kept alive
 				CCodeExpression cparam = get_variable_cexpression (param.name);
+				if (param.parameter_type.is_real_non_null_struct_type ()) {
+					cparam = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, cparam);
+				}
 				if (requires_copy (param_type) && !param.parameter_type.value_owned)  {
 					var ma = new MemberAccess.simple (param.name);
 					ma.symbol_reference = param;
 					cparam = get_ref_cexpression (param.parameter_type, cparam, ma, param);
-				} else if (param.parameter_type.is_real_non_null_struct_type ()) {
-					cparam = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, cparam);
 				}
 
 				asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_variable_cname (param.name)), cparam)));
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3161658..236e316 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -47,6 +47,7 @@ TESTS = \
 	structs/bug606202.vala \
 	structs/bug613513.vala \
 	structs/bug613825.vala \
+	structs/bug622422.vala \
 	delegates/delegates.vala \
 	delegates/bug595610.vala \
 	delegates/bug595639.vala \
diff --git a/tests/asynchronous/bug613484.vala b/tests/asynchronous/bug613484.vala
index 581686f..a4367e1 100644
--- a/tests/asynchronous/bug613484.vala
+++ b/tests/asynchronous/bug613484.vala
@@ -2,10 +2,10 @@ struct Foo {
 	int i;
 }
 
-void do_foo (Foo foo) {
+void do_foo (Foo foo, Value value) {
 }
 
-async void do_foo_async (Foo foo) {
+async void do_foo_async (Foo foo, Value value) {
 }
 
 void main () {
diff --git a/tests/structs/bug622422.vala b/tests/structs/bug622422.vala
new file mode 100644
index 0000000..da761d4
--- /dev/null
+++ b/tests/structs/bug622422.vala
@@ -0,0 +1,15 @@
+struct Foo {
+	int i;
+}
+
+delegate void TestDelegate ();
+
+void do_foo (TestDelegate d) {
+}
+
+void do_foo_lambda (Foo foo, Value value) {
+	do_foo (() => { foo.i = 1; value = (int) 2; });
+}
+
+void main () {
+}



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