]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use append_array_size for out and ref arguments
authorJürg Billeter <j@bitron.ch>
Sun, 17 Oct 2010 15:30:11 +0000 (17:30 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 17 Oct 2010 15:30:11 +0000 (17:30 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valaccodemethodcallmodule.vala

index 4c11d4e48c794489ccf9489ff21311a111a32e10..14f0aaf956c2979bce1d3eb2ed3cc641024f7a2e 100644 (file)
@@ -159,7 +159,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                if (array_expr is UnaryExpression) {
                        var unary_expr = (UnaryExpression) array_expr;
                        if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
-                               array_expr = unary_expr.inner;
                                is_out = true;
                        }
                } else if (array_expr is ReferenceTransferExpression) {
@@ -169,12 +168,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                
                List<CCodeExpression> size = get_array_sizes (array_expr);
                if (size != null && size.size >= dim) {
-                       if (is_out) {
-                               // passing array as out/ref
-                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, size[dim - 1]);
-                       } else {
-                               return size[dim - 1];
-                       }
+                       return size[dim - 1];
                }
 
                if (!is_out) {
index 9d4ce74815b2fd59ecb2dab75b108f3d6581c71e..40b94b2f130774e28fc3d6f9acaddff5868527d8 100644 (file)
@@ -4376,6 +4376,28 @@ public class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        public override void visit_unary_expression (UnaryExpression expr) {
+               if (expr.operator == UnaryOperator.REF || expr.operator == UnaryOperator.OUT) {
+                       set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (expr.inner)));
+
+                       var array_type = expr.value_type as ArrayType;
+                       if (array_type != null) {
+                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                       append_array_size (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_length_cexpression (expr.inner, dim)));
+                               }
+                       }
+
+                       var delegate_type = expr.value_type as DelegateType;
+                       if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+                               CCodeExpression target_destroy_notify;
+                               set_delegate_target (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_delegate_target_cexpression (expr.inner, out target_destroy_notify)));
+                               if (target_destroy_notify != null) {
+                                       set_delegate_target_destroy_notify (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_destroy_notify));
+                               }
+                       }
+
+                       return;
+               }
+
                CCodeUnaryOperator op;
                if (expr.operator == UnaryOperator.PLUS) {
                        op = CCodeUnaryOperator.PLUS;
@@ -4389,10 +4411,6 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        op = CCodeUnaryOperator.PREFIX_INCREMENT;
                } else if (expr.operator == UnaryOperator.DECREMENT) {
                        op = CCodeUnaryOperator.PREFIX_DECREMENT;
-               } else if (expr.operator == UnaryOperator.REF) {
-                       op = CCodeUnaryOperator.ADDRESS_OF;
-               } else if (expr.operator == UnaryOperator.OUT) {
-                       op = CCodeUnaryOperator.ADDRESS_OF;
                } else {
                        assert_not_reached ();
                }
index 4ec1dfe6ae9108326053fd08a9bb46538f1f2ddd..c1259c45c257c99d517f21239b2352c3a3c9a194 100644 (file)
@@ -129,20 +129,8 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
        }
 
        public override CCodeExpression get_delegate_target_cexpression (Expression delegate_expr, out CCodeExpression delegate_target_destroy_notify) {
-               bool is_out = false;
-       
                delegate_target_destroy_notify = new CCodeConstant ("NULL");
 
-               if (delegate_expr is UnaryExpression) {
-                       var unary_expr = (UnaryExpression) delegate_expr;
-                       if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
-                               delegate_expr = unary_expr.inner;
-                               is_out = true;
-                       }
-               }
-
-               bool expr_owned = delegate_expr.value_type.value_owned;
-
                if (delegate_expr is ReferenceTransferExpression) {
                        var reftransfer_expr = (ReferenceTransferExpression) delegate_expr;
                        delegate_expr = reftransfer_expr.inner;
@@ -154,12 +142,6 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                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;
                }
index 2aeca597b030c42582090b3f2bf60f00dad23e16..e6010302bda537d2dfabd64332b2f289765c3933 100644 (file)
@@ -391,6 +391,8 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                                cexpr = handle_struct_argument (param, arg, cexpr);
                                        } else {
+                                               arg.target_value = null;
+
                                                var temp_var = get_temp_variable (param.variable_type, param.variable_type.value_owned);
                                                emit_temp_var (temp_var);
                                                set_cvalue (arg, get_variable_cexpression (temp_var.name));