From: Jürg Billeter Date: Wed, 10 Feb 2010 09:55:34 +0000 (+0100) Subject: Fix closures in constructors X-Git-Tag: 0.8.0~286 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2d5245bed59457118e3b3ece8cc5adef2313fd48;p=thirdparty%2Fvala.git Fix closures in constructors Fixes bug 602138. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 837481250..101149dd7 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 f42117ee0..5c88ef95a 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);