]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use append_array_size for reference transfer expressions
authorJürg Billeter <j@bitron.ch>
Sun, 17 Oct 2010 15:36:02 +0000 (17:36 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 17 Oct 2010 15:36:02 +0000 (17:36 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala

index 14f0aaf956c2979bce1d3eb2ed3cc641024f7a2e..e57793eea7b852640e68824d716bbbb6d3ad4141 100644 (file)
@@ -161,9 +161,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
                                is_out = true;
                        }
-               } else if (array_expr is ReferenceTransferExpression) {
-                       var reftransfer_expr = (ReferenceTransferExpression) array_expr;
-                       array_expr = reftransfer_expr.inner;
                }
                
                List<CCodeExpression> size = get_array_sizes (array_expr);
index c5b1eb9efb6c1780b09f5df853764e19f1e2c507..f5a55a105b760b23a2c68fa005a34735d9b94287 100644 (file)
@@ -4611,6 +4611,22 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                ccode.add_expression (new CCodeAssignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")));
 
                set_cvalue (expr, cvar);
+
+               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, 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, get_delegate_target_cexpression (expr.inner, out target_destroy_notify));
+                       if (target_destroy_notify != null) {
+                               set_delegate_target_destroy_notify (expr, target_destroy_notify);
+                       }
+               }
        }
 
        public override void visit_binary_expression (BinaryExpression expr) {
index c1259c45c257c99d517f21239b2352c3a3c9a194..86734f28643ab4115bd2ce9e426579c2c94d523d 100644 (file)
@@ -131,11 +131,6 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
        public override CCodeExpression get_delegate_target_cexpression (Expression delegate_expr, out CCodeExpression delegate_target_destroy_notify) {
                delegate_target_destroy_notify = new CCodeConstant ("NULL");
 
-               if (delegate_expr is ReferenceTransferExpression) {
-                       var reftransfer_expr = (ReferenceTransferExpression) delegate_expr;
-                       delegate_expr = reftransfer_expr.inner;
-               }
-               
                if (get_delegate_target_destroy_notify (delegate_expr) != null) {
                        delegate_target_destroy_notify = get_delegate_target_destroy_notify (delegate_expr);
                }