]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use set_delegate_target for method access
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 16:27:24 +0000 (18:27 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 16:35:45 +0000 (18:35 +0200)
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valaccodememberaccessmodule.vala

index 6bf4ea63b509791d7a94e0684e72f0af638f452b..f446ed1acb640be404fa885101e41fbac7610b82 100644 (file)
@@ -5738,7 +5738,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                return glib_value.delegate_target;
        }
 
-       public void set_delegate_target (Expression expr, CCodeExpression delegate_target) {
+       public void set_delegate_target (Expression expr, CCodeExpression? delegate_target) {
                var glib_value = (GLibValue) expr.target_value;
                if (glib_value == null) {
                        glib_value = new GLibValue ();
index 834b98273255da136a6af4b0edb73ea41bc55083..4ec1dfe6ae9108326053fd08a9bb46538f1f2ddd 100644 (file)
@@ -148,55 +148,21 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                        delegate_expr = reftransfer_expr.inner;
                }
                
-               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 || delegate_expr.symbol_reference is LocalVariable || delegate_expr.symbol_reference is Field) {
-                               if (get_delegate_target_destroy_notify (delegate_expr) != null) {
-                                       delegate_target_destroy_notify = get_delegate_target_destroy_notify (delegate_expr);
-                               }
-                               var target_expr = get_delegate_target (delegate_expr);
-                               if (is_out) {
-                                       // passing delegate as out/ref
-                                       if (expr_owned) {
-                                               delegate_target_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, delegate_target_destroy_notify);
-                                       }
-                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
-                               } else {
-                                       return target_expr;
-                               }
-                       } else if (delegate_expr.symbol_reference is Method) {
-                               var m = (Method) delegate_expr.symbol_reference;
-                               var ma = (MemberAccess) delegate_expr;
-                               if (m.binding == MemberBinding.STATIC) {
-                                       return new CCodeConstant ("NULL");
-                               } else if (m.is_async_callback) {
-                                       if (current_method.closure) {
-                                               var block = ((Method) m.parent_symbol).body;
-                                               return new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), "_async_data_");
-                                       } else {
-                                               return new CCodeIdentifier ("data");
-                                       }
-                               } else {
-                                       var delegate_target = (CCodeExpression) get_ccodenode (ma.inner);
-                                       var delegate_type = delegate_expr.target_type as DelegateType;
-                                       if ((expr_owned || (delegate_type != null && delegate_type.is_called_once)) && ma.inner.value_type.data_type != null && ma.inner.value_type.data_type.is_reference_counting ()) {
-                                               var ref_call = new CCodeFunctionCall (get_dup_func_expression (ma.inner.value_type, delegate_expr.source_reference));
-                                               ref_call.add_argument (delegate_target);
-                                               delegate_target = ref_call;
-                                               delegate_target_destroy_notify = get_destroy_func_expression (ma.inner.value_type);
-                                       }
-                                       return delegate_target;
-                               }
-                       } else if (delegate_expr.symbol_reference is Property) {
-                               return get_delegate_target (delegate_expr);
+               if (get_delegate_target_destroy_notify (delegate_expr) != null) {
+                       delegate_target_destroy_notify = get_delegate_target_destroy_notify (delegate_expr);
+               }
+               var target_expr = get_delegate_target (delegate_expr);
+               if (target_expr == null) {
+                       return new CCodeConstant ("NULL");
+               } else if (is_out) {
+                       // passing delegate as out/ref
+                       if (expr_owned) {
+                               delegate_target_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, delegate_target_destroy_notify);
                        }
+                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
+               } else {
+                       return target_expr;
                }
-
-               return new CCodeConstant ("NULL");
        }
 
        public override string get_delegate_target_destroy_notify_cname (string delegate_cname) {
index 5f5a50d1bc1d4178874743e8192c49b7b05d771f..110341aacf0da6eb024205c483dcc337c6e9c480 100644 (file)
@@ -90,6 +90,29 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        } else {
                                set_cvalue (expr, new CCodeIdentifier (m.get_cname ()));
                        }
+
+                       if (expr.target_type is DelegateType) {
+                               if (m.binding == MemberBinding.STATIC) {
+                                       set_delegate_target (expr, new CCodeConstant ("NULL"));
+                               } else if (m.is_async_callback) {
+                                       if (current_method.closure) {
+                                               var block = ((Method) m.parent_symbol).body;
+                                               set_delegate_target (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), "_async_data_"));
+                                       } else {
+                                               set_delegate_target (expr, new CCodeIdentifier ("data"));
+                                       }
+                               } else {
+                                       var delegate_target = (CCodeExpression) get_ccodenode (expr.inner);
+                                       var delegate_type = expr.target_type as DelegateType;
+                                       if ((expr.value_type.value_owned || (delegate_type != null && delegate_type.is_called_once)) && expr.inner.value_type.data_type != null && expr.inner.value_type.data_type.is_reference_counting ()) {
+                                               var ref_call = new CCodeFunctionCall (get_dup_func_expression (expr.inner.value_type, expr.source_reference));
+                                               ref_call.add_argument (delegate_target);
+                                               delegate_target = ref_call;
+                                               set_delegate_target_destroy_notify (expr, get_destroy_func_expression (expr.inner.value_type));
+                                       }
+                                       set_delegate_target (expr, delegate_target);
+                               }
+                       }
                } else if (expr.symbol_reference is ArrayLengthField) {
                        if (expr.value_type is ArrayType && !(expr.parent_node is ElementAccess)) {
                                Report.error (expr.source_reference, "unsupported use of length field of multi-dimensional array");