From: Luca Bruno Date: Sun, 24 Nov 2013 10:50:44 +0000 (+0100) Subject: codegen: Zero length of arrays when transferring ownership X-Git-Tag: 0.23.1~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bdf572331bcca90f192d50cb79d97ca67ac43d90;p=thirdparty%2Fvala.git codegen: Zero length of arrays when transferring ownership This allows var data = (owned) aGenericArray.data; without later setting data.len = 0 manually. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 1d7a5715f..bc7411aad 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 be0ca236f..4a6a006ec 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 (); } -