]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Recompute length when casting between array types
authorSimon Werbeck <simon.werbeck@gmail.com>
Wed, 18 Jul 2012 20:11:20 +0000 (22:11 +0200)
committerJürg Billeter <j@bitron.ch>
Wed, 1 Aug 2012 10:14:23 +0000 (12:14 +0200)
This patch makes casting, e.g., from int[] to uchar[] work as expected
by adjusting the array length field.

Fixes bug 515408.

codegen/valaccodebasemodule.vala

index ba30e4f1bc249316b86a8617bf333a845ead09e1..a20f783c62083fef2d77167d2c69794f2701e9a5 100644 (file)
@@ -4917,11 +4917,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                return;
                        }
 
-                       // retain array length
+                       // recompute array length when casting to other array type
                        var array_type = expr.type_reference as ArrayType;
                        if (array_type != null && expr.inner.value_type is ArrayType) {
+                               var sizeof_to = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
+                               sizeof_to.add_argument (new CCodeConstant (get_ccode_name (array_type.element_type)));
+
+                               var sizeof_from = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
+                               sizeof_from.add_argument (new CCodeConstant (get_ccode_name (((ArrayType) expr.inner.value_type).element_type)));
+
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       append_array_length (expr, get_array_length_cexpression (expr.inner, dim));
+                                       append_array_length (expr, new CCodeBinaryExpression (CCodeBinaryOperator.DIV, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, get_array_length_cexpression (expr.inner, dim), sizeof_from), sizeof_to));
                                }
                        } else if (array_type != null) {
                                // cast from non-array to array, set invalid length