public TargetValue store_temp_value (TargetValue initializer, CodeNode node_reference, bool? value_owned = null) {
var lvalue = create_temp_value (initializer.value_type, false, node_reference, value_owned);
store_value (lvalue, initializer, node_reference.source_reference);
- if (lvalue.value_type is ArrayType) {
- stdout.printf ("%s tweaked\n", node_reference.to_string ());
- /*((GLibValue) lvalue).array_length_cvalues = null;
- ((GLibValue) lvalue).array_size_cvalue = null;
- ((GLibValue) lvalue).array_length_cexpr = null;*/
- }
return load_temp_value (lvalue);
}
}
public override void visit_sizeof_expression (SizeofExpression expr) {
- // FIXME
- if (expr.value_type == null) {
- warning ("BAD %s\n", expr.to_string ());
- expr.value_type = context.analyzer.ulong_type.copy ();
- }
-
generate_type_declaration (expr.type_reference, cfile);
var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
}
public override void visit_unary_expression (UnaryExpression expr) {
- assert (expr.checked);
if (expr.operator == UnaryOperator.REF || expr.operator == UnaryOperator.OUT) {
var glib_value = (GLibValue) expr.inner.target_value;
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
- 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) {
+ 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) {
// 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));
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) value_type).element_type)));
+ 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));
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);
}
var innercexpr = get_cvalue (expr.inner);
- if (target_type is ValueType && !target_type.nullable &&
- value_type is ValueType && value_type.nullable) {
+ if (expr.type_reference is ValueType && !expr.type_reference.nullable &&
+ expr.inner.value_type is ValueType && expr.inner.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 (target_type is ValueType && target_type.nullable &&
- value_type.is_real_non_null_struct_type ()) {
+ } else if (expr.type_reference is ValueType && expr.type_reference.nullable &&
+ expr.inner.value_type.is_real_non_null_struct_type ()) {
// real non-null struct cast to nullable
innercexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, innercexpr);
- } else if (target_type is ArrayType && !(expr.inner is Literal)
- && value_type is ValueType && !value_type.nullable) {
+ } else if (expr.type_reference is ArrayType && !(expr.inner is Literal)
+ && expr.inner.value_type is ValueType && !expr.inner.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 (target_type is DelegateType) {
+ if (expr.type_reference is DelegateType) {
var target = get_delegate_target (expr.inner);
if (target != null) {
set_delegate_target (expr, target);
}
public override void visit_type_check (TypeCheck expr) {
- assert (expr.checked);
- // FIXME
- if (expr.value_type == null) {
- warning ("BAD %s\n", expr.to_string ());
- expr.value_type = context.analyzer.bool_type.copy ();
- }
-
generate_type_declaration (expr.type_reference, cfile);
var type = expr.expression.value_type;
var temp_var = get_temp_variable (param.variable_type, param.variable_type.value_owned, null, true);
emit_temp_var (temp_var);
set_cvalue (arg, get_variable_cexpression (temp_var.name));
- stdout.printf ("%s.%s\n", param.parent_symbol.to_string (), param.name);
- arg.target_value.value_type = arg.target_type.copy ();
+ arg.target_value.value_type = arg.target_type;
cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (arg));
var temp_var = get_temp_variable (arg.value_type, arg.value_type.value_owned, null, true);
emit_temp_var (temp_var);
set_cvalue (arg, get_variable_cexpression (temp_var.name));
- arg.target_value.value_type = arg.value_type.copy ();
+ arg.target_value.value_type = arg.value_type;
if (arg.value_type is DelegateType && ((DelegateType) arg.value_type).delegate_symbol.has_target) {
// Initialize target/destroy cvalues to allow assignment of delegates from varargs
public CCodeExpression? delegate_target_cvalue;
public CCodeExpression? delegate_target_destroy_notify_cvalue;
- public GLibValue (DataType value_type, CCodeExpression? cvalue = null, bool lvalue = false) {
+ public GLibValue (DataType? value_type = null, CCodeExpression? cvalue = null, bool lvalue = false) {
base (value_type);
this.cvalue = cvalue;
this.lvalue = lvalue;
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.target_type;
+ unowned DataType? target_type = expr.type_reference;
if (expr.is_non_null_cast || value_type == null || gvalue_type == null
|| value_type.type_symbol != gvalue_type || target_type.type_symbol == gvalue_type
public override void visit_cast_expression (CastExpression expr) {
var value = expr.inner.target_value;
- unowned DataType? target_type = expr.target_type;
+ var target_type = expr.type_reference;
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);
Report.error (source_reference, "Base access invalid without base type");
return false;
}
- value_type = context.analyzer.current_struct.base_type.copy ();
+ value_type = context.analyzer.current_struct.base_type;
} else if (context.analyzer.current_class.base_class == null) {
error = true;
Report.error (source_reference, "Base access invalid without base class");
}
} else if (right.value_type is PointerType) {
// pointer arithmetic: pointer - pointer
- value_type = context.analyzer.size_t_type.copy ();
+ value_type = context.analyzer.size_t_type;
}
} else {
left.target_type.nullable = false;
right.target_type.nullable = false;
}
- value_type = context.analyzer.bool_type.copy ();
+ value_type = context.analyzer.bool_type;
break;
case BinaryOperator.EQUALITY:
case BinaryOperator.INEQUALITY:
right.target_type.nullable = true;
}
- value_type = context.analyzer.bool_type.copy ();
+ value_type = context.analyzer.bool_type;
break;
case BinaryOperator.BITWISE_AND:
case BinaryOperator.BITWISE_OR:
left.target_type.nullable = false;
right.target_type.nullable = false;
- value_type = context.analyzer.bool_type.copy ();
+ value_type = context.analyzer.bool_type;
break;
case BinaryOperator.IN:
if (left.value_type.compatible (context.analyzer.int_type)
return contains_call.check (context);
}
- value_type = context.analyzer.bool_type.copy ();
+ value_type = context.analyzer.bool_type;
break;
default:
error = true;
checked = true;
- value_type = context.analyzer.bool_type.copy ();
+ value_type = context.analyzer.bool_type;
return !error;
}
return temp_access.check (context);
}
- value_type = type_reference.copy ();
+ value_type = type_reference;
value_type.value_owned = inner.value_type.value_owned;
value_type.floating_reference = inner.value_type.floating_reference;
index_int_type_check = false;
symbol_reference = container.symbol_reference;
- value_type = container.value_type.copy ();
+ value_type = container.value_type;
} else {
if (lvalue) {
var set_method = container.value_type.get_member ("set") as Method;
if (source_reference != null) {
context.analyzer.current_source_file = source_reference.file;
}
-
- if (parent_symbol == null) {
- stdout.printf ("%s\n", name);
- assert_not_reached ();
- }
context.analyzer.current_symbol = parent_symbol;
if (variable_type != null) {
Report.error (source_reference, "Pointer indirection not supported for this expression");
return false;
}
- value_type = pointer_type.base_type.copy ();
+ value_type = pointer_type.base_type;
} else {
error = true;
Report.error (source_reference, "Pointer indirection not supported for this expression");
type_reference.check (context);
- value_type = context.analyzer.ulong_type.copy ();
+ value_type = context.analyzer.ulong_type;
return !error;
}
*/
public abstract class Vala.TargetValue {
- public DataType value_type { get; set; }
+ public DataType? value_type { get; set; }
public DataType? actual_value_type { get; set; }
- protected TargetValue (DataType value_type) {
+ protected TargetValue (DataType? value_type) {
this.value_type = value_type;
}
}
Report.warning (_data_type.source_reference, "Type argument list has no effect");
}
- value_type = context.analyzer.bool_type.copy ();
+ value_type = context.analyzer.bool_type;
return !error;
}
type_reference.check (context);
- value_type = context.analyzer.type_type.copy ();
+ value_type = context.analyzer.type_type;
if (context.profile == Profile.GOBJECT && type_reference.has_type_arguments ()) {
Report.warning (_data_type.source_reference, "Type argument list without effect");
return false;
}
- value_type = inner.value_type.copy ();
+ value_type = inner.value_type;
break;
case UnaryOperator.LOGICAL_NEGATION:
// boolean type
return false;
}
- value_type = inner.value_type.copy ();
+ value_type = inner.value_type;
break;
case UnaryOperator.BITWISE_COMPLEMENT:
// integer type
return false;
}
- value_type = inner.value_type.copy ();
+ value_type = inner.value_type;
break;
case UnaryOperator.INCREMENT:
case UnaryOperator.DECREMENT:
return false;
}
- value_type = inner.value_type.copy ();
+ value_type = inner.value_type;
break;
case UnaryOperator.REF:
case UnaryOperator.OUT:
(ea != null && ea.container.value_type is ArrayType)) {
// ref and out can only be used with fields, parameters, local variables, and array element access
lvalue = true;
- value_type = inner.value_type.copy ();
+ value_type = inner.value_type;
} else {
error = true;
Report.error (source_reference, "ref and out method arguments can only be used with fields, parameters, local variables, and array element access");