]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix length access to multidimensional arrays and access to array fields
authorLuca Bruno <lucabru@src.gnome.org>
Thu, 8 Sep 2011 07:31:26 +0000 (09:31 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Thu, 8 Sep 2011 07:33:58 +0000 (09:33 +0200)
vala/valaelementaccess.vala
vala/valamemberaccess.vala

index 684d6e0c61e630c1e9ccc503e53ef27bb8297108..70a46a8267cba9e7e87d86a757db7b318fc1677e 100644 (file)
@@ -141,6 +141,19 @@ public class Vala.ElementAccess : Expression {
                        value_type = array_type.element_type.copy ();
                        if (!lvalue) {
                                value_type.value_owned = false;
+                       } else {
+                               var ma = container as MemberAccess;
+                               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 ();
+                               } 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 ();
+                               }
                        }
 
                        if (array_type.rank < get_indices ().size) {
index 1ec08dac3fa9025c858e4fb3c3bb24a2d2d80b15..5968e688bd30dbd8509076bbd7f7bc664316147e 100644 (file)
@@ -817,7 +817,7 @@ public class Vala.MemberAccess : Expression {
                return !error;
        }
 
-       private void check_lvalue_struct_access () {
+       public void check_lvalue_struct_access () {
                if (inner == null) {
                        return;
                }