]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Zero length of arrays when transferring ownership
authorLuca Bruno <lucabru@src.gnome.org>
Sun, 24 Nov 2013 10:50:44 +0000 (11:50 +0100)
committerLuca Bruno <lucabru@src.gnome.org>
Sun, 24 Nov 2013 10:52:58 +0000 (11:52 +0100)
This allows var data = (owned) aGenericArray.data;
without later setting data.len = 0 manually.

codegen/valaccodebasemodule.vala
tests/basic-types/arrays.vala

index 1d7a5715ff6b27a4ba446721d9b806e2b5d9da8b..bc7411aad5827774f8da70b76720f088b3605548 100644 (file)
@@ -5139,9 +5139,19 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        if (target_destroy_notify != null) {
                                ccode.add_assignment (target_destroy_notify, new CCodeConstant ("NULL"));
                        }
+               } else if (expr.inner.value_type is ArrayType) {
+                       var array_type = (ArrayType) expr.inner.value_type;
+                       var glib_value = (GLibValue) expr.inner.target_value;
+
+                       ccode.add_assignment (get_cvalue (expr.inner), new CCodeConstant ("NULL"));
+                       if (glib_value.array_length_cvalues != null) {
+                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                       ccode.add_assignment (get_array_length_cvalue (glib_value, dim), new CCodeConstant ("0"));
+                               }
+                       }
                } else {
                        ccode.add_assignment (get_cvalue (expr.inner), new CCodeConstant ("NULL"));
-               }
+               }                       
        }
 
        public override void visit_binary_expression (BinaryExpression expr) {
index be0ca236f0c4beffe6fdcffd02708828d17359ca..4a6a006ec9f3f7d51f0a31b92feeb04072784c52 100644 (file)
@@ -96,6 +96,10 @@ void test_static_array () {
 void test_reference_transfer () {
        var baz = (owned) foo;
        baz = (owned) bar;
+
+       var data = new string[]{"foo"};
+       var data2 = (owned) data;
+       assert (data.length == 0);
 }
 
 void test_length_assignment () {
@@ -121,4 +125,3 @@ void main () {
        test_length_assignment ();
        test_inline_array ();
 }
-