[vala] Fix lambda expressions in property accessors



commit 909476c1d9ee2cef1a3457d8e4410ecb2f44fe3b
Author: Jürg Billeter <j bitron ch>
Date:   Mon Aug 3 16:11:53 2009 +0200

    Fix lambda expressions in property accessors
    
    Fixes bug 590626.

 codegen/valaccodebasemodule.vala       |    9 +++++++++
 codegen/valaccodedelegatemodule.vala   |    2 +-
 codegen/valaccodemethodcallmodule.vala |    6 +++---
 3 files changed, 13 insertions(+), 4 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 0f0a0c2..21506b1 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 c45750a..2293047 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 61d1ed8..de38521 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 ()) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]