[vala/staging] codegen: Use Expression.target_type/value_type in visit_cast_expression()



commit bd5f6461ccc65224ff1d09d6b68e25961c303622
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sat Nov 14 12:23:24 2020 +0100

    codegen: Use Expression.target_type/value_type in visit_cast_expression()
    
    CastExpression.type_reference is meant to hold the actual target type.

 codegen/valaccodebasemodule.vala | 26 ++++++++++++++------------
 codegen/valagvaluemodule.vala    |  2 +-
 codegen/valagvariantmodule.vala  |  2 +-
 3 files changed, 16 insertions(+), 14 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 9a801e369..41736e528 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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);
diff --git a/codegen/valagvaluemodule.vala b/codegen/valagvaluemodule.vala
index 0429085e6..2b13d473d 100644
--- a/codegen/valagvaluemodule.vala
+++ b/codegen/valagvaluemodule.vala
@@ -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
diff --git a/codegen/valagvariantmodule.vala b/codegen/valagvariantmodule.vala
index 03a7193aa..5190efd9c 100644
--- a/codegen/valagvariantmodule.vala
+++ b/codegen/valagvariantmodule.vala
@@ -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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]