[vala] Fix copying struct parameters for lambdas and async methods.
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] Fix copying struct parameters for lambdas and async methods.
- Date: Wed, 23 Jun 2010 21:37:32 +0000 (UTC)
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]