]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix lambda expressions in property accessors
authorJürg Billeter <j@bitron.ch>
Mon, 3 Aug 2009 14:11:53 +0000 (16:11 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 3 Aug 2009 14:12:17 +0000 (16:12 +0200)
Fixes bug 590626.

codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valaccodemethodcallmodule.vala

index 0f0a0c2206e59bd56e5144d7b4bb8e01046f139a..21506b19130ca72681eaa01ec085110e5d12ee4a 100644 (file)
@@ -4146,6 +4146,15 @@ internal class Vala.CCodeBaseModule : CCodeModule {
        public virtual bool is_gobject_property (Property prop) {
                return false;
        }
+
+       public DataType? get_this_type () {
+               if (current_method != null && current_method.binding == MemberBinding.INSTANCE) {
+                       return current_method.this_parameter.parameter_type;
+               } else if (current_property_accessor != null && current_property_accessor.prop.binding == MemberBinding.INSTANCE) {
+                       return current_property_accessor.prop.this_parameter.parameter_type;
+               }
+               return null;
+       }
 }
 
 // vim:sw=8 noet
index c45750a147059f8c221971a2a3eaab06cc4df15e..2293047905c7d5d658b468be1a3d88b2cb310e62 100644 (file)
@@ -140,7 +140,7 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                        var invocation_expr = (MethodCall) delegate_expr;
                        return invocation_expr.delegate_target;
                } else if (delegate_expr is LambdaExpression) {
-                       if ((current_method != null && current_method.binding == MemberBinding.INSTANCE) || in_constructor) {
+                       if (get_this_type () != null || in_constructor) {
                                return new CCodeIdentifier ("self");
                        } else {
                                return new CCodeConstant ("NULL");
index 61d1ed811fff45da3ade19003f596c838cf0dd3f..de385216efa0e1b7271afdea4d448fe91b091454 100644 (file)
@@ -310,13 +310,13 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                                var delegate_method = arg.symbol_reference as Method;
                                                                var lambda = arg as LambdaExpression;
                                                                var arg_ma = arg as MemberAccess;
-                                                               if (lambda != null && current_method != null && current_method.binding == MemberBinding.INSTANCE) {
+                                                               if (lambda != null && get_this_type () != null) {
                                                                        // 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));
+                                                                       var ref_call = new CCodeFunctionCall (get_dup_func_expression (get_this_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);
+                                                                       delegate_target_destroy_notify = get_destroy_func_expression (get_this_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 ()) {