]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use set_delegate_target for lambda expressions
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 15:52:55 +0000 (17:52 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 16:12:17 +0000 (18:12 +0200)
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala

index 9e41f31367f959bc505190155e4ac857046903f7..83123505a44f70519772746fd17029eafe6cff4d 100644 (file)
@@ -4878,14 +4878,48 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                }
        }
 
-       public override void visit_lambda_expression (LambdaExpression l) {
+       public override void visit_lambda_expression (LambdaExpression lambda) {
                // use instance position from delegate
-               var dt = (DelegateType) l.target_type;
-               l.method.cinstance_parameter_position = dt.delegate_symbol.cinstance_parameter_position;
-
-               l.accept_children (this);
-
-               set_cvalue (l, new CCodeIdentifier (l.method.get_cname ()));
+               var dt = (DelegateType) lambda.target_type;
+               lambda.method.cinstance_parameter_position = dt.delegate_symbol.cinstance_parameter_position;
+
+               lambda.accept_children (this);
+
+               bool expr_owned = lambda.value_type.value_owned;
+
+               set_cvalue (lambda, new CCodeIdentifier (lambda.method.get_cname ()));
+
+               var delegate_type = (DelegateType) lambda.target_type;
+               if (lambda.method.closure) {
+                       int block_id = get_block_id (current_closure_block);
+                       var delegate_target = get_variable_cexpression ("_data%d_".printf (block_id));
+                       if (expr_owned || delegate_type.is_called_once) {
+                               var ref_call = new CCodeFunctionCall (new CCodeIdentifier ("block%d_data_ref".printf (block_id)));
+                               ref_call.add_argument (delegate_target);
+                               delegate_target = ref_call;
+                               set_delegate_target_destroy_notify (lambda, new CCodeIdentifier ("block%d_data_unref".printf (block_id)));
+                       }
+                       set_delegate_target (lambda, delegate_target);
+               } else if (get_this_type () != null || in_constructor) {
+                       CCodeExpression delegate_target = get_result_cexpression ("self");
+                       if (expr_owned || delegate_type.is_called_once) {
+                               if (get_this_type () != null) {
+                                       var ref_call = new CCodeFunctionCall (get_dup_func_expression (get_this_type (), lambda.source_reference));
+                                       ref_call.add_argument (delegate_target);
+                                       delegate_target = ref_call;
+                                       set_delegate_target_destroy_notify (lambda, get_destroy_func_expression (get_this_type ()));
+                               } else {
+                                       // in constructor
+                                       var ref_call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_ref"));
+                                       ref_call.add_argument (delegate_target);
+                                       delegate_target = ref_call;
+                                       set_delegate_target_destroy_notify (lambda, new CCodeIdentifier ("g_object_unref"));
+                               }
+                       }
+                       set_delegate_target (lambda, delegate_target);
+               } else {
+                       set_delegate_target (lambda, new CCodeConstant ("NULL"));
+               }
        }
 
        public CCodeExpression convert_from_generic_pointer (CCodeExpression cexpr, DataType actual_type) {
index 5fab0a1b9f063d0306b2f715d51f7d5ea0aa0da3..3f5eb4114708c462ad9e70ec6cd4a499b30d4f2c 100644 (file)
@@ -148,45 +148,11 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                        delegate_expr = reftransfer_expr.inner;
                }
                
-               if (delegate_expr is MethodCall) {
-                       var invocation_expr = (MethodCall) delegate_expr;
-                       if (get_delegate_target_destroy_notify (invocation_expr) != null) {
-                               delegate_target_destroy_notify = get_delegate_target_destroy_notify (invocation_expr);
-                       }
-                       return get_delegate_target (invocation_expr);
-               } else if (delegate_expr is LambdaExpression) {
-                       var lambda = (LambdaExpression) delegate_expr;
-                       var delegate_type = (DelegateType) delegate_expr.target_type;
-                       if (lambda.method.closure) {
-                               int block_id = get_block_id (current_closure_block);
-                               var delegate_target = get_variable_cexpression ("_data%d_".printf (block_id));
-                               if (expr_owned || delegate_type.is_called_once) {
-                                       var ref_call = new CCodeFunctionCall (new CCodeIdentifier ("block%d_data_ref".printf (block_id)));
-                                       ref_call.add_argument (delegate_target);
-                                       delegate_target = ref_call;
-                                       delegate_target_destroy_notify = new CCodeIdentifier ("block%d_data_unref".printf (block_id));
-                               }
-                               return delegate_target;
-                       } else if (get_this_type () != null || in_constructor) {
-                               CCodeExpression delegate_target = get_result_cexpression ("self");
-                               if (expr_owned || delegate_type.is_called_once) {
-                                       if (get_this_type () != null) {
-                                               var ref_call = new CCodeFunctionCall (get_dup_func_expression (get_this_type (), delegate_expr.source_reference));
-                                               ref_call.add_argument (delegate_target);
-                                               delegate_target = ref_call;
-                                               delegate_target_destroy_notify = get_destroy_func_expression (get_this_type ());
-                                       } else {
-                                               // in constructor
-                                               var ref_call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_ref"));
-                                               ref_call.add_argument (delegate_target);
-                                               delegate_target = ref_call;
-                                               delegate_target_destroy_notify = new CCodeIdentifier ("g_object_unref");
-                                       }
-                               }
-                               return delegate_target;
-                       } else {
-                               return new CCodeConstant ("NULL");
+               if (delegate_expr is MethodCall || delegate_expr is LambdaExpression) {
+                       if (get_delegate_target_destroy_notify (delegate_expr) != null) {
+                               delegate_target_destroy_notify = get_delegate_target_destroy_notify (delegate_expr);
                        }
+                       return get_delegate_target (delegate_expr);
                } else if (delegate_expr.symbol_reference != null) {
                        if (delegate_expr.symbol_reference is FormalParameter) {
                                var param = (FormalParameter) delegate_expr.symbol_reference;