]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use Expression.target_type/value_type in visit_cast_expression()
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 14 Nov 2020 11:23:24 +0000 (12:23 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 14 Nov 2020 14:57:22 +0000 (15:57 +0100)
CastExpression.type_reference is meant to hold the actual target type.

codegen/valaccodebasemodule.vala
codegen/valagvaluemodule.vala
codegen/valagvariantmodule.vala

index 9a801e36986d26fe98ccff3d133d6a0643a548de..41736e5280e6bb68c1578ff2dd8304cd770d8258 100644 (file)
@@ -5330,12 +5330,15 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        return;
                }
 
+               unowned DataType? value_type = expr.inner.value_type;
+               unowned DataType? target_type = expr.target_type;
+
                generate_type_declaration (expr.type_reference, cfile);
 
                // 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) {
-                       if (array_type.element_type is GenericType || ((ArrayType) expr.inner.value_type).element_type is GenericType) {
+               unowned ArrayType array_type = target_type as ArrayType;
+               if (array_type != null && value_type is ArrayType) {
+                       if (array_type.element_type is GenericType || ((ArrayType) 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));
@@ -5345,7 +5348,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                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)));
+                               sizeof_from.add_argument (new CCodeConstant (get_ccode_name (((ArrayType) 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));
@@ -5358,7 +5361,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        sizeof_to.add_argument (new CCodeConstant (get_ccode_name (array_type.element_type)));
                        var sizeof_from = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
 
-                       var value_type = expr.inner.value_type;
                        if (value_type is ValueType) {
                                sizeof_from.add_argument (new CCodeConstant (get_ccode_name (value_type.type_symbol)));
                                array_length_expr = new CCodeBinaryExpression (CCodeBinaryOperator.DIV, sizeof_from, sizeof_to);
@@ -5377,22 +5379,22 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                }
 
                var innercexpr = get_cvalue (expr.inner);
-               if (expr.type_reference is ValueType && !expr.type_reference.nullable &&
-                       expr.inner.value_type is ValueType && expr.inner.value_type.nullable) {
+               if (target_type is ValueType && !target_type.nullable &&
+                       value_type is ValueType && value_type.nullable) {
                        // nullable integer or float or boolean or struct or enum cast to non-nullable
                        innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, innercexpr);
-               } else if (expr.type_reference is ValueType && expr.type_reference.nullable &&
-                       expr.inner.value_type.is_real_non_null_struct_type ()) {
+               } else if (target_type is ValueType && target_type.nullable &&
+                       value_type.is_real_non_null_struct_type ()) {
                        // real non-null struct cast to nullable
                        innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, innercexpr);
-               } else if (expr.type_reference is ArrayType && !(expr.inner is Literal)
-                   && expr.inner.value_type is ValueType && !expr.inner.value_type.nullable) {
+               } else if (target_type is ArrayType && !(expr.inner is Literal)
+                   && value_type is ValueType && !value_type.nullable) {
                        // integer or float or boolean or struct or enum to array cast
                        innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, innercexpr);
                }
                set_cvalue (expr, new CCodeCastExpression (innercexpr, get_ccode_name (expr.type_reference)));
 
-               if (expr.type_reference is DelegateType) {
+               if (target_type is DelegateType) {
                        var target = get_delegate_target (expr.inner);
                        if (target != null) {
                                set_delegate_target (expr, target);
index 0429085e6b44b8f1a1182759a1caa53bb28ced3f..2b13d473d814ce1d577edce903bd3865af5ec0af 100644 (file)
@@ -23,7 +23,7 @@
 public class Vala.GValueModule : GAsyncModule {
        public override void visit_cast_expression (CastExpression expr) {
                unowned DataType? value_type = expr.inner.value_type;
-               unowned DataType? target_type = expr.type_reference;
+               unowned DataType? target_type = expr.target_type;
 
                if (expr.is_non_null_cast || value_type == null || gvalue_type == null
                    || value_type.type_symbol != gvalue_type || target_type.type_symbol == gvalue_type
index 03a7193aa38e10fd82511d6428477283c1affc42..5190efd9c5b63bb3ed363b44782798aa7188f6fc 100644 (file)
@@ -104,7 +104,7 @@ public class Vala.GVariantModule : GValueModule {
 
        public override void visit_cast_expression (CastExpression expr) {
                var value = expr.inner.target_value;
-               var target_type = expr.type_reference;
+               unowned DataType? target_type = expr.target_type;
 
                if (expr.is_non_null_cast || value.value_type == null || gvariant_type == null || value.value_type.type_symbol != gvariant_type) {
                        base.visit_cast_expression (expr);