From: Jürg Billeter Date: Sat, 10 Nov 2012 16:46:25 +0000 (+0100) Subject: codegen: Retain array length for cast from/to generic array X-Git-Tag: 0.18.1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4d0b43393e5424aa3672067803a0afd3e33ab18;p=thirdparty%2Fvala.git codegen: Retain array length for cast from/to generic array Fixes bug 687728. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 62d1d8a0a..03f801a75 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5025,14 +5025,21 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { // 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))); + if (array_type.element_type is GenericType || ((ArrayType) expr.inner.value_type).element_type is GenericType) { + // element size unknown for generic arrays, retain array length as is + for (int dim = 1; dim <= array_type.rank; dim++) { + append_array_length (expr, get_array_length_cexpression (expr.inner, dim)); + } + } else { + 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))); + 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, new CCodeBinaryExpression (CCodeBinaryOperator.DIV, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, get_array_length_cexpression (expr.inner, dim), sizeof_from), sizeof_to)); + for (int dim = 1; dim <= array_type.rank; 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