[vala] codegen: Zero length of arrays when transferring ownership



commit bdf572331bcca90f192d50cb79d97ca67ac43d90
Author: Luca Bruno <lucabru src gnome org>
Date:   Sun Nov 24 11:50:44 2013 +0100

    codegen: Zero length of arrays when transferring ownership
    
    This allows var data = (owned) aGenericArray.data;
    without later setting data.len = 0 manually.

 codegen/valaccodebasemodule.vala |   12 +++++++++++-
 tests/basic-types/arrays.vala    |    5 ++++-
 2 files changed, 15 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 1d7a571..bc7411a 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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) {
diff --git a/tests/basic-types/arrays.vala b/tests/basic-types/arrays.vala
index be0ca23..4a6a006 100644
--- a/tests/basic-types/arrays.vala
+++ b/tests/basic-types/arrays.vala
@@ -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 ();
 }
-


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]