[vala] codegen: Zero length of arrays when transferring ownership
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Zero length of arrays when transferring ownership
- Date: Sun, 24 Nov 2013 10:53:26 +0000 (UTC)
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]