/* valaccodeunaryexpression.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2009 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
} else if (operator == CCodeUnaryOperator.BITWISE_COMPLEMENT) {
writer.write_string ("~");
} else if (operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
+ var inner_unary = inner as CCodeUnaryExpression;
+ if (inner_unary != null && inner_unary.operator == CCodeUnaryOperator.ADDRESS_OF) {
+ // simplify expression
+ inner_unary.inner.write (writer);
+ return;
+ }
writer.write_string ("*");
} else if (operator == CCodeUnaryOperator.ADDRESS_OF) {
+ var inner_unary = inner as CCodeUnaryExpression;
+ if (inner_unary != null && inner_unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
+ // simplify expression
+ inner_unary.inner.write (writer);
+ return;
+ }
writer.write_string ("&");
} else if (operator == CCodeUnaryOperator.PREFIX_INCREMENT) {
writer.write_string ("++");
var type_as_struct = p.parameter_type.data_type as Struct;
if (p.direction != ParameterDirection.IN
|| (type_as_struct != null && !type_as_struct.is_simple_type () && !p.parameter_type.nullable)) {
- expr.ccodenode = new CCodeIdentifier ("(*%s)".printf (get_variable_cname (p.name)));
+ expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_variable_cname (p.name)));
} else {
// Property setters of non simple structs shall replace all occurences
// of the "value" formal parameter with a dereferencing version of that
current_property_accessor.value_parameter == p &&
current_property_accessor.prop.property_type.is_real_struct_type () &&
!current_property_accessor.prop.property_type.nullable) {
- expr.ccodenode = new CCodeIdentifier ("(*value)");
+ expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("value"));
} else {
expr.ccodenode = get_variable_cexpression (p.name);
}