]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix crash when using lambda expressions with owned delegate parameters,
authorJürg Billeter <j@bitron.ch>
Sat, 17 Jan 2009 22:59:16 +0000 (22:59 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 17 Jan 2009 22:59:16 +0000 (22:59 +0000)
2009-01-17  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodemethodcallmodule.vala:

Fix crash when using lambda expressions with owned delegate
parameters, fixes bug 566344

svn path=/trunk/; revision=2382

ChangeLog
gobject/valaccodemethodcallmodule.vala

index 89b53f262e8c954b5702805c7cc5dea5acac3266..306b6c05c811e8ece76d21349cee231b30a998ba 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-01-17  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodemethodcallmodule.vala:
+
+       Fix crash when using lambda expressions with owned delegate
+       parameters, fixes bug 566344
+
 2009-01-17  Jürg Billeter  <j@bitron.ch>
 
        * vala/valaenumvalue.vala:
index 2f101551314f67cbda965f6fad3977e69ae28078..c97cea24f7e074b278b6b690b0e482c607cde21f 100644 (file)
@@ -237,10 +237,18 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                        if (deleg_type.value_owned) {
                                                                CCodeExpression delegate_target_destroy_notify;
                                                                var delegate_method = arg.symbol_reference as Method;
+                                                               var lambda = arg as LambdaExpression;
                                                                var arg_ma = arg as MemberAccess;
-                                                               if (delegate_method != null && delegate_method.binding == MemberBinding.INSTANCE
-                                                                   && arg_ma.inner != null && arg_ma.inner.value_type.data_type != null
-                                                                   && arg_ma.inner.value_type.data_type.is_reference_counting ()) {
+                                                               if (lambda != null && current_method != null && current_method.binding == MemberBinding.INSTANCE) {
+                                                                       // type of delegate target is same as `this'
+                                                                       // for lambda expressions in instance methods
+                                                                       var ref_call = new CCodeFunctionCall (get_dup_func_expression (current_method.this_parameter.parameter_type, arg.source_reference));
+                                                                       ref_call.add_argument (delegate_target);
+                                                                       delegate_target = ref_call;
+                                                                       delegate_target_destroy_notify = get_destroy_func_expression (current_method.this_parameter.parameter_type);
+                                                               } else if (delegate_method != null && delegate_method.binding == MemberBinding.INSTANCE
+                                                                          && arg_ma != null && arg_ma.inner != null && arg_ma.inner.value_type.data_type != null
+                                                                          && arg_ma.inner.value_type.data_type.is_reference_counting ()) {
                                                                        var ref_call = new CCodeFunctionCall (get_dup_func_expression (arg_ma.inner.value_type, arg.source_reference));
                                                                        ref_call.add_argument (delegate_target);
                                                                        delegate_target = ref_call;