[vala: 5/8] codegen: Use Expression.target_type/value_type in visit_cast_expression()
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala: 5/8] codegen: Use Expression.target_type/value_type in visit_cast_expression()
- Date: Sat, 14 Nov 2020 15:01:58 +0000 (UTC)
commit 4f560d0bb2753bed14b2f0688f2d3e686a39d6ca
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]