]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix regression when calling .resize() or .move() on arrays inside structs
authorLuca Bruno <lucabru@src.gnome.org>
Thu, 29 Sep 2011 08:52:06 +0000 (10:52 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 29 Sep 2011 17:26:23 +0000 (19:26 +0200)
The check for lvalue access has been extended to arrays for simplifying
the conditions.

Fixes bug 660426.

tests/Makefile.am
tests/structs/bug660426.vala [new file with mode: 0644]
vala/valaelementaccess.vala
vala/valamemberaccess.vala

index 5c8ddd3115e657b786b7d55d575445884ec3c027..f2384c21060f43884e25a82d9df921b2824591ed 100644 (file)
@@ -74,6 +74,7 @@ TESTS = \
        structs/bug654753.vala \
        structs/bug656693.vala \
        structs/bug658048.vala \
+       structs/bug660426.vala \
        delegates/delegates.vala \
        delegates/bug539166.vala \
        delegates/bug595610.vala \
diff --git a/tests/structs/bug660426.vala b/tests/structs/bug660426.vala
new file mode 100644 (file)
index 0000000..c78e6ed
--- /dev/null
@@ -0,0 +1,9 @@
+struct Foo {
+       int[] bar;
+}
+
+void main () {
+       var f = Foo ();
+       f.bar.resize (10);
+       assert (f.bar.length == 10);
+}
index 70a46a8267cba9e7e87d86a757db7b318fc1677e..58f0e4dd3a3a950177a9f3a425979c577dc35234 100644 (file)
@@ -146,13 +146,13 @@ public class Vala.ElementAccess : Expression {
                                if (context.profile == Profile.GOBJECT && ma != null && ma.symbol_reference is ArrayLengthField) {
                                        // propagate lvalue for gobject length access
                                        ma.inner.lvalue = true;
-                                       ((MemberAccess) ma.inner).check_lvalue_struct_access ();
+                                       ((MemberAccess) ma.inner).check_lvalue_access ();
                                } else if (ma != null && ma.symbol_reference is Field &&
                                        ma.inner != null && ma.inner.symbol_reference is Variable &&
                                        ma.inner.value_type is StructValueType && !ma.inner.value_type.nullable) {
                                        // propagate lvalue if container is a field and container.inner is a struct variable
                                        ma.lvalue = true;
-                                       ma.check_lvalue_struct_access ();
+                                       ma.check_lvalue_access ();
                                }
                        }
 
index 5968e688bd30dbd8509076bbd7f7bc664316147e..64d2b518ad83deb14e905e704e35c41e2a038af4 100644 (file)
@@ -752,11 +752,8 @@ public class Vala.MemberAccess : Expression {
                                inner.value_type = this_parameter.variable_type.copy ();
                                inner.value_type.value_owned = false;
                                inner.symbol_reference = this_parameter;
-                       } else if (context.profile == Profile.GOBJECT && lvalue && member is ArrayLengthField) {
-                               inner.lvalue = true;
-                               ((MemberAccess) inner).check_lvalue_struct_access ();
                        } else {
-                               check_lvalue_struct_access ();
+                               check_lvalue_access ();
                        }
 
                        if (context.experimental_non_null && instance && inner.value_type.nullable &&
@@ -817,7 +814,7 @@ public class Vala.MemberAccess : Expression {
                return !error;
        }
 
-       public void check_lvalue_struct_access () {
+       public void check_lvalue_access () {
                if (inner == null) {
                        return;
                }
@@ -828,11 +825,14 @@ public class Vala.MemberAccess : Expression {
                if (!instance) {
                        instance = symbol_reference is Property && ((Property) symbol_reference).binding == MemberBinding.INSTANCE;
                }
+
                var this_access = inner.symbol_reference is Parameter && inner.symbol_reference.name == "this";
-               if (instance && inner.value_type is StructValueType && !inner.value_type.nullable && (symbol_reference is Method || lvalue) && ((inner is MemberAccess && inner.symbol_reference is Variable) || inner is ElementAccess) && !this_access) {
+               var struct_or_array = (inner.value_type is StructValueType && !inner.value_type.nullable) || (CodeContext.get ().profile == Profile.GOBJECT && inner.value_type is ArrayType);
+
+               if (instance && struct_or_array && (symbol_reference is Method || lvalue) && ((inner is MemberAccess && inner.symbol_reference is Variable) || inner is ElementAccess) && !this_access) {
                        inner.lvalue = true;
                        if (inner is MemberAccess) {
-                               ((MemberAccess) inner).check_lvalue_struct_access ();
+                               ((MemberAccess) inner).check_lvalue_access ();
                        }
                }
        }