From: Jürg Billeter Date: Mon, 3 Aug 2009 14:11:53 +0000 (+0200) Subject: Fix lambda expressions in property accessors X-Git-Tag: 0.7.6~219 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=909476c1d9ee2cef1a3457d8e4410ecb2f44fe3b;p=thirdparty%2Fvala.git Fix lambda expressions in property accessors Fixes bug 590626. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 0f0a0c220..21506b191 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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 diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala index c45750a14..229304790 100644 --- a/codegen/valaccodedelegatemodule.vala +++ b/codegen/valaccodedelegatemodule.vala @@ -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"); diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 61d1ed811..de385216e 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -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 ()) {