if (is_virtual) {
ccode.add_declaration (this_type.get_cname (), new CCodeVariableDeclarator ("self"));
- ccode.add_assignment (new CCodeIdentifier ("self"), transform_expression (new CCodeIdentifier ("base"), base_type, this_type));
+ ccode.add_assignment (new CCodeIdentifier ("self"), get_cvalue_ (transform_value (new GLibValue (base_type, new CCodeIdentifier ("base")), this_type, acc)));
}
acc.body.emit (this);
}
// memory management, implicit casts, and boxing/unboxing
- set_cvalue (expr, transform_expression (get_cvalue (expr), expr.value_type, expr.target_type, expr));
+ if (expr.value_type != null) {
+ // FIXME: temporary workaround, not all target_value have a value_type
+ var old_type = expr.target_value.value_type;
+ expr.target_value.value_type = expr.value_type;
+ set_cvalue (expr, get_cvalue_ (transform_value (expr.target_value, expr.target_type, expr)));
+ expr.target_value.value_type = old_type;
+ }
if (expr.formal_target_type is GenericType && !(expr.target_type is GenericType)) {
if (expr.formal_target_type.type_parameter.parent_symbol != garray_type) {
if (init.symbol_reference is Field) {
var f = (Field) init.symbol_reference;
var instance_target_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
- var typed_inst = transform_expression (instance, expr.type_reference, instance_target_type);
+ var typed_inst = get_cvalue_ (transform_value (new GLibValue (expr.type_reference, instance), instance_target_type, init));
CCodeExpression lhs;
if (expr.type_reference.data_type is Struct) {
lhs = new CCodeMemberAccess (typed_inst, f.get_cname ());
var element_type = array_type.element_type.copy ();
element_type.value_owned = false;
- element_expr = transform_expression (element_expr, element_type, stmt.type_reference);
+ element_expr = get_cvalue_ (transform_value (new GLibValue (element_type, element_expr), stmt.type_reference, stmt));
visit_local_variable (stmt.element_variable);
ccode.add_assignment (get_variable_cexpression (stmt.variable_name), element_expr);
var element_data_type = collection_type.get_type_arguments ().get (0).copy ();
element_data_type.value_owned = false;
element_expr = convert_from_generic_pointer (element_expr, element_data_type);
- element_expr = transform_expression (element_expr, element_data_type, stmt.type_reference);
+ element_expr = get_cvalue_ (transform_value (new GLibValue (element_data_type, element_expr), stmt.type_reference, stmt));
visit_local_variable (stmt.element_variable);
ccode.add_assignment (get_variable_cexpression (stmt.variable_name), element_expr);
}
// assign new value
- ccode.add_assignment (get_cvalue (unary.inner), transform_expression (get_cvalue (unary), unary.target_type, unary.inner.value_type, arg));
+ var value = ((GLibValue) unary.target_value).copy ();
+ value.value_type = unary.target_type;
+ ccode.add_assignment (get_cvalue (unary.inner), get_cvalue_ (transform_value (value, unary.inner.value_type, arg)));
var array_type = arg.value_type as ArrayType;
if (array_type != null) {
base_expression_type = new ObjectType ((Interface) base_method.parent_symbol);
}
var self_target_type = new ObjectType (cl);
- CCodeExpression cself = transform_expression (new CCodeIdentifier ("base"), base_expression_type, self_target_type);
+ CCodeExpression cself = get_cvalue_ (transform_value (new GLibValue (base_expression_type, new CCodeIdentifier ("base")), self_target_type, m));
ccode.add_declaration ("%s *".printf (cl.get_cname ()), new CCodeVariableDeclarator ("self"));
ccode.add_assignment (new CCodeIdentifier ("self"), cself);
var type_symbol = m.parent_symbol as ObjectTypeSymbol;
var self_target_type = new ObjectType (type_symbol);
- var cself = transform_expression (new CCodeIdentifier ("base"), base_expression_type, self_target_type);
+ var cself = get_cvalue_ (transform_value (new GLibValue (base_expression_type, new CCodeIdentifier ("base")), self_target_type, m));
ccode.add_declaration ("%s *".printf (type_symbol.get_cname ()), new CCodeVariableDeclarator ("self"));
ccode.add_assignment (new CCodeIdentifier ("self"), cself);
}
if (prop.base_property != null) {
var base_type = (Class) prop.base_property.parent_symbol;
base_prop = prop.base_property;
- cself = transform_expression (cself, new ObjectType (cl), new ObjectType (base_type));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_property.get_accessor, cfile);
} else if (prop.base_interface_property != null) {
var base_type = (Interface) prop.base_interface_property.parent_symbol;
base_prop = prop.base_interface_property;
- cself = transform_expression (cself, new ObjectType (cl), new ObjectType (base_type));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_interface_property.get_accessor, cfile);
}
if (prop.base_property != null) {
var base_type = (Class) prop.base_property.parent_symbol;
base_prop = prop.base_property;
- cself = transform_expression (cself, new ObjectType (cl), new ObjectType (base_type));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_property.set_accessor, cfile);
} else if (prop.base_interface_property != null) {
var base_type = (Interface) prop.base_interface_property.parent_symbol;
base_prop = prop.base_interface_property;
- cself = transform_expression (cself, new ObjectType (cl), new ObjectType (base_type));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_interface_property.set_accessor, cfile);
}