]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Retain array length across casts
authorJürg Billeter <j@bitron.ch>
Wed, 29 Jul 2009 21:29:09 +0000 (23:29 +0200)
committerJürg Billeter <j@bitron.ch>
Wed, 29 Jul 2009 21:29:09 +0000 (23:29 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala

index ceba7d6a3eb3eed58346f145d02419417ce83802..fbc17a68fbf8bf16a02739774e7839f0adb7ec49 100644 (file)
@@ -161,9 +161,8 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        Gee.List<Expression> size = ((ArrayCreationExpression) array_expr).get_sizes ();
                        var length_expr = size[dim - 1];
                        return (CCodeExpression) get_ccodenode (length_expr);
-               } else if (array_expr is MethodCall) {
-                       var invocation_expr = (MethodCall) array_expr;
-                       Gee.List<CCodeExpression> size = invocation_expr.get_array_sizes ();
+               } else if (array_expr is MethodCall || array_expr is CastExpression) {
+                       Gee.List<CCodeExpression> size = array_expr.get_array_sizes ();
                        return size[dim - 1];
                } else if (array_expr.symbol_reference != null) {
                        if (array_expr.symbol_reference is FormalParameter) {
index ac5769dab479b97876d70c56f60555bcfd5993e5..756275e9198018c228666d19f10d738ade149b8e 100644 (file)
@@ -3391,6 +3391,15 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                Report.error (expr.source_reference, "Operation not supported for this type");
                                return;
                        }
+
+                       // retain array length
+                       var array_type = expr.type_reference as ArrayType;
+                       if (array_type != null) {
+                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                       expr.append_array_size (get_array_length_cexpression (expr.inner, dim));
+                               }
+                       }
+
                        expr.ccodenode = new CCodeCastExpression ((CCodeExpression) expr.inner.ccodenode, expr.type_reference.get_cname ());
                }
        }