]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix closures in constructors
authorJürg Billeter <j@bitron.ch>
Wed, 10 Feb 2010 09:55:34 +0000 (10:55 +0100)
committerJürg Billeter <j@bitron.ch>
Wed, 10 Feb 2010 14:40:03 +0000 (15:40 +0100)
Fixes bug 602138.

codegen/valaccodebasemodule.vala
codegen/valaccodemethodcallmodule.vala

index 837481250cd97d712e2f0534bc4a0b7c5eced2e3..101149dd79ae5db5189c964a9db9984ad39df1c9 100644 (file)
@@ -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"));
 
index f42117ee0d291c430da38ff19a8f5cfdbba68e53..5c88ef95a6cf03d56b572bc526f9211a80116519 100644 (file)
@@ -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);