[vala] Fix closures in constructors



commit 2d5245bed59457118e3b3ece8cc5adef2313fd48
Author: Jürg Billeter <j bitron ch>
Date:   Wed Feb 10 10:55:34 2010 +0100

    Fix closures in constructors
    
    Fixes bug 602138.

 codegen/valaccodebasemodule.vala       |    3 ++-
 codegen/valaccodemethodcallmodule.vala |    8 ++++++++
 2 files changed, 10 insertions(+), 1 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 8374812..101149d 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1800,7 +1800,8 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 				ref_call.add_argument (get_variable_cexpression ("_data%d_".printf (parent_block_id)));
 
 				cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), "_data%d_".printf (parent_block_id)), ref_call)));
-			} else if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE)) {
+			} else if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE &&
+			                              (!(current_method is CreationMethod) || current_method.body != b))) {
 				var ref_call = new CCodeFunctionCall (get_dup_func_expression (new ObjectType (current_class), b.source_reference));
 				ref_call.add_argument (get_result_cexpression ("self"));
 
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index f42117e..5c88ef9 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -265,6 +265,14 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 		} else if (m is CreationMethod && context.profile == Profile.GOBJECT && m.parent_symbol is Class) {
 			ccall_expr = new CCodeAssignment (new CCodeIdentifier ("self"), new CCodeCastExpression (ccall, current_class.get_cname () + "*"));
 
+			if (current_method.body.captured) {
+				// capture self after setting it
+				var ref_call = new CCodeFunctionCall (get_dup_func_expression (new ObjectType (current_class), expr.source_reference));
+				ref_call.add_argument (ccall_expr);
+
+				ccall_expr = new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (current_method.body))), "self"), ref_call);
+			}
+
 			if (!current_class.is_compact && current_class.get_type_parameters ().size > 0) {
 				var ccomma = new CCodeCommaExpression ();
 				ccomma.append_expression (ccall_expr);



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