Fixes bug 580046.
/* valaccodecommaexpression.vala
*
- * Copyright (C) 2006-2008 Jürg Billeter
+ * Copyright (C) 2006-2010 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
inner.add (expr);
}
+ public void set_expression (int index, CCodeExpression expr) {
+ inner[index] = expr;
+ }
+
public List<CCodeExpression> get_inner () {
return new ReadOnlyList<CCodeExpression> (inner);
}
}
public override void visit_addressof_expression (AddressofExpression expr) {
- expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
+ if (expr.inner.ccodenode is CCodeCommaExpression) {
+ var ccomma = expr.inner.ccodenode as CCodeCommaExpression;
+ var inner = ccomma.get_inner ();
+ var last = inner.get (inner.size - 1);
+ ccomma.set_expression (inner.size - 1, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) last));
+ expr.ccodenode = ccomma;
+ } else {
+ expr.ccodenode = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
+ }
}
public override void visit_reference_transfer_expression (ReferenceTransferExpression expr) {
if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
expr.ccodenode = new CCodeMemberAccess.pointer (inst, f.get_cname ());
} else {
- expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
+ if (inst is CCodeCommaExpression) {
+ var ccomma = inst as CCodeCommaExpression;
+ var inner = ccomma.get_inner ();
+ var last = inner.get (inner.size - 1);
+ ccomma.set_expression (inner.size - 1, new CCodeMemberAccess (last, f.get_cname ()));
+ expr.ccodenode = ccomma;
+ } else {
+ expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
+ }
}
} else if (f.binding == MemberBinding.CLASS) {
var cl = (Class) f.parent_symbol;