From: Luca Bruno Date: Wed, 23 Jun 2010 16:54:22 +0000 (+0200) Subject: Fix copying struct parameters for lambdas and async methods. X-Git-Tag: 0.9.3~106 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ef3442bce53351239c5b4a044af056cc4671420a;p=thirdparty%2Fvala.git Fix copying struct parameters for lambdas and async methods. Fixes bug 622422. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 41c6a59e5..031c5d2f9 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 508bac565..32679f063 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 31616581a..236e316ba 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 581686f62..a4367e126 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 000000000..da761d499 --- /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 () { +}